1

我有一个initNSDictionary. 这是在我的Friend对象之内。

我的问题是我什么时候发布这个特定的实例化Friend

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

    return friend;
}

我调用init下面的方法将Friend对象添加到friends数组中

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

然后我在代码中执行以下操作:

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

如果我是方法中autoreleaseFriend对象,init那么当我使用上面的代码获取基于indexPath.row.

4

3 回答 3

3

有几件事:

  • init不应调用方法(alloc请参阅 diwup 的示例以了解正确的方法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

并直接回答:仅当您完成分配的对象时才释放它们。创建方法并调用[对象释放];对于所有分配的对象。这样做可以避免内存分配不一致,而且这种方法比调用 autorelease 更好。

于 2011-01-03T07:22:35.753 回答