0

一部のコードが機能しない理由がわかりました。私は次のようなものを持っています:

@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のコンストラクターでメモリ アドレスが 0x0 になっている理由がわかりませんか? initなぜこれが起こっているのか、一生わからない。私は間違いなくそのコンストラクターを呼び出しています。プロパティを合成して、私がやりたいことを何でもできるようにする必要があります。

4

2 に答える 2

4

明示的channelsに値を設定しない限り、そのままですnil。おそらく、メソッドで次のことを行うつもりでしたinitか?

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

チャネルを設定するには、さらに 2 つの方法があります。

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

その場合、アクセサーを使用しているため、 ARC を使用しないとリークする/ではなくretainautoreleased を使用することに注意してください。+dictionaryallocinit

もちろん、ARC を使用していない場合は、channelsで適切にリリースする必要もあります。-dealloc

- (void)dealloc
{
    [channels release];
}
于 2012-08-02T20:47:03.023 に答える
1

チャンネルを何にも設定していないため、0x0 です。少なくとも次のことを行う必要があります。

channels = [[NSMutableDictionary alloc] init];

そして、dealloc では、次のことを覚えておく必要があります。

[channels release];
于 2012-08-02T20:47:07.413 に答える