4 memory-management objective-c autorelease
好吧,我知道这个问题的答案应该是显而易见的,但我需要向正确的方向努力.
我发现自己编写了大量遵循以下模式的方法:
-(NSThing*)myMethod{
NSThing *thing = [[NSthing alloc] init];
// do some stuff with the thing
return thing;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我该如何处理这个对象的发布?显然我无法在方法中释放它.
new*_*cct 13
通常你会自动发布它
-(NSThing*)myMethod{
NSThing *thing = [[NSthing alloc] init];
// do some stuff with the thing
return [thing autorelease];
}
Run Code Online (Sandbox Code Playgroud)
正如newacct所说,自动释放是摆脱这种情况的简单方法.但是,您应该考虑您要返回的对象的"所有权".
在Objective-C中,一般的经验法则是,任何带有alloc,new或copy名称的方法都返回一个非自动释放的对象,而其他方法(如类方法)预先自动释放要返回的对象.所以这三个在自动释放方面并不相同(尽管编译器可能会做一些魔法并将它们全部减少到字符串常量):
// Autoreleased
NSString *string1 = [NSString stringWithString:@"aString"];
NSString *string2 = [[[NSString alloc] initWithString:@"aString"] autorelease];
// NOT autoreleased
NSString *string3 = [[NSString alloc] initWithString:@"aString"];Run Code Online (Sandbox Code Playgroud)
您的代码可以采用类似的方法,您可以考虑谁拥有您要返回的对象.在您所提供的具体的例子,该方法是一个alloc荷兰国际集团和init荷兰国际集团的对象,所以一般你负责autorelease你自己的方法中荷兰国际集团(原文如此)它.但是,如果您要编写一个采用预先存在的对象并以某种方式修改它的方法,那么您将不会拥有该对象,也不会负责自动释放返回的对象.(当对象所属的自动释放池耗尽时,这样做实际上可能会导致问题.)
另见(感谢Peter和Quinn的评论!):
| 归档时间: |
|
| 查看次数: |
1695 次 |
| 最近记录: |