任何人都可以告诉我我是如何引用它们的,第一个是系统管理对象,第二个是用户管理对象,我应该在objective-c / cocoa中使用哪些术语来引用它们?
+(Planet *) planet {
gPlanetCount++;
return [[[self alloc] init] autorelease];
}
int main(int argc, const char * argv[]) {
Planet *outerMost;
outerMost = [[Planet planet] retain]; // With
...
... some code
...
[outerMost release];
[pool drain];
return 0;
}
// OR
int main(int argc, const char * argv[]) {
Planet *outerMost;
outerMost = [Planet planet]; // Without
...
... some code
...
[pool drain];
return 0;
}
+(Planet *) newPlanet {
gPlanetCount++;
return [[self alloc] init];
}
int main(int argc, const char * argv[]) {
Planet *outerMost;
outerMost = [Planet newPlanet];
...
... some code
...
[outerMost release];
[pool drain];
return 0;
}
所以在第一个例子中,我需要这样的东西(文本在顶部移动到01)
“代码已清理,修改后的最终问题......”
我将使用 01 (考虑到它更常用的方式)我可以再次询问保留/释放(即如果需要它们),这将编译并运行静态分析器有没有他们?
加里
答案 0 :(得分:3)
在您的第一个示例中,+planet
的结果已自动释放。因此,如果调用者想要保持对结果的引用,则必须在结果上调用-retain
。 +planet
是更常见的模式(尽管+[NSObject new]
存在,但在Cocoa-land中使用和alloc/init
对或者+planet
之类的便利构造函数更常见(返回根据Cocoa内存管理规则自动释放的实例。)
在这两个示例中,+planet
/ +newPlanet
的结果是Planet
类的实例。术语没有区别,但是(正确的)第一个例子的文档可能是明确的,即表明结果是“自动释放”,即使标准的Cocoa内存管理约定会指示结果是自动释放的。
答案 1 :(得分:1)
来自这些方法的实际对象只是一个Planet
对象实例,正如Barry Wark在他的回答中所说。但是,第一个方法(+planet
)可能会被称为“便利构造函数”。
<强> EDIT_001 强>
据我了解,autorelease
d对象将在创建它的方法/函数的持续时间内保持不变。如果你希望它保持在周围,你只需retain
对象比那更长。