Запуск статического анализа с помощью clang в XCode 3.2 и Инструмент анализа Никиты Жука Я часто сталкивался с этой парой предупреждений:
Метод возвращает объект Objective C с счетом сохранения +0 (ссылка не принадлежит)
Неправильное уменьшение счетчика ссылок объекта на данный момент не принадлежит вызывающей стороне
Пример кода, который может вызвать это предупреждение:
UIButton* button = [[UIButton buttonWithType:UIButtonTypeCustom] initWithFrame: CGRectMake(x, y, width, height)];
return button;
Я предположил, что созданные таким образом кнопки автоматически высвобождаются, как и любой другой объект NSObject, созданный с помощью удобного фабричного метода. Поэтому я возвращаю его, и вызывающий абонент может решить, сохранить его или нет. Что за проблема с этим?
Обязан ли я сохранять и автоматически освобождать объект перед его возвратом?
И самое главное, может ли это предупреждение быть предупреждением когда-либо причиной страшных аварий, связанных с выбросами?
Теперь я понимаю, что это, кажется, происходит только с кнопками UIB. Это из-за того, что это кластер классов?
РЕДАКТИРОВАТЬ: фрагмент кода ниже показывает минимальный случай, когда clang выдает эти предупреждения (с предупреждениями, выделенными жирным шрифтом). Оба предупреждения отмечены в операторе, создающем объект (сообщение buttonWithType:
).
-(UIButton*) ztupidTezt:(UIImage*) img
{
UIButton* bt = [[UIButton buttonWithType:UIButtonTypeCustom]initWithFrame:
1
Метод возвращает объект Objective-C с счетом сохранения +0 (ссылка не принадлежит)
2
Неверное уменьшение счетчика ссылок объекта на данный момент не принадлежит вызывающей стороне
CGRectMake(0.0f, 0.0f, img.size.width, img.size.height)];
bt setImage:img forState:UIControlStateNormal];
return bt;
}