Разница между [[NSMutableDictionary alloc] initWithObjects: ...] и [NSMutableDictionary dictionaryWithObjects: ...]? - PullRequest
2 голосов
/ 12 июля 2009

Все еще изучаю Objective-C / iPhone SDK здесь. Я думаю, что знаю, почему это не сработало, но я просто хотел подтвердить.

В awakeFromNib, если я использую [[NSMutableDictionary alloc] initWithObjects:...], он фактически выделяет (iPhone) системную память с этими NSMutableDictionary данными, но когда я использую [NSMutableDictionary dictionaryWithObjects:...], это доступно только в стеке, верно?

Например, в будущем, если я попытаюсь получить доступ к myMutableDict с помощью нажатия кнопки через IBAction, объект myMutableDict мог быть освобожден, что привело к сбою моего приложения, даже если я определил его так, как я .h файл и синтезировал его:

@property (nonatomic, retain) NSMutableDictionary *myMutableDict;

По какой-то причине изменение на [[NSMutableDictionary alloc] initWithObjects:...] исправило это.

Ответы [ 2 ]

15 голосов
/ 12 июля 2009

+dictionaryWithObjects: возвращает автоматически выпущенный словарь
-initWithObjects: ты должен освободить себя

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

Отличным ресурсом по этой теме является Руководство по программированию управления памятью для какао .

3 голосов
/ 12 июля 2009

Если продолжить с другим ответом, вам не хватает нескольких тонких вещей.

Во-первых, в Objective-C нет такой вещи, как объекты стека. Все объекты живут в куче, и одна форма, как уже упоминалось, «автоматически освобождена».

Кроме того, вы, вероятно, устанавливаете переменную вашего экземпляра напрямую, минуя управление памятью от вашего @synthesize d аксессора и мутатора. Вместо этого:

myMutableDict = [NSMutableDictionary dictionaryWithObjects:...];

вы, вероятно, должны сказать

self.myMutableDict = [NSMutableDictionary dictionaryWithObjects:...];

или вы должны вручную добавить сохранение или удалить авто-релиз, как вы обнаружили.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...