方法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];
答案 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')。指定的属性不会出现此问题。