私は客観的な c メモリ管理 (ARC なし) を学んでおり、いくつかの一般的な問題に遭遇しました。ここで何度か出てきたので、「一体何!?」ではなく、「正しく理解できていますか?」と聞いています。
問題:
ドキュメントには次のように記載されています。
- (NSString *)fullName {
NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@",
self.firstName, self.lastName] autorelease];
return string;
}
alloc によって返された文字列を所有しています。メモリ管理規則に従うには、文字列への参照を失う前に、文字列の所有権を放棄する必要があります。ただし、release を使用すると、文字列が返される前に割り当てが解除されます (メソッドは無効なオブジェクトを返します)。autorelease を使用すると、所有権を放棄することを示しますが、メソッドの呼び出し元は、割り当てが解除される前に、返された文字列を使用できます。
それでは、試してみましょう:
// Method defined in one on my class:
-(NSString*) returnString {
NSString* str = [[NSString alloc] initWithString:@"returned String"];
NSLog(@"1) Address in method = %p", [str self]);
[str release];
NSLog(@"2) Address in method = %p", [str self]);
return str;
}
// In main:
NSString* str = [myObject returnString];
NSLog(@"String is: [%@]", str);
NSLog(@"3) Address in main = %p", [str self]);
-
Output:
1) Address in method = 0x100002a50
2) Address in method = 0x100002a50
String is: [returned String] // <--
3) Address in main = 0x100002a50
それで、私がよく理解していれば、問題は、正確にいつメモリが解放されるかを予測するのが難しいということですか? または、実際には、メモリ内の特定の場所が「解放済み」としてマークされているだけで、それだけです... そうですか?