没有@property的Objective-C属性赋值

时间:2012-08-21 08:59:53

标签: objective-c properties dealloc alloc synthesize

我目前正在开发一个由其他开发人员启动的iOS应用程序。

通常,我为每个实例变量创建一个属性(为所有类分配int,bool等等/保留)。

所以在我的项目中,这一行会导致泄漏:

myVar = [[NSString alloc] init]; (alloc/init +1, retain in setter +1, release in dealloc -1 => +1)

所以我用:

NSString *tmpMyVar = [[NSString alloc] init];
[self setMyVar: tmpMyVar];
[tmpMyVar release];

或者:

NSString *tmpMyVar = [[[NSString alloc] init] autorelease];
[self setMyVar: tmpMyVar];

在这个新项目中,以前的开发人员没有使用@ property / @ synthesize,所以我想知道在这个上下文中前一行代码的结果是什么(我猜不会调用setter)?内存泄漏?

以前的开发人员在dealloc方法中发布变量,就像我一样。

非常感谢!

2 个答案:

答案 0 :(得分:2)

因为它直接将实例变量分配给分配的对象,所以它的保留计数为1(因为,就像你说的那样,不会调用setter)。 因为它是以dealloc发布的,所以它都是平衡的。所以没有内存泄漏。

  

所以在我的项目中,这一行会导致泄漏:

     

myVar = [[NSString alloc] init]; (alloc / init +1,保留在setter +1中,以dealloc -1 => +1发布)

不,它甚至不会在你的项目中,因为正如你所指出的那样,没有使用setter。

此外,在使用属性时,建议直接在init方法中访问实例变量,而不是使用setter。

要检查可疑的内存泄漏,例如,请使用clang静态分析仪或仪器的泄漏工具。

答案 1 :(得分:0)

您需要查看其他开发人员的setter实现。确保它们释放现有值并保留新值;类似的东西:

- (void)setMyString:(NSString *)string
{
    [string retain];
    [_string release];    // ivar
    _string = string;
}

实现自己的setter / getter方法的唯一好处是在设置值时执行某些操作(除了设置ivar)。如果方法不做这样的事情那么为什么不将所有实现改为@property/@synthensize