xcode, проанализировать ошибку при выделении

#objective-c #ipad #xcode4

#objective-c #iPad #xcode4

Вопрос:

Я получил сообщение об ошибке, но не уверен, как от него избавиться.

 -- Method returns an Objective-C object with a  1 retain count (owning reference)
  

и

 --Object allocated on line 46 is not referenced later in this execution path and has a retain count of  1 (object leaked)
  

для строк aAA и bBB

   ( CustConf* ) initEmptyCustConf { 
    CustConf* theObject = [[CustConf alloc] init];
    theObject.ID = 0;
    theObject.aAA= [[NSString alloc] initWithString:@""];
    theObject.Number_Ndx = 0;
    theObject.bBB = [[NSString alloc] initWithString:@""];

    return [theObject autorelease];
}
  

Ответ №1:

В [[NSString alloc] initWithString:@""]; этом нет необходимости. Просто используйте @"" .

Измените свой initEmptyCustConf на этот:

   (CustConf *) initEmptyCustConf { 
    CustConf *theObject = [[CustConf alloc] init];
    theObject.ID = 0;
    theObject.aAA = @"";
    theObject.Number_Ndx = 0;
    theObject.bBB = @"";
    return [theObject autorelease];
}
  

Комментарии:

1. хорошо, но почему? (извините, если это было базовым) Автоматически ли для объекта, поступающего из [CustConf alloc] init, автоматически сохраняется значение 1?

2. Я не уверен, можете ли вы показать код для файла CustConf.m? Тогда я мог видеть, но простое выделение должно дать вам количество сохранений 1, тогда автоматическое освобождение (что является правильным решением) будет -1 когда-нибудь в будущем. Так что все правильно. Это должно быть что-то в методах alloc or init CustConf класса.

3. Вопрос больше о theObject. aAA = @»» по сравнению с объектом. aAA =[[NSString alloc] initWithString:@»»] Даже если мне нужно установить значение, выделять его не нужно? [[NSString alloc] initWithString:@»Мое значение int»];

4. Правильно, поскольку это свойство CustConf , класс уже сохраняет его, и поэтому передача ему выделенной строки приведет к утечке.

5. В любое время @Franck! Рад помочь.

Ответ №2:

Я предполагаю, что вы определили сохраненные свойства для класса CustConf. Поскольку объект автоматически сохранит строки aAA и bBB, и вы не выпустили их в коде до завершения метода, вы в конечном итоге потеряете память.

   ( CustConf* ) initEmptyCustConf { 
    CustConf* theObject = [[CustConf alloc] init];
    theObject.ID = 0;
    theObject.aAA= [[NSString alloc] initWithString:@""]; //potential leak
    theObject.Number_Ndx = 0;
    theObject.bBB = [[NSString alloc] initWithString:@""]; //potential leak

    return [theObject autorelease];
}
  

Чтобы исправить это, вам необходимо явно освободить строки, назначенные объекту.aAA и theObject.bBB через release / autorelease или просто используйте строковые константы.

   ( CustConf* ) initEmptyCustConf { 

   CustConf* theObject = [[CustConf alloc] init];
    theObject.ID = 0;
    theObject.aAA= @"";
    theObject.Number_Ndx = 0;
    theObject.bBB = @"";

    return [theObject autorelease];
}
  

Кроме того, если ваш метод начинается с «init», обычно возвращается сохраненный объект, поэтому либо удалите авторелиз в конце, либо измените имя метода, чтобы отразить характер вашего метода.

Комментарии:

1. init не возвращает сохраненный объект, alloc , copy и new do .

2. На самом деле анализатор должен жаловаться на это. Попробуйте.

3. Вернулся чистым. Я согласен, что имя метода не подходит и его не следует использовать, но init не возвращает сохраненный объект, он возвращает self замену self or nil . Если init возвращенный сохраненный объект [[NSObject alloc] init] будет равен 2