我需要从服务器下载一些图像。所以我创建了一个单独的类来处理NSURLConnection委托。
在didFinishDownloadingData
结束时,我调用了一个委托方法,例如[(id)delegate performSelectorselector(finished:) withObject:receivedData]
我有一个名为ListImages
的视图控制器。
我从ListImages类创建了上面的连接类并分配了connection.delegate = self
。从服务器加载图像后,方法-(void)didFinishDownloadingData:(NSData *)data;
被成功调用,我可以显示该图像。
我的问题现在就开始了。为了处理一些常见任务,我创建了一个名为SharedMethods
的新类,它是NSObject
的子类。我将连接类分配为
Connection *conn = [[Connection alloc]init];
conn.delegate = self;
[conn startDownload]; //called a method which starts nsurlconnection.
我正在使用ARC,所以没有发布那个对象。我的应用程序在方法中有异常(在连接类中)
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[(id)delegate performSelectorselector(finished:) withObject:receivedData]; //Got an exception in this line
}
例外是[SharedMethods retain] message send to deallocated object
。我不认为我已经发布了任何东西,因为我正在使用ARC。
在作为NSobject的子类的Class中调用UIAlerView
委托时也存在问题。它没有被称为任何方式。我怀疑是,使用NSObject
子类有什么问题吗?使用NSObject
子类时有什么需要考虑的吗?
提前谢谢。
答案 0 :(得分:2)
使用ARC并不意味着对象永远不会收到release
方法,或者它们永远不会被解除分配。这只是意味着你不必明确调用retain
和release
,这会自动发生。
这里的问题是你的对象被取消分配,因为没有人拥有它们。您的具体问题是SharedMethods
正在被取消分配,因为它没有被保留,但我无法告诉您这是怎么发生的,因为您没有发布相关代码。
但是,我可以告诉您,您没有正确管理Connection
,希望这可以帮助您弄清楚您在SharedMethods
做错了什么。
因此,您使用Connection
创建alloc init
,其中使用保留释放代码会将保留计数设为1,但由于您不再使用ARC,因此不太相关。除非某些其他对象声明Connection
的所有权,否则ARC将自动插入对release
的调用以使保留计数恢复为0(如果ARC自动插入autorelease
,则有点类似)
由于您未将Connection
分配给strong
或retain
属性,或将其放入集合中,因此没有其他对象声明对其拥有所有权。因此,一旦执行到达定义变量conn
的范围的末尾,它就会被释放并解除分配。
所以在ARC中,就像在手动保留和释放代码中一样,你仍然需要确保对象归其他对象所有,以便它们能够存在。唯一的区别是您不需要手动调用retain
和release
,您只需要考虑对象所有权图 - 哪个对象由哪个其他对象拥有 - 并确保任何对象你想要留下的对象归其他一些对象所有。
重申一下,您需要确保SharedMethods
归某个其他对象所有。