该对象作为方法在ARC中的返回值

时间:2014-02-15 13:17:53

标签: ios objective-c automatic-ref-counting

ClassA的:

@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唯一的强引用来自classBclassB设置为nil时,它会被取消分配 在NSLog 4,为什么dic没有发布?为什么它还有价值?我看待它的方式,此时它没有强大的参考,所以它应该被释放 我错了什么?

2 个答案:

答案 0 :(得分: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返回之前不会取消分配。

答案 1 :(得分:0)

您的classB没有通过parseFile:方法返回的字典引用。因此,当您将nil设置为classB时,它不会影响* dic指针。它将在您methodA结束后立即发布