你如何参考这些?

时间:2009-11-15 00:09:52

标签: objective-c cocoa

任何人都可以告诉我我是如何引用它们的,第一个是系统管理对象,第二个是用户管理对象,我应该在objective-c / cocoa中使用哪些术语来引用它们?

01

+(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;
}

02

+(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;
}

EDIT_001

所以在第一个例子中,我需要这样的东西(文本在顶部移动到01)

EDIT_002

“代码已清理,修改后的最终问题......”

我将使用 01 (考虑到它更常用的方式)我可以再次询问保留/释放(即如果需要它们),这将编译并运行静态分析器有没有他们?

加里

2 个答案:

答案 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对象比那更长。