#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
orinit
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
ornil
. Еслиinit
возвращенный сохраненный объект[[NSObject alloc] init]
будет равен 2