Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 你是如何看待这些问题的?_Objective C_Cocoa - Fatal编程技术网

Objective c 你是如何看待这些问题的?

Objective c 你是如何看待这些问题的?,objective-c,cocoa,Objective C,Cocoa,有人能告诉我我是如何引用这些的吗?第一个是系统管理的对象,第二个是用户管理的对象。在objective-c/cocoa中,我应该使用什么术语来引用它们 01 02 编辑001 因此,对于第一个示例,我需要这样的内容(文本移到顶部的01) 编辑(002) “代码已清理,修改了下面的最后一个问题…” 我将使用01(考虑到这是更常见的方式),我可以再次询问关于保留/释放(即,如果需要)的问题吗 gary在您的第一个示例中,+planet的结果将自动删除。因此,如果调用方希望保留对结果的引用,则必须对结

有人能告诉我我是如何引用这些的吗?第一个是系统管理的对象,第二个是用户管理的对象。在objective-c/cocoa中,我应该使用什么术语来引用它们

01 02 编辑001 因此,对于第一个示例,我需要这样的内容(文本移到顶部的01)

编辑(002) “代码已清理,修改了下面的最后一个问题…”

我将使用01(考虑到这是更常见的方式),我可以再次询问关于保留/释放(即,如果需要)的问题吗


gary

在您的第一个示例中,
+planet
的结果将自动删除。因此,如果调用方希望保留对结果的引用,则必须对结果调用
-retain
+planet
是更常见的模式(尽管存在
+[NSObject new]
,但在Cocoa land中使用和
alloc/init
对或像您的
+planet
这样的方便构造函数(根据Cocoa内存管理规则返回自动删除的实例)更为常见


在这两个示例中,
+planet
/
+newPlanet
的结果是
planet
类的一个实例。术语上没有区别,但是(正确的)第一个示例的文档可能会明确说明结果是“自动删除的”即使标准的Cocoa内存管理约定要求自动删除结果。

在第一个示例中,
+planet
的结果是自动删除的。因此,调用方必须在结果上调用
-retain
,如果它想维护对结果的引用。
+planet
是更常见的模式(虽然存在
+[NSObject new]
,但在Cocoa land中使用和
alloc/init
对或像您的
+planet
这样的方便构造函数(根据Cocoa内存管理规则返回自动删除的实例)更为常见


在这两个示例中,
+planet
/
+newPlanet
的结果是
planet
类的一个实例。术语上没有区别,但是(正确的)第一个示例的文档可能会明确说明结果是“自动删除的”即使标准的Cocoa内存管理约定会规定自动删除结果。

这些方法产生的实际对象只是一个
行星
对象实例,正如Barry Wark在回答中所说。然而,第一个方法
+Planet
)可能会被称为“便利构造函数”

编辑_001


据我所知,一个
自动释放
d对象将在创建它的方法/函数的过程中一直存在。如果你想让它停留更长的时间,你只需要
保留
对象。

这些方法产生的实际对象只是一个
星球
对象实例,正如巴里·沃克(Barry Wark)在他的回答中所说。然而,第一个方法
+planet
)可能会被称为“便利构造函数”

编辑_001


据我所知,一个
autorelease
d对象将在创建它的方法/函数的过程中一直存在。如果你想让它存在更长的时间,你只需要
保留该对象。

因为第二个包含“new”,我假设调用最外层=[Planet newPlanet];然后在某个点调用[最外层版本];根据管理规则是否正确?Ooops。我在您的第二个示例中没有看到新版本。根据管理规则,它是正确的。我将修正我的答案。在Objective-C中,您不调用方法,而是发送消息。应该说明的方式是,“因此,调用方必须发送结果a-retain消息”@NSResponder你说得对。我发现许多Cocoa开发人员缩短了“发送X消息”来呼叫X。请随意编辑我的帖子,使事情更准确!由于第二篇文章包含“new”,我假设调用最外层=[Planet newPlanet];然后在某个时候调用[outerMost release];根据管理规则是否正确?Ooops。我在您的第二个示例中没有看到新的。根据管理规则,它是正确的。我将修正我的答案。在Objective-C中,您不调用方法,而是发送消息。应该说明的方式是,“因此,调用方必须发送结果a-保留消息”.@NSResponder你说得对。我发现许多开发人员缩短了“发送X消息”调用X。请随意编辑我的帖子以使事情更准确!自动释放对象将一直存在,直到释放/释放封闭的自动释放池。如果在方法中显式创建一个,则这就是封闭池。否则,封闭池位于调用堆栈中较低的方法中。通常封闭池将在当前NSRunLoop迭代结束时将被释放。啊,好吧,我明白了,因为我正在main()范围内创建对象,所以我不需要添加保留/释放,因为它在创建时从alloc(由自动释放匹配)中获得+1释放计数,而在main退出并释放池时,该计数将被正确处理。“自动释放的对象将一直保留,直到封闭的自动释放池排空/释放。"不。自动释放池只是一种延迟的消息传递机制。当您向对象发送-autorelease时,当当前池耗尽或释放时,它将收到一条-release消息。这就是全部含义。在这之前,相关对象可能会被销毁,导致内存错误,或者如果-release失败,它可能会在以后继续存在sage没有将其保留计数减为零。自动释放的对象将一直保留,直到封闭的自动释放池排空/
+(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;
}