ARC代表问题

时间:2012-03-31 06:53:57

标签: iphone objective-c nsurlconnection

我需要从服务器下载一些图像。所以我创建了一个单独的类来处理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子类时有什么需要考虑的吗? 提前谢谢。

1 个答案:

答案 0 :(得分:2)

使用ARC并不意味着对象永远不会收到release方法,或者它们永远不会被解除分配。这只是意味着不必明确调用retainrelease,这会自动发生。

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

但是,我可以告诉您,您没有正确管理Connection,希望这可以帮助您弄清楚您在SharedMethods做错了什么。

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

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

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

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