0

次のプロパティが定義されています。

@property (nonatomic, retain) NSString *name_;
@property (nonatomic, retain) NSString *profilePicture_;
@property (nonatomic, retain) NSString *username_;
@property (nonatomic, retain) NSString *id_;

そして、私は次のようにそれらを設定しましたinit...:

-(id)initWithData:(NSDictionary *)data
{
    self = [super init];
    if (!self) {
        return nil;
    }

    name_ = [data valueForKey:@"full_name"];
    profilePicture_ = [data valueForKey:@"profile_picture"];
    username_ = [data valueForKey:@"username"];
    id_ = [data valueForKey:@"id"];


    return self;
}

次のようにdealloc:

-(void)dealloc
{
    [name_ release];
    [username_ release];
    [profilePicture_ release];
    [id_ release];
    [super dealloc];
}

ただし、deallocエラーが発生します:

解放されたポインタが割り当てられていませんでした

どうしてこれなの?私はしなければなりません[[NSString alloc] init...][NSString stringWithString:]

4

3 に答える 3

5

valueForKey:自動解放されたオブジェクトを返すため、所有権はありません。copyそれらはすべて文字列なので、このように呼び出すことができます

name_           = [[data valueForKey:@"full_name"] copy];
profilePicture_ = [[data valueForKey:@"profile_picture"] copy];
username_       = [[data valueForKey:@"username"] copy];
id_             = [[data valueForKey:@"id"] copy];

これは一般的に文字列に対して推奨されるため、@property使用する宣言も変更する必要があります。copy

他の代替手段は、合成されたアクセサーを通過することですが、私は一般的に、またはいずれinitかでこれを行うことを避けますdealloc

于 2012-04-28T16:15:59.643 に答える
1

これは、のバッキング変数に代入しているためですinitWithData。次のようにコードを書き直してください。

self.name_ = [data valueForKey:@"full_name"];
self.profilePicture_ = [data valueForKey:@"profile_picture"];
self.username_ = [data valueForKey:@"username"];
self.id_ = [data valueForKey:@"id"];

これにより、プロパティを介して値が割り当て[retain]られるため、必要になります。あなたのコードが今書かれている方法では、ポインタは を呼び出さずに ivar にコピーされるだけで[retain]、最終的にあなたが説明する問題を引き起こします。

于 2012-04-28T16:15:08.140 に答える
0

辞書のデータを使用しているため、self キーワードを使用してプロパティから値を設定する必要があります。

解決しない場合、問題はおそらくクラス内ではなく、おそらくそのインスタンスを作成した場所にあります。このクラスのインスタンスを割り当てて解放するコードを調べてみてください。

また、Simulator と NSZombies を使用してアプリをプロファイリングする必要があります。

于 2012-05-07T11:40:38.673 に答える