同伴分配的不同之处是什么?

时间:2012-02-24 10:25:38

标签: iphone objective-c ios

方法1:

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:
                         [NSURLRequest requestWithURL:
                          [NSURL URLWithString:appRecord.imageURLString]] delegate:self];
self.imageConnection = conn;
[conn release];

方法2:

self.imageConnection = [[NSURLConnection alloc] initWithRequest:
                        [NSURLRequest requestWithURL:
                         [NSURL URLWithString:appRecord.imageURLString]] delegate:self];

1 个答案:

答案 0 :(得分:4)

答案:这取决于。我假设您的self.imageConnection属性设置为保留。

如果启用了自动引用计数(ARC),则没有什么区别(您需要了解),因为编译器会为您处理内存管理...当然,如果您确实已启用ARC,您只能使用您提供的第二个示例,因为您无法调用release

在非ARC环境中存在很大差异:您发布的第一种方法正确释放内存,第二种方法泄漏它。

要解释一下,如果您将某个属性声明为retain,则顾名思义,它会保留该属性。当你创建NSURLConnection时,你会分配/初始化它,它会保留一次。然后将其分配给self.imageConnection - 这样做会再次增加保留计数。

在您的第一个示例中,您使用了一个临时变量,这意味着一旦您分配了属性,就可以调用release来“标准化”保留计数。但是在你的第二个例子中你没有临时变量 - 你丢失了引用,并将它分配给你保留了两次的属性。

解决方法是在分配属性时添加autorelease语句,如下所示:

self.imageConnection = [[NSURLConnection alloc] initWithRequest: [NSURLRequest 
                                                 requestWithURL: [NSURL URLWithString:appRecord.imageURLString]] delegate:self] 
                                                 autorelease];

...或者您可以在第一个示例中执行您所显示的内容,并使用临时变量。

这对于所有属性都不适用 - 当您声明属性时,您还要声明是否要保留它('retain'),只保留为指针(' assign'),或复制('copy')。指定的属性不会出现此问题。