English 中文(简体)
NSArray:last 物体的回归
原标题:Does NSArray:lastObject return an autoreleased object?

Im在“i”项目上工作,我希望从“NSMutableArray”中提取一个物体,从阵列中删除该物体,随后使用。 守则认为:

NSMutableArray * array;
// fill the array
NSObject * obj = [array lastObject];
[array removeLastObject];
// do something with obj (in the same function)

阵列是唯一保留在正在接触的物体上的实体。 这是安全的吗? 我假定,只有最后一点,才能做到这一点。 物体自动释放,如果是,我可以指出。

最佳回答

为什么不呼吁

[array removeLastObject]

页: 1 这减少了释放/拘留。 这可能会使你的法典更加可读/过时。

http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html 页: 1

Like NSArray, instances of NSMutableArray maintain strong references to their contents. If you do not use garbage collection, when you add an object to an array, the object receives a retain message. When an object is removed from a mutable array, it receives a release message. If there are no further references to the object, this means that the object is deallocated. If your program keeps a reference to such an object, the reference will become invalid unless you send the object a retain message before it’s removed from the array. For example, if anObject is not retained before it is removed from the array, the third statement below could result in a runtime error:

id anObject = [[anArray objectAtIndex:0] retain]; 
[anArray removeObjectAtIndex:0]; 
[anObject someMessage];
问题回答

值得一提的是Cocoa Memory Management Rules 。 如果你是在非GC环境中工作,例如 简言之,这总是值得一提。

基本规则规定:

如果你使用一种名称为“准许”或“新”或包含“范围”的方法(例如,所有物体、新物体或变幻剂),或如果你发出保留信息,你就拥有物体的所有权。 你负责放弃对你自己使用释放或自动释放的物体的所有权。 任何其他时候,你们都不得释放。

显然,你没有发现任何东西、新东西或含有复制件。 因此,你不拥有否决权。

在您的《法典》中,第二版的编码也相关:

所收到的物体通常保证在所收到方法中继续有效(例外包括多读申请和一些批发的物体情况,,但如您更改所收到的另一物体的物体,你也必须谨慎行事)。 这种方法也可以安全地将物体送回其援引人。

我 bold了相关部分。 你修改了所收到的物体的阵列,从而可能消失。 您要么保留该物体,要么在从阵列中删除,要么在你用该物体完成后去除。

实际上,你might甚至在你问题中的代码上是安全的,因为NSMutable Array 执行标的AtIndex:might在保留之后,就归还项目自动释放。 在一个多面的环境中,这将是保证物体在足够长的时间里仍然有效,以便返回打电话者的唯一途径。 然而,我看不到国家安全局的法典,也不依赖它。

ETA: 只是看看看透式方案规划指南,看来NSMutableAtrray没有保留,是自动释放。

NSObject * obj = [array lastObject]; // Just returns an object, its retain count not changed
[array removeLastObject]; // object receives release message

因此,如果您的阵列是唯一在撤销保留后保留物体的实体,那么它就变成零,应当重新定位。 您应保留该物体,并在不需要时释放:

NSObject * obj = [[array lastObject] retain];
[array removeLastObject];
// do something with obj (in the same function)
[obj release];




相关问题
Code sign Error

I have created a new iPhone application.I have two mach machines. I have created the certificate for running application in iPhone in one mac. Can I use the other mac for running the application in ...

ABPersonViewController Usage for displaying contact

Created a View based Project and added a contact to the AddressBook using ABAddressBookRef,ABRecordRef now i wanted to display the added contact ABPersonViewController is the method but how to use in ...

将音频Clips从Peter改为服务器

我不禁要问,那里是否有任何实例表明从Peit向服务器发送音响。 I m不关心电话或SIP风格的解决办法,只是一个简单的袖珍流程......

• 如何将搜查线重新定位?

我正试图把图像放在搜索条左边。 但是,问题始于这里,搜索条线不能重新布署。

热门标签