1

から値を取得するinitメソッドがありますNSDictionary。これは私のFriendオブジェクト内にあります。

私の質問は、この特定のインスタンス化をいつリリースするのFriendかということです。

- (id)initWithValue:(NSString *)value {
    Friend *friend = [[Friend alloc] init];
    friend.friendId = [value valueForKeyPath:@"id"];
    friend.friendName = [value valueForKeyPath:@"name"];

    return friend;
}

以下のメソッドを呼び出して、オブジェクトを配列initに追加しますFriendfriends

for (id value in dataDict) {
    Friend *friend = [[Friend alloc] initWithValue:value];
    [friends addObject:friend];
    [friend release];
}

次に、コードで次のことを行います。

Friend *friend = (Friend *)[friends objectAtIndex:indexPath.row];

autoreleaseメソッド内のFriendオブジェクトの場合init、上記のコードを使用してに基づいて特定のオブジェクトの値を取得すると、割り当て解除されたインスタンスにメッセージが送信されますindexPath.row

4

3 に答える 3

3

いくつかのこと:

  • initメソッドを呼び出さないでください(正しい方法については、allocdiwupの例を参照してくださいinit) 。

  • あなたがやろうとしているのは、(自動解放された)オブジェクト(+NSString stringWithFormat:などと同様)を作成、初期化、および返す便利なメソッドを作成することのようです。ほぼ完成しましたが、(a)「init *」という名前を付けず、(b)インスタンスメソッドではなくクラスメソッドにする必要があります。

何かのようなもの:

+ (Friend)friendWithValue:(NSString *)value {
    Friend *friend = [[[Friend alloc] init] autorelease];
    friend.friendId = [value valueForKeyPath:@"id"];
    friend.friendName = [value valueForKeyPath:@"name"];

    return friend;
}

あなたはそれを次のように使うでしょう:

[friends addObject:[Friend friendWithValue:value]];
于 2011-01-03T07:29:41.137 に答える
1

あなたの質問に直接答えることはありませんが、これらのコード行は間違いなく危険です。

- (id)initWithValue:(NSString *)value {
    Friend *friend = [[Friend alloc] init];

代わりに、次のように書く必要があります。

- (id)initWithValue:(NSString *)value {
    [super init];
    self.friendId = ...;
    self.friendName = ...;

    return self;
}
于 2011-01-03T07:18:38.220 に答える
1

そして、それに直接答えます。割り当てられたオブジェクトは、使い終わったときにのみ解放します。メソッドを作成し、[オブジェクトリリース]を呼び出します。割り当てられたすべてのオブジェクトに対して。そうすることで、メモリ割り当ての不整合を回避できます。このアプローチは、自動解放を呼び出すよりも優れています。

于 2011-01-03T07:22:35.753 に答える