【问题标题】:Synthesized Property Unretained综合财产未保留
【发布时间】:2012-08-02 20:41:54
【问题描述】:

我刚刚弄清楚为什么某些代码无法正常工作。我有类似以下的内容:

@interface Client : NSObject {
    Connection *connection;
}

@property (retain) NSMutableDictionary *channels;

接下来是这个实现:

@implementation Client

@synthesize channels;

- (id)init
{
    self = [super init];
    if (self) {
         // do whatever I want
         NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    }

    return self;
}

知道为什么channels 在此类的init 构造函数中的内存地址为0x0 吗?我一生都无法弄清楚为什么会发生这种情况。我肯定会调用那个构造函数,它应该是合成属性,让我可以用它做任何我想做的事情。

【问题讨论】:

  • 您显示的代码都没有初始化channels,所以我希望它的值是0。你遗漏了什么重要的事情吗?
  • @synthesize 不会自动为您提供 alloc 对象。它只是为该变量创建了一个 getter 和 setter。
  • @CarlNorum 我刚看到你的评论就拉屎了。我确实是个累人。将其作为您的答案,以便我可以将其标记为正确而不是评论。
  • 别担心,有几个答案已经说了同样的话。你可以选择其中之一。

标签: objective-c


【解决方案1】:

除非您将channels 明确设置为一个值,否则它将保持为nil。也许您打算在您的 init 方法中执行以下操作?

if (self) {
     // do whatever I want
     channels = [[NSMutableDictionary alloc] init];
}

另外两种设置频道的方法:

[self setChannels:[NSMutableDictionary dictionary]]; //These two lines...
self.channels = [NSMutableDictionary dictionary];    //...are equivalent.

请注意,在这种情况下,由于我们使用的是您的 retain 访问器,因此我们使用自动释放的 +dictionary 而不是 alloc/init,如果不使用 ARC,则会泄漏。

当然,channels 也必须在-dealloc 中正确发布,如果不使用 ARC:

- (void)dealloc
{
    [channels release];
}

【讨论】:

  • 这是正确的。我现在对愚蠢感到尴尬。这是一堆废话代码的精简版。我不知道我是怎么错过的。
  • 这些事情发生了;也许这个问题对将来认为属性会自动填充对象的人有用。
  • @andyvn22,如果你忘记在 dealloc 中释放,alloc/init 只会在不使用 ARC 时泄漏。在不使用 ARC 时(即使对于保留属性),您上面的所有示例都应该在 dealloc 中包含 [channels release];
  • @AW101,如果直接分配给 ivar,alloc/init 将不会泄漏,如第一个示例所示(假设在 -dealloc 中正确释放)。它在第二个示例中泄漏,即使在-dealloc 中正确释放,因为访问器将保留新值。
  • @andyvn22,正确。我想我只是指出,在您的所有示例中,您需要在 dealloc 中发布。
【解决方案2】:

它是 0x0,因为您从不将频道设置为任何内容。你至少需要这样做:

channels = [[NSMutableDictionary alloc] init];

然后在 dealloc 中你必须记住:

[channels release];

【讨论】:

  • 除非我记错了,不使用合成的setter方法,你需要在这里对alloc'd变量手动调用retain不是吗?
  • 不,alloc 将增加保留计数,因此不需要retain。如果我还打电话给retain,我将不得不打电话给release 两次。请记住:new、alloc、retain 和 copy 都会增加保留计数,因此需要释放。
猜你喜欢
  • 2011-08-14
  • 2016-09-15
  • 2012-03-05
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
相关资源
最近更新 更多