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

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

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

Возвращен объект с +0 счетчиками сохранения. com (отличный инструмент для создания прокси-сервера WDSL для iPhone / Flex / Javascript).

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

Возвращен объект с +0 счетчиками сохранения. com (отличный инструмент для создания прокси-сервера WDSL для iPhone / Flex / Javascript).

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

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

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

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

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

Есть идеи?

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

Джейсон

6
задан JasonBub 24 August 2010 в 03:34
поделиться

3 ответа

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

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

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

12
ответ дан 8 December 2019 в 13:43
поделиться

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

«Обычное» соглашение об именах для таких методов - это префикс метода с именем класса, например, если этот метод был определен для класса с именем 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

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

5
ответ дан 8 December 2019 в 13:43
поделиться

Если у вас есть имя метода, в котором должно быть что-то вроде "новый" или "копировать", и вы знаете, что предупреждение недопустимо, вы можете удалить предупреждение, включив подсказку 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

0
ответ дан 8 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: