合成财产未得到保留

时间:2012-08-02 20:41:55

标签: objective-c

我刚才弄清楚为什么有些代码无法正常工作。我有类似的东西:

@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的内存地址?我无法弄清楚为什么会发生这种情况。我肯定会调用那个构造函数,它应该合成属性,允许我用它做任何我想做的事。

2 个答案:

答案 0 :(得分:4)

除非您明确将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。

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

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

答案 1 :(得分:1)

它是0x0,因为你永远不会将频道设置为任何东西。你至少需要这样做:

channels = [[NSMutableDictionary alloc] init];

然后在dealloc中你必须记住:

[channels release];