[英]ARC delegate issue
我需要从服务器下载一些图像。 所以我创建了一个单独的类来处理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所以没有发布那个对象。 我的应用程序在方法中有异常,(在Connection类中)
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[(id)delegate performSelectorselector(finished:) withObject:receivedData]; //Got an exception in this line
}
例外情况是[SharedMethods retain] message send to deallocated object
。 我不认为我已经发布了任何东西,因为我正在使用ARC。
在作为UIAlerView
的子类的Class中调用UIAlerView
委托时也存在问题。 它没有被称为任何方式。 我怀疑的是,使用NSObject
子类有什么问题吗? 使用NSObject
子类时有什么需要考虑的吗? 提前致谢。
使用ARC并不意味着对象永远不会收到release
方法,或者它们永远不会被释放。 它只是意味着您不必进行显式调用来retain
和release
,这种情况会自动发生。
这里的问题是你的对象被取消分配,因为没有人拥有它们。 您的具体问题是SharedMethods
正在被取消分配,因为它没有被保留,但我无法告诉您这是怎么发生的,因为您没有发布相关代码。
但是,我可以告诉您,您没有正确管理您的Connection
,希望这可以帮助您弄清楚您在使用SharedMethods
遇到了什么问题。
因此,您使用alloc init
创建Connection
,使用retain-release代码将其保留计数为1,但由于您不再使用ARC,因此不太相关。 除非某些其他对象断言Connection
所有权,否则ARC将自动插入对release
的调用以使保留计数恢复为0(如果ARC自动插入autorelease
,则类似)。
由于您没有将Connection
分配给strong
或retain
属性,或者将其放在集合中,因此没有其他对象声明对它的所有权。 因此,一旦执行到达定义变量conn
的范围的末尾,它将被释放并释放。
因此,在ARC中,就像在手动保留和释放代码中一样,您仍然需要确保对象归其他对象所有,以便它们能够保持不变。 唯一的区别是你不需要手动调用retain
和release
,你只需要考虑对象所有权图 - 哪个对象由哪个其他对象拥有 - 并确保你想要retain
任何对象都拥有通过其他一些对象。
重申一下,您需要确保SharedMethods
归其他对象所有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.