繁体   English   中英

ARC代表问题

[英]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方法,或者它们永远不会被释放。 它只是意味着不必进行显式调用来retainrelease ,这种情况会自动发生。

这里的问题是你的对象被取消分配,因为没有人拥有它们。 您的具体问题是SharedMethods正在被取消分配,因为它没有被保留,但我无法告诉您这是怎么发生的,因为您没有发布相关代码。

但是,我可以告诉您,您没有正确管理您的Connection ,希望这可以帮助您弄清楚您在使用SharedMethods遇到了什么问题。

因此,您使用alloc init创建Connection ,使用retain-release代码将其保留计数为1,但由于您不再使用ARC,因此不太相关。 除非某些其他对象断言Connection所有权,否则ARC将自动插入对release的调用以使保留计数恢复为0(如果ARC自动插入autorelease ,则类似)。

由于您没有将Connection分配给strongretain属性,或者将其放在集合中,因此没有其他对象声明对它的所有权。 因此,一旦执行到达定义变量conn的范围的末尾,它将被释放并释放。

因此,在ARC中,就像在手动保留和释放代码中一样,您仍然需要确保对象归其他对象所有,以便它们能够保持不变。 唯一的区别是你不需要手动调用retainrelease ,你只需要考虑对象所有权图 - 哪个对象由哪个其他对象拥有 - 并确保你想要retain任何对象都拥有通过其他一些对象。

重申一下,您需要确保SharedMethods归其他对象所有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM