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



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

B类:

@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 没有发布?为什么它仍然有价值?在我看来,它目前没有强有力的参考,所以它应该被发布。
我做错了什么?

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 变量是在自动释放池中创建的,因此在从方法 A 返回之前不会释放它。

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

最新更新