Выпуск, Dealloc, и Сам ссылка

Я использовал встроенный Java Oracle для двух проблем:

1), Чтобы сделать процедуру PLSQL, которая увеличивает объем результатов запроса в текстовом файле и отправляет его по FTP. Этот файл был очень большим, и я использую Java для Архивирования его.

2) В приложении клиент-сервер с прямым подключением с DB, для сравнения пользователя, отправленного пароль в приложение (не пароль пользователя DB) хешированный с MD5, так, чтобы пароль не переместился сетью в простом тексте. Я не уверен, было ли это лучшим решением для этой проблемы, я собираюсь спросить его теперь.:)

33
задан JasonMArcher 29 November 2014 в 03:27
поделиться

4 ответа

Хорошо. Я подтвердил, что не установка B на ноль помогала. Итак, теперь я не проверяю nil при создании контроллера B (когда я хочу перейти к нему).

Вместо этого я отпускаю B, затем создаю контроллер и назначаю его B. Затем в методе A viewDidAppear я отпускаю B.

Я считаю, что этот поток теперь закрыт. Спасибо!

0
ответ дан 27 November 2019 в 18:37
поделиться

Другие адекватно ответили на вопросы 1-6.

(7) Apple рекомендует использовать переменную экземпляра непосредственно как в init, так и в dealloc. В первую очередь это связано с тем, что объект (особенно если он является подклассом) только частично настраивается во время обоих этих методов, и поэтому вызов сеттеров / геттеров может привести к неправильному поведению, если они имеют что-либо, кроме тривиальных действий. Как правило, вы можете безопасно получить доступ к ivar напрямую (а не через геттер) в своем объекте, и это будет немного более эффективно (актуально только для iPhone). Как правило, вы должны использовать сеттер во всех случаях, особенно если ваш объект может быть подклассом или если другие могут наблюдать за свойством.

(8) Вы никогда и никогда не вызываете dealloc (кроме [super dealloc] из метода dealloc). Если у вас есть право собственности на другой объект, вам следует отказаться от этого права собственности (путем вызова release или autorelease). Затем система вызовет функцию dealloc для объекта, если это необходимо. Но вы никогда сами не называете dealloc. Прочтите правила управления памятью (их всего 9 абзацев, и их необходимо понимать).

8
ответ дан 27 November 2019 в 18:37
поделиться

Вам, вероятно, следовало бы разделить этот вопрос на несколько разных вопросов, но я укусил.

  1. Да, любое сообщение, отправленное на nil, не выполняется.
  2. Нет. Объект с счетчиком ссылок 0 был или неизбежно будет уничтожен, и любые отправленные ему сообщения вызовут сбой или, в лучшем случае, исключение.
  3. Это зависит от ситуации. Если вы выпускаете вещи в -dealloc , то, вероятно, нет. Если это объект, привязанный к определенному методу, то, вероятно, нет. Если это ивар, который используется повторно, я бы сказал да. В первых двух случаях ничего не произойдет, если вы не установите указатели в ноль, поскольку обычно вы больше не сможете получить доступ к этим указателям. Однако в последнем случае вы все еще можете получить доступ к указателю, который указывает на освобожденную память. Если вы отправите ему сообщение или попытаетесь разыменовать его, ваше приложение выйдет из строя.
  4. Оба они равны 0. По соглашению nil используется для указателей объектов, а NULL используется для любых других указателей, но их смешивание не вызовет никаких проблем.
  5. Если вы хотите вызвать свойство getter / setter, тогда да. Если вы хотите получить доступ к ivar, который он инкапсулирует напрямую (редко), №
  6. Нет, вы можете получить доступ к переменным экземпляра, используя синтаксис self-> ivar . Фактически, когда вы набираете только ivar , компилятор неявно добавляет разыменование self -> .
  7. Не уверен, что вы здесь имеете в виду.
  8. Единственный раз, когда вы должны быть вызов -dealloc происходит при вызове [super dealloc]; в ваших собственных методах -dealloc . Для любых других объектов вы всегда должны просто вызывать -release .
11
ответ дан 27 November 2019 в 18:37
поделиться

A1) [nil release] в порядке (ничего не будет делать)

A2) Нет. Не прикасайтесь к объектам после того, как они были освобождены. Они должны быть установлены в nil после того, как они будут освобождены.

A3) Нет необходимости устанавливать освобожденный указатель в nil, но вы получаете висячие указатели (то есть вы не можете определить, действителен объект или нет). Установка свойства на nil часто используется для освобождения базового ivar, поэтому невыполнение этого может вызвать утечку памяти.

A4) nil и NULL равны нулю, поэтому технически они одинаковы.

A5) Да, вы необходимо использовать self.someProperty для свойств, как если бы вы использовали [self someProperty] , если бы это был просто метод

A6) self по сути является структурой, поэтому вы можете получить доступ ivars примерно так: self-> someIvar . Однако в этом нет необходимости.

A7) Когда вы не хотите запускать методы установки / получения по какой-либо причине. Я использую его иногда, когда установщик не разрешает значения nil, и мне нужно освободить переменную

A8). Dealloc вызывается автоматически, когда release вызывается правильное количество раз. Никогда не следует вызывать dealloc напрямую (за исключением [super dealloc])

19
ответ дан 27 November 2019 в 18:37
поделиться
Другие вопросы по тегам:

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