繁体   English   中英

在objective-c中保留对象

[英]retain object in objective-c

我正在做一个设置方法:

OBS:somobject是类的属性。

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

    [someobject autorelease];

    someobject = [newSomeobject retain];

    return;

}

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

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

如果someobject类属性已经存在?

该对象的行为是什么?

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

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

    someobject = [newObject retain];
}

另外,您应该阅读Apple文档以了解内存管理以及@property@synthesize

您有一个严重的问题,因为您似乎有两个具有相同名称的变量(方法参数和实例变量)。 编译器(以及该问题的读者)无法告诉您所指的是哪个。

有关您的内存管理问题,请查阅Apple的编程指南。

您需要在二传手中完成的工作是:

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

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

将方法参数和实例变量命名为(IMHO)一样令人困惑,并且会向您发出编译器警告,但是如果您绝对坚持这样做,则可以使用“ self->”来指定您所指的是实例变量:

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

[self->someobject autorelease];

self->someobject = [someobject retain];

return;

}

最后,除非您的setter方法必须执行特殊操作,否则应考虑使用@synthesize自动生成您的setter / getter。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM