2012-02-24 47 views
0

方法一:ios这个同伴之间有什么不同?

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]; 

回答

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'),或复制('复制')。分配的属性不会有这个问题。