Сбой NSString при выпуске - PullRequest
       11

Сбой NSString при выпуске

1 голос
/ 12 июля 2011

Вот мой ItemInfo интерфейс класса

@interface ItemInfo : NSObject {
    NSString *item;
}
@property (nonatomic, copy) NSString *ipaddress;

... и реализация

@synthesize item;
- (id) initWithItem:(NSString *)someItem {
    self = [super init];
    if(self) {
        item = someItem;   // Ideally these things should happen here. 
                           // Since item is a NSString and not NSMutableString,
                           // it should be sent a retain, thus
                           // making its refcount = 1
                           // Is my understanding correct?
    }
    return self;
}

- (void) dealloc {
    [item release];   // I own 'item', so I should release it when done
    [super dealloc];
}

Я использую этот класс из других источников, например:

char *str = inet_ntoa(addy->sin_addr);
ItemInfo *h = [[ItemInfo alloc] initWithItem:[NSString stringWithFormat:@"%s", str]];
ContentBrowserViewController *d 
        = [[ContentBrowserViewController alloc] initWithItemInfo:h]; 
[self.navigationController pushViewController:d animated:YES];
[h release];
[d release];

Авария, с которой я сталкиваюсь, *** -[CFString release]: message sent to deallocated instance 0x6225570. 0x6225570 это адрес h.item

Куда я иду не так?

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Вы должны позвонить своему сеттеру, используя self.item = someItem. В настоящее время вы игнорируете сеттер и, следовательно, не копируете / не владеете строкой.

3 голосов
/ 12 июля 2011

В вашем initWithItem: вам нужно сделать item = [someItem copy]; Вы могли бы также сделать item = [someItem retain];, но это вызвало бы проблемы, если ваша строка была NSMutableString.

Причинапотому что сбой заключается в том, что вы пропускаете автоматически выпущенную строку, а ваш initWithItem: не говорит «Мне нужна эта строка, чтобы оставаться рядом» (сохранить) или «Мне нужна моя личная версия этогострока " (копия).Строка, таким образом, высвобождается слишком часто, так как вы отпускаете ее в свой dealloc.

Согласно вашему источнику, я готов поспорить, что сбой происходит не в коде, который вы опубликовали, а на самом деле, когдаNSAutoreleasePool наконец освобождает строку.

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