ClassA的在ARC的方法的返回值:的對象作爲
@interface ClassA : NSObject
-(void)methodA;
@end
#import "ClassA.h"
@implementation ClassA
-(void)methodA
{
ClassB *classB = [[ClassB alloc] init];
__weak NSDictionary *dic = [classB parseFile:@「AAAA」];
NSLog(@「1:%@",classB);
NSLog(@「2:%@「,dic);
classB = nil;
NSLog(@「3:%@",classB);
NSLog(@「4:%@",dic);
}
@end
ClassB的:
@interface ClassB: NSObject
-(NSDictionary *)parseFile:(NSString *)path;
@end
#import "ClassB.h"
@implementation ClassB
-(NSDictionary *)parseFile:(NSString *)path
{
NSDictionary *dicB = [[NSDictionary alloc] initWithObjectsAndKeys:@"221",@"111", nil];
return dicB;
}
- (void)dealloc
{
}
@end
的NSLog:
2014-02-15 20:46:09.382 LrcTest[4309:70b] 1:<LRCParser: 0x8c12240>
2014-02-15 20:46:09.383 LrcTest[4309:70b] 2:{
111 = 221;
}
2014-02-15 20:46:11.081 LrcTest[4309:70b] 3:(null)
2014-02-15 20:46:11.081 LrcTest[4309:70b] 4:{
111 = 221;
}
問題:
在的NSLog 2,DIC的只有強烈的參考是從classB
。
當classB
設置爲nil
時,它將被解除分配。
在NSLog 4,爲什麼沒有發佈dic?爲什麼它仍然有價值?我看到它的方式,在這一點上沒有很強的參考,所以它應該被釋放。
我該怎麼辦?
因此,如果dic變量不是方法的返回值,它是否也在autorelease池中創建? –
@ Bau-yin當你從方法返回時,局部變量被從堆棧中移除。所以你必須把它放入autorelease池並返回變量。否則(沒有自動釋放池)返回的值將會是nill。 –