Как освободить или обнулить объект, приведенный к типу? - PullRequest
0 голосов
/ 19 ноября 2009

Я немного смущен объектами, которые инициализируются при помощи приведения типов. Как

UITextField *txtFld = (UITextField *)[self.view viewWithTag:someTag];
//
//
//some code here for this text field usage
//
//

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

Теперь в случае объектов класса базы данных (с использованием sqlite) я создаю объект, подобный

DatabaseClass *dbObj = (DatabaseClass *)[[appDelegateObject dbObjArray] objectAtIndex:index];

Должен ли я установить его на ноль после того, как я закончу с этим объектом

или должен инициализировать объект как:

DatabaseClass *dbObj = (DatabaseClass *)[[[appDelegateObject dbObjArray] objectAtIndex:index] retain];

, затем отпустите его и, наконец, установите в ноль.

Ответы [ 3 ]

2 голосов
/ 19 ноября 2009

Кастинг здесь не имеет значения, важно то, как вы получаете ссылку на объект. Здесь есть хороший вопрос SO: Понимание подсчета ссылок с помощью Cocoa и Objective-C , которое охватывает вопросы сохранения / выпуска. По сути, вам не нужно ничего делать в этих случаях, так как вы возвращаете объекты, которые не принадлежат вам.

2 голосов
/ 19 ноября 2009

Когда вы набираете cast таким образом, новый объект не создается. Он просто сообщает компилятору, что объект, который вы используете, должен обрабатываться так, как если бы он был, в данном случае, DatabaseClass *.

Так что в этом случае я считаю, что viewWithTag: вернет объект, с которым вам не нужно ничего делать, чтобы удерживать / освобождать, если вы не хотите хранить его как ивару.

Надеюсь, это поможет.

0 голосов
/ 19 ноября 2009
  1. Вам не нужно разыгрывать тип. Objective-C - это динамический язык. Пожалуйста, исправьте меня, если выдается предупреждение компилятора

     DatabaseClass = *dbObj = [[appDelegateObject dbObjArray] objectAtIndex:i];
    
  2. Все методы должны возвращать автоматически освобожденные объекты в Какао. Исключения: все методы копирования и все методы alloc.

    Поэтому лучше не сохранять / освобождать их, потому что они автоматически выпущены.

  3. Установка переменных на nil оказывает влияние только в среде с сборкой мусора. Пока вы программируете для iPhone, это не имеет значения для вас.

    Но даже в настройках среды сборки мусора переменная nil не требуется, поскольку компилятор должен иметь возможность автоматически определять, какие переменные больше не нужны.

    Есть исключение из этого. Вы можете, а иногда и должны установить свойство экземпляра на nil в среде GC.

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