オブジェクトを自動解放する場合-[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]
ます。
これは、ドキュメンテーションが何を言おうと関係ないことを意味します。プログラムを正しく動作させたい場合は、オブジェクトを保持する必要があります。
実装の詳細に頼るべきだと言っているわけではないことに注意してください。ドキュメントを探す価値があるかどうかを判断するために実装を使用しているだけです。