2014-02-15 53 views
0

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?爲什麼它仍然有價值?我看到它的方式,在這一點上沒有很強的參考,所以它應該被釋放。
我該怎麼辦?

回答

2

ARC

-(NSDictionary *)parseFile:(NSString *)path 
{ 
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"221",@"111", nil]; 
    return dic; 
} 

沒有ARC

-(NSDictionary *)parseFile:(NSString *)path 
{ 
    NSDictionary *dic = [[[NSDictionary alloc] initWithObjectsAndKeys:@"221",@"111", nil] autorelease]; 
    return dic; 
} 

DIC變量是在自動釋放池創建的,所以它不會被釋放直到返回了methodA。

+0

因此,如果dic變量不是方法的返回值,它是否也在autorelease池中創建? –

+0

@ Bau-yin當你從方法返回時,局部變量被從堆棧中移除。所以你必須把它放入autorelease池並返回變量。否則(沒有自動釋放池)返回的值將會是nill。 –

0

您的classB沒有提及字典的引用,它返回parseFile:方法。所以當你將nil設置爲classB時,它不會影響* dic指針。它會在您的methodA結束後發佈

+0

classB沒有字典的引用,是像在Demchenko說的那樣在自動釋放池中創建的? –