я должен выпустить экземпляр NSString, который я не создал? - PullRequest
1 голос
/ 03 февраля 2011

Например, строка была возвращена из NSDictionary, что, в свою очередь, считывало ее из файловой системы.
Таким образом, мы не знаем, была ли строка создана с помощью [NSString stringWith...] или [[NSString alloc] initWith...] или любым другим способом.

Как вы вообще знаете, несете ли вы ответственность за освобождение возвращаемого объекта, если API не упоминает об этом?

PS Я видел подобные вопросы здесь, но в основном они имеют дело с константами @"" или явно созданными строками.

Ответы [ 4 ]

3 голосов
/ 03 февраля 2011

Нет, вы должны выпускать только те экземпляры, которые вы alloc 'd, retain' d, copy 'd или new' d.

2 голосов
/ 03 февраля 2011

См. Правила управления памятью какао . Если вы можете позволить себе прочитать только одну часть документации, это одна :) И есть также статический анализатор (Build → Build and Analyze), который довольно хорошо работает с правилами управления памятью, он должен быть способен уловить ты скучаешь.

1 голос
/ 03 февраля 2011

Доступ к членам словаря осуществляется через -objectForKey:, поэтому вы не несете ответственности за их освобождение. Словарь был единственным объектом в этом примере, который вы создали напрямую. Если вы сделали это с помощью метода alloc, copy или new (например, [[NSDictionary alloc] initWithContentsOfFile:…]), вы должны отменить его. Если он пришел откуда-то еще, включая одну из [NSDictionary dictionary…] фабрик, у вас нет ссылок на него и вам не нужно его выпускать.

1 голос
/ 03 февраля 2011

Практическое правило Objective-C: если ваш код выполняет выделение / копирование / сохранение для инициализации объекта, вам необходимо освободить его, поскольку вы являетесь владельцем.Если вы не выполняете alloc / copy / retain для инициализации объекта (например, с помощью метода для получения экземпляра), то вы не являетесь владельцем и не должны освобождать объект.

В этом случае вы не создали строку, поэтому не несете ответственности за ее освобождение.Вам не нужно беспокоиться о том, как строка была инициализирована при ее создании и добавлении в NSDictionary (если только вы сами не создаете и не добавляете ее в словарь).С большинством объектов коллекции они берут на себя ответственность за объекты, которые к ним добавляются, и, таким образом, они несут ответственность за освобождение объектов под свою опеку.

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