如果-[NSArray lastObject]
自动释放对象,有理由问:“是否记录了自动释放对象,以便我可以依赖这种行为?”</p>
但如果-[NSArray lastObject]
不自动释放对象,则无需询问是否记录了该行为。您必须保留返回的对象,如果您想确保它存在removeLastObject
于数组的一个或一个解除分配之后。如果你不保留它,你的程序就会行为不端。文档说什么或不说什么都没有关系:确保程序在这种情况下正确运行的唯一方法是保留该对象。而且,如果它们将来发生更改lastObject
以自动释放对象,您的程序仍将正常运行。
所以,什么都不知道,你应该只保留对象。
但我们可以知道别的。我们可以反汇编这个-[NSArray lastObject]
方法,看看它是否自动释放。然后我们就会知道我们是否应该打扰询问文档中的内容。
该-[NSArray lastObject]
方法在 CoreFoundation 框架中实现。我使用Hopper反汇编了 OS X 10.8 (Mountain Lion) 64 位版本:
75e30 55 push rbp
75e31 4889E5 mov rbp, rsp
75e34 53 push rbx
75e35 50 push rax
75e36 4889FB mov rbx, rdi
75e39 488D3530971800 lea rsi, qword [ds:objc_msg_count] ; @selector(count)
75e40 4889DF mov rdi, rbx
75e43 FF1527971800 call qword [ds:objc_msg_count] ; @selector(count)
75e49 4885C0 test rax, rax
75e4c 7509 jne 0x75e57
75e4e 31C0 xor eax, eax
75e50 4883C408 add rsp, 0x8
75e54 5B pop rbx
75e55 5D pop rbp
75e56 C3 ret
75e57 48FFC8 dec rax ; XREF=0x75e4c
75e5a 488B0D1F971800 mov rcx, qword [ds:objc_msg_objectAtIndex_] ; @selector(objectAtIndex:)
75e61 488D3518971800 lea rsi, qword [ds:objc_msg_objectAtIndex_] ; @selector(objectAtIndex:)
75e68 4889DF mov rdi, rbx
75e6b 4889C2 mov rdx, rax
75e6e 4883C408 add rsp, 0x8
75e72 5B pop rbx
75e73 5D pop rbp
75e74 FFE1 jmp rcx
如果你说 x86 汇编器,你可以把它翻译成这个简单的 Objective-C 代码:
- (id)lastObject {
NSUInteger count = self.count;
return count == 0 ? nil : [self objectAtIndex:count-1];
}
由于文档objectAtIndex
中没有自动释放对象,我们可以看到实际实现不会-[NSArray lastObject]
自动释放对象。
这意味着文档中的内容并不重要:如果您希望程序正确运行,则必须保留该对象。
请注意,我并不是说您应该依赖实现细节。我只是使用实现来决定是否值得寻找文档。