我知道以下内容不需要手动发布(作为其自动发布):
NSString* str1 = [NSString string];
这需要手动发布:
NSString* str2 = [[NSString alloc] init];
[string2 release];
但是怎么样?它是自动释放还是不自动释放?
NSString* str3 = @"Example string";
最后,看看下面的代码片段:如果我已正确理解iOS内存管理,那么释放RootViewController引用'rvc'将清除该对象,因此它不会在代码中的其他位置使用 - 我不会不想那样。但是,我应该至少将引用设置为null吗?或者我可以在代码中保留这些引用而不会导致内存泄漏吗?
- (void)myMethod
{
RootViewController *rvc = (RootViewController *)navigationController.topViewController;
// using rvc somehow...
// ...but should I set it to null?
}
答案 0 :(得分:6)
无需释放字符串文字 - 它不是自动释放的,但它也不是在该行创建的。字符串文字是一种特殊情况(是Objective-C中唯一的文字对象),它们忽略了释放它们的任何尝试。
rvc是一个局部变量,因此一旦MyMethod结束就会变得无法访问。没有必要将它设置为任何东西(它是零,而不是null)。除了获取topViewController的地址并将其存储在局部变量中之外,您所做的任务不会执行任何操作。所以没有内存管理效果。
答案 1 :(得分:5)
如果您使用“保留”,“Alloc”,“新建”,“复制”(RANC)等单词之一,那么您就是该对象的所有者,并负责内存管理。你没有使用其中一个RANC字,因此你不需要发布。有关此问题的更多解释,请参阅http://www.mobiledev.nl/memory-management-in-ios/。
答案 2 :(得分:1)
@"Example string"
是编译时常量。内存由编译器分配。所以在行
NSString *str3 = @"Example string";
您只是分配一个常量而不应该释放str3