NSMutableDictionary - "Неверное уменьшение счетчика ссылок объекта ..." - PullRequest
1 голос
/ 21 июля 2011

У меня есть свойство в заголовочном файле как

@property (nonatomic,retain) NSMutableDictionary* e;

и в моем viewDidLoad: метод выделил его как

self.e = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL];.

Статический анализатор XCode запущен и, очевидно, говорит 'Potential leak of an object...'. Но когда я освобождаю объект ([self.e release] в dealloc), ошибка сохраняется, но теперь он также говорит, что существует «неправильное уменьшение счетчика ссылок», и что этот объект не принадлежит вызывающей стороне (мой viewController) .

Ошибка «неправильный декремент ...» исчезает, когда я заменяю [self.e release] просто [e release]. Но прежняя ошибка о потенциальной утечке все еще существует. В чем проблема?

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Это утверждение:

self.e = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL];

- это чрезмерно удерживающий объект. И alloc-init, и свойство сохраняют объект.

С точки зрения владения, вы владеете объектом, возвращаемым alloc-init, и, отправив ему сообщение сохранения в методе доступа к свойству, вы снова заявляете о владении им, что приводит к чрезмерному сохранению объекта .

Вы можете использовать вспомогательный конструктор , который возвращает объект yo не владеющий , и позволяет владельцу свойства претендовать на владение им:

self.e = [NSMutableDictionary dictionaryWithContentsOfURL:myURL];

Или воспользуйтесь автоматическим выпуском:

self.e = [[[NSMutableDictionary alloc] initWithContentsOfURL:myURL] autorelease];

Или используйте временную переменную:

NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL];
self.e = tempDict;
[tempDict release];
0 голосов
/ 21 июля 2011

Проблема:

self.e = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL];

ваша собственность e имеет установленный флаг сохранения. Поэтому, после того, как он сохранит его, вы увеличите количество сохраненных на два. Вы должны освободить объект после передачи его в собственность.

self.e = [[[NSMutableDictionary alloc] initWithContentsOfURL:myURL] autorelease];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...