目标C self.variable和变量赋值之间的差异

时间:2010-06-21 21:38:08

标签: objective-c memory-leaks setter

我担心自己很蠢。

我花了大约三个小时来追踪一个破坏我的理智的内存泄漏,在评论了我的应用程序的一半后,我得出了以下结论。

在适当的地方给出以下内容。

NSString *blah;

@property (nonatomic, retain) NSString *blah;

@synthesize blah;

-(id)initWithBlah:(NSString*)b {

     self.blah = b;    //this leaks
     blah = b;         //this does not

}

我对于objectice c并不是特别有经验,我明白如果我在调用object.blah = b;我会透明地调用一个保留b的setter函数。在函数内部,我假设通过设置self.blah = b我出于某种原因双重保留?

有人可以向我解释为什么会这样,或者不是我可能做错了什么?

干杯

4 个答案:

答案 0 :(得分:2)

blah = b

直接修改类实例变量。

self.blah = b
如果存在,

将调用访问者 - 从而保留,根据需要释放资源。

您应该在dealloc方法中添加[blah release];,以便在您的课程发布时释放资源。

答案 1 :(得分:2)

你错了。 blah = b;赋值没有多大意义,因为在您的代码从initWithBlah:返回后,您再也无法依赖于字符串了。无论何时访问它,它很可能已被解除分配。

self.blah = b;分配是正确的,因为它调用了setter,从而获得了字符串的所有权。当然,您也必须在blah中释放-dealloc,以防止内存泄漏。

答案 2 :(得分:1)

如果你只给blah,它不会为字符串分配,如果你给self.blah,它然后尝试启动self并为self类分配并尝试为你试图访问的变量分配,所以你必须在dealloc方法中释放它或使blah = nil。

- (void)dealloc 

{

     self.blah = nil;

      or

    [self.blah release];

}

答案 3 :(得分:0)

使用访问器很好,如果它泄漏则会出现其他问题。

特别是你的初始化程序必须正确调用,即遵循Cocoa Memory Management指南,参数不是被调用者隐式拥有的。

所以下面的内容很好,因为它传递了一个自动释放的字符串:

YourObj *obj = [[YourObj alloc] initWithBlah:[NSString stringWithString:@"blah"]];

由于传入保留的字符串而导致以下泄漏:

YourObj *obj = [[YourObj alloc] initWithBlah:[[NSString alloc] initWithString:@"blah"]];

您必须注意的另一件事是声明的属性不会自动处理清理,因此请务必在-dealloc中处理:

- (void)dealloc {
    self.blah = nil;
    // ...
}