Вызывает ли этот звонок сбой инструменты? - PullRequest
0 голосов
/ 03 марта 2011

У меня есть класс с именем CategoryViewController, и его метод viewDidLoad вызывает этот метод:

  - (void)reset {
    Category * c = [[Category alloc] initWithId:0 title:@"Categories"];
    [self setCategory:c];
    [c release];  // <--- line of code I am interested in
    self.title = @"Categories";
    [self fillCategory];
}

В большинстве случаев категория здесь будет иметь значение null, но иногда необходимо вызывать сброс после назначения категории.Без строки, отмеченной в моем коде, программа прекрасно отлаживает и отлаживает, и я могу проверять инструменты и проверять утечки.Единственная утечка, которую я могу найти, - это категория, инициализированная из этой функции (потому что без выпуска я получаю утечку при вызове этой функции на CategoryViewController, который уже был инициализирован).

Если я попытаюсь запустить этот метод, как есть, с выпуском С, инструменты, XCode и симулятор начнут работать странно, вылетая и зависая, давая мне случайные SIGABRT и SIGKILL.Я могу собрать и отладить строку кода, но Instruments даже не запустит мое приложение.Кто-нибудь может дать мне подсказку о том, что здесь происходит?

РЕДАКТИРОВАТЬ: больше код

@implementation Category
@synthesize title, articleCount, seeAlso, categoryId, articles, subcategories;

- (id)initWithId:(NSInteger)cid title:(NSString*)t{
    self.title = t;
    self.categoryId = cid;
    [self setArticles:[[NSMutableArray alloc] init]];
    [self setSubcategories:[[NSMutableArray alloc] init]];
    [self setSeeAlso:[[NSMutableArray alloc] init]];
    self.articleCount = 0;
    return self;
}

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Забавно, что эти вещи так легко решаются после того, как вы нашли время опубликовать их в Интернете. После публикации кода инициализации категории я понял, что не правильно высвобождаю выделенные средства. Мои утечки, а также сбои, похоже, исчезли после правильного управления памятью, например, так:

- (id)initWithId:(NSInteger)cid title:(NSString*)t{
    self.title = t;
    self.categoryId = cid;
    NSMutableArray * m = [[NSMutableArray alloc] init];
    [self setArticles:m];
    [m release];
    m = [[NSMutableArray alloc] init];
    [self setSubcategories:m];
    [m release];
    m = [[NSMutableArray alloc] init];
    [self setSeeAlso:m];
    [m release];
    self.articleCount = 0;
    return self;
}
0 голосов
/ 03 марта 2011

Предполагая, что ваша собственность объявлена, как показано ниже, я не вижу проблем ни с выделенной вами строкой, ни с остальной частью вашего кода:

@property (retain) Category *c;

Просто стрелял в темноте, но в прошлый раз, когда Xcode, Instruments и Simulator делали сумасшедшие вещи, у меня происходила бесконечная рекурсия.

Вы уверены, что ваш метод fillCategory как-то не вызывает ваш метод viewDidLoad или reset?
Что происходит, когда вы устанавливаете точку останова в первой строке вашего reset метода и пошагово выполняете свой код?

...