我正在学习objective-c 内存管理的东西(没有ARC),我遇到了一些常见问题。这里提到了几次,所以我不是问你“到底是什么!?”,而是“我理解正确吗?”
问题:
文档说:
- (NSString *)fullName {
NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@",
self.firstName, self.lastName] autorelease];
return string;
}
你拥有 alloc 返回的字符串。要遵守内存管理规则,您必须在丢失对它的引用之前放弃对字符串的所有权。但是,如果您使用 release,则字符串将在返回之前被释放(并且该方法将返回无效对象)。使用自动释放,您表示您想要放弃所有权,但您允许方法的调用者在释放之前使用返回的字符串。
所以让我们试试:
// 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
所以,如果我理解得很好,问题是,很难预测什么时候会释放内存?或者实际上,内存中的特定位置仅被标记为“释放”,仅此而已……我说的对吗?