Странное управление памятью Происхождение iOS - PullRequest
1 голос
/ 01 декабря 2011

По некоторым причинам в приведенном ниже коде массив replies равен NSLogging правильному описанию, а массив comment.replies равен NSLogging null.

Я сразу предположил, что это было связано с проблемой управления памятью в моем коде, но я не верю, что это правда.

Пожалуйста, вы можете сказать мне, почему это происходит?

- (TBComment *) dictionaryToComment:(NSDictionary *)dict {
    TBComment *comment = [[TBComment alloc] init];
    [comment setBody:[dict objectForKey:@"body"]];
    [comment setCommentID:[dict objectForKey:@"id"]];
    [comment setCreated_at:[dict objectForKey:@"created_at"]];
    [comment setUpdated_at:[dict objectForKey:@"updated_at"]];
    [comment setUser:[self dictionaryToUser:[dict objectForKey:@"user"]]];
    NSMutableArray *replies = nil;
    if ([[dict allKeys] containsObject:@"replies"]) {
        replies = [[NSMutableArray alloc] init];
        for (NSDictionary *reply in [dict objectForKey:@"replies"]) {
            NSLog(@"in");
            [replies addObject:[self dictionaryToComment:reply]];
        }
    }
    if (replies != nil) {
        [comment setReplies:replies];
        NSLog(@"COMMENT REPLIES = %@", comment.replies);
        NSLog(@"REPLIES = %@", replies);
        [replies release];
    }
    return [comment autorelease];
}

Консоль ->

2011-11-30 21:25:14.980 Timbrr[2379:f803] in
2011-11-30 21:25:14.980 Timbrr[2379:f803] COMMENT REPLIES = (null)
2011-11-30 21:25:14.980 Timbrr[2379:f803] REPLIES = (
    "<TBComment: 0x68dbeb0>"
)


- (void) setReplies:(NSArray *)_replies {
    hasReplies = (_replies == nil ? NO : ([_replies count] == 0 ? NO : YES));
    //replies is synthesised
}

Ответы [ 3 ]

7 голосов
/ 01 декабря 2011

После просмотра вашей реализации setReplies: я не думаю, что вы понимаете, как работает @synthesize.

@synthesize replies; сгенерирует метод получения и установки для этой переменной экземпляра. НО , поскольку вы переопределяете его (и неправильно), синтезированный сеттер отбрасывается в сторону. (На самом деле, для вас вообще не создается сеттер, поскольку вы сами его написали.)

Основная проблема заключается в том, что в вашей реализации setReplies: вы фактически не присваиваете значение переменной экземпляра replies параметру установщика.

Я думаю, что вы хотите:

- (void) setReplies:(NSArray *)_replies {
    hasReplies = (_replies == nil ? NO : ([_replies count] == 0 ? NO : YES));
    // How is your ivar defined in the header file? As _replies, or replies?
    if (replies != _replies) {
        [replies release];
        replies = [_replies retain];
    }
}
3 голосов
/ 01 декабря 2011

Я бы подозревал, что либо comment равно nil (хотя для этого потребуется явный nil код возврата в TBComment, что возможно, но необычно), либо что -replies или -setReplies:неправильно реализовано.У вас есть специальные реализации для них?

Ваша реализация setReplies: никогда не устанавливает _replies.

0 голосов
/ 01 декабря 2011

Свойство replies никогда не устанавливается - когда вы определяете setReplies:, директива @synthesize не создает никакого метода установки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...