Objective c 目标C记忆问题!

Objective c 目标C记忆问题!,objective-c,nsdictionary,autorelease,Objective C,Nsdictionary,Autorelease,以下两行代码中有一个问题 NSDictionary* last = [[arrHistory lastObject] autorelease]; [arrHistory removeLastObject]; 在调试器中,我可以看到,在第一个代码行被执行之后,最后一个代码行指向一个字典,它应该使用值对 问题是第二行代码。破坏字典的内容是不可能的。我原以为第1行的自动释放可以解决问题,但事实并非如此 arrHistory拥有其成员,在获得其所有权之前,您不应调用您不拥有的成员的rele

以下两行代码中有一个问题

   NSDictionary* last = [[arrHistory lastObject] autorelease];
   [arrHistory removeLastObject];
在调试器中,我可以看到,在第一个代码行被执行之后,最后一个代码行指向一个字典,它应该使用值对

问题是第二行代码。破坏字典的内容是不可能的。我原以为第1行的自动释放可以解决问题,但事实并非如此

arrHistory拥有其成员,在获得其所有权之前,您不应调用您不拥有的成员的release/autorelease

如果要使用删除后的最后一个对象,可以按如下方式执行:


NSDictionary*last=[[arrHistory lastObject]retain]autorelease]

您需要做的是向对象发送一条retain消息


集合在对象被删除后会释放对象,这就是为什么您需要发送retain消息来获取其所有权。

在retain之后发送自动释放意味着last将在池下次排空时释放,如果对象从字典中删除,last将成为垃圾指针。@Abizern-是,但是,如果目的是从名称不表示所有权的方法返回最后一个,那么这正是预期的行为。在这种情况下,如果需要获得返回值的所有权,则调用方有责任保留返回值。@Abizem是的,您是对的。我只是假设最后一个对象只在删除时使用,因为我在示例代码中看到了自动删除。为什么会有否决票?这是一个比Abizern更好的答案,后者保留对象而不发送匹配的版本。不要为名誉投票,要为答案投票@Abizem,@Sherm,是的,我的意图是只在当前方法中使用“last”对象,因此,自动释放是正确的是的,但是拥有了它的所有权后,你还需要在处理完它后发送一个-释放或-自动释放-如果你从一个名称并不意味着所有权的方法返回它,则后者。是的,最终——但问题是阻止它在下一次通话中被销毁,而不是知道什么时候释放它。这就是为什么我说是的,但是——补充你的答案,而不是不同意它。
NSDictionary* last = [[arrHistory lastObject] retain];
[arrHistory removeLastObject];