Объект с +0 счетами удержания возвращается вызывающей стороне, где ожидается +1 (владеющий) счет удержания - PullRequest
6 голосов
/ 24 августа 2010

У меня есть набор классов, созданных www.sudzc.com (потрясающий инструмент создания прокси-сервера WDSL для iPhone / Flex / Javascript).

Когда я запускаю CMD + SHIFT + A для проверки утечек памяти, я получаю следующее сообщение:

Объект с +0 счетами сохранения возвращается вызывающей стороне, где +1 (владение) ожидаемый счет

Вот метод, для которого оно возвращает это сообщение:

// Static method for initializing from a node.
+ (id) newWithNode: (CXMLNode*) node
{
    return (id)[[[SoapObject alloc] initWithNode: node] autorelease];
}

Я не хочу отправлять сообщение с этим кодом, и ему потребуетсябудет многократно обновляться через проект, так как меняются веб-сервисы, и мне нужно обновить прокси-классы.

Есть идеи?

Заранее спасибо.

Джейсон

Ответы [ 3 ]

12 голосов
/ 24 августа 2010

Анализатор жалуется, потому что руководство по управлению памятью требует, чтобы ...

Вы «создаете» объект, используя метод, имя которого начинается с «alloc» илиновый »или содержит« копию ».

Какао и Objective-C в значительной степени полагаются на соглашение, вы должны приложить все усилия, чтобы следовать этому.Включите «обрабатывать предупреждения как ошибки» и устраните проблему.Хотя вы можете быть единственным человеком, работающим над этим сейчас, если в какой-то момент другой разработчик будет использовать ваши методы, вполне вероятно, что они будут следовать рекомендациям по управлению памятью и в конечном итоге перевыпускать объект, возвращенный этим методомприложение).

5 голосов
/ 24 августа 2010

Метод помечен, потому что имя метода имеет префикс «new». Статический анализатор просто комментирует, что, применяя обычные соглашения об именах методов, можно ожидать, что этот метод возвратит объект, который вы должны освободить, а не объект с автоматическим освобождением.

«Нормальное» соглашение об именах для таких методов заключается в добавлении метода к имени класса, например, если этот метод был определен для класса с именем Widget:

@interface Widget : NSObject {
}
+ (id)widgetWithNode:(CXMLNode*)node; // Returns an object that has been autoreleased.
- (id)initWithNode:(CXMLNode*)node; // Returns an object you are expected to release.
@end

Если вы используете метод правильно (то есть вы учитываете тот факт, что он возвращает автоматически выпущенный объект), то вы можете просто проигнорировать это предупреждение.

0 голосов
/ 24 августа 2010

Если у вас есть имя метода, в котором должно быть что-то вроде «new» или «copy», и вы знаете, что предупреждение недопустимо - вы можете устранить предупреждение, включив подсказку LLVM о том, что класс действительно в порядке,

В заголовочном файле сначала добавьте это (обычно вверху, но это может быть где угодно):

#ifndef __has_feature      // Optional.
#define __has_feature(x) 0 // Compatibility with non-clang compilers.
#endif

#ifndef NS_RETURNS_NOT_RETAINED
#if __has_feature(attribute_ns_returns_not_retained)
#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
#else
#define NS_RETURNS_NOT_RETAINED
#endif
#endif

Затем в конце объявления вашего метода добавьте так:

+ (id) newWithNode: (CXMLNode*) node NS_RETURNS_NOT_RETAINED;

Вы можете найти список других подсказок (действительно атрибутов), которые вы можете передать LLVM здесь:

http://clang -analyzer.llvm.org / annotations.html

...