0

我正在做一个设置方法:

OBS:somobject 是一个类的属性。

– (void)setSomeObject:(SomeObject *)newSomeobject {

    [某些对象自动释放];

    someobject = [newSomeobject 保留];

    返回;

}

在 [somobject autorelease] 上我声明我不想在 setSomeObject 的范围内拥有更多的对象。

被另一个对象保留的“someobject”会被释放吗?还是仅在 setSomeObject 方法上释放对象?

如果 someobject 类属性已经存在?

这个对象的行为是什么?

4

3 回答 3

2

我将重命名方法中的参数,使其与 ivar 不同:

– (void)setSomeObject:(SomeObject *)newObject 
{
    [someobject autorelease];

    someobject = [newObject retain];
}

您还应该阅读 Apple 文档以了解内存管理@property@synthesize.

于 2010-03-10T12:33:55.137 回答
1

您有一个重大问题,因为您似乎有两个同名的变量(方法参数和实例变量)。编译器(以及这个问题的读者,就此而言)无法分辨您指的是哪个。

对于您的内存管理问题,请查看Apple 的编程指南。

于 2010-03-10T12:21:37.363 回答
0

您需要在 setter 中完成的是:

  1. 释放任何旧对象
  2. 保留新对象
  3. 将新对象分配给您的实例变量

当然,如果您按字面顺序执行此操作,则在旧对象和新对象相同的情况下,您可能会过早释放对象。这就是“自动释放”派上用场的地方,因为它安排要释放的对象,但只有在您的方法返回之后。

将方法参数和实例变量命名为相同(恕我直言)令人困惑,并且会给你一个编译器警告,但如果你绝对坚持这样做,你可以使用“self->”来指定你指的是实例变量:

– (void)setSomeObject:(SomeObject *)someobject {

[self->someobject autorelease];

self->someobject = [someobject retain];

return;

}

最后,除非您的 setter 方法必须做一些特殊的事情,否则您应该考虑使用 @synthesize 来自动生成您的 setter/getter。

于 2010-03-10T12:44:04.587 回答