Я использовал встроенный Java Oracle для двух проблем:
1), Чтобы сделать процедуру PLSQL, которая увеличивает объем результатов запроса в текстовом файле и отправляет его по FTP. Этот файл был очень большим, и я использую Java для Архивирования его.
2) В приложении клиент-сервер с прямым подключением с DB, для сравнения пользователя, отправленного пароль в приложение (не пароль пользователя DB) хешированный с MD5, так, чтобы пароль не переместился сетью в простом тексте. Я не уверен, было ли это лучшим решением для этой проблемы, я собираюсь спросить его теперь.:)
Хорошо. Я подтвердил, что не установка B на ноль помогала. Итак, теперь я не проверяю nil при создании контроллера B (когда я хочу перейти к нему).
Вместо этого я отпускаю B, затем создаю контроллер и назначаю его B. Затем в методе A viewDidAppear я отпускаю B.
Я считаю, что этот поток теперь закрыт. Спасибо!
Другие адекватно ответили на вопросы 1-6.
(7) Apple рекомендует использовать переменную экземпляра непосредственно как в init, так и в dealloc. В первую очередь это связано с тем, что объект (особенно если он является подклассом) только частично настраивается во время обоих этих методов, и поэтому вызов сеттеров / геттеров может привести к неправильному поведению, если они имеют что-либо, кроме тривиальных действий. Как правило, вы можете безопасно получить доступ к ivar напрямую (а не через геттер) в своем объекте, и это будет немного более эффективно (актуально только для iPhone). Как правило, вы должны использовать сеттер во всех случаях, особенно если ваш объект может быть подклассом или если другие могут наблюдать за свойством.
(8) Вы никогда и никогда не вызываете dealloc (кроме [super dealloc] из метода dealloc). Если у вас есть право собственности на другой объект, вам следует отказаться от этого права собственности (путем вызова release или autorelease). Затем система вызовет функцию dealloc для объекта, если это необходимо. Но вы никогда сами не называете dealloc. Прочтите правила управления памятью (их всего 9 абзацев, и их необходимо понимать).
Вам, вероятно, следовало бы разделить этот вопрос на несколько разных вопросов, но я укусил.
-dealloc
, то, вероятно, нет. Если это объект, привязанный к определенному методу, то, вероятно, нет. Если это ивар, который используется повторно, я бы сказал да. В первых двух случаях ничего не произойдет, если вы не установите указатели в ноль, поскольку обычно вы больше не сможете получить доступ к этим указателям. Однако в последнем случае вы все еще можете получить доступ к указателю, который указывает на освобожденную память. Если вы отправите ему сообщение или попытаетесь разыменовать его, ваше приложение выйдет из строя. nil
используется для указателей объектов, а NULL
используется для любых других указателей, но их смешивание не вызовет никаких проблем. self-> ivar
. Фактически, когда вы набираете только ivar
, компилятор неявно добавляет разыменование self ->
. -dealloc
происходит при вызове [super dealloc];
в ваших собственных методах -dealloc
. Для любых других объектов вы всегда должны просто вызывать -release
. 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])