Интернет магазин китайских планшетных компьютеров



Компьютеры - Objective-C - Создание и уничтожение объектов

06 июля 2011


Оглавление:
1. Objective-C
2. Синтаксис языка
3. Создание новых классов
4. Как работает механизм сообщений
5. Протоколы
6. Обработка исключений
7. Создание и уничтожение объектов
8. Управление памятью
9. Категории
10. Class objects и Objective-C runtime
11. Разное



В самом языке Objective-C нет специальных команд для создания и уничтожения объектов. Эта задача ложится на runtime-библиотеку и реализуется при помощи механизма посылки сообщений.

Реально используемой и наиболее широко распространенной схемой создания и уничтожения объектов в Objective-C является используемая в операционных системах NextStep и Mac OS X, которая и будет описана ниже.

Создание нового объекта разбивается на два шага — выделение памяти и инициализация объекта. Первый шаг реализуется методом класса alloc, который выделяет необходимое количество памяти. При этом в атрибут isa записывается указатель на class object соответствующего класса.

Обратите внимание, что сообщение alloc посылается class object-у требуемого класса и это сообщение возвращает указатель на выделенную под объект память.

Собственно сама инициализация объекта осуществляется другими методами, по традиции имена этих методов начинаются с init. Обычно такое сообщение посылается сразу же после сообщение alloc, по адресу, возвращенному этим сообщением.

id anObject =  init];

Приведённая выше конструкция является правильным способом создания объекта. Обратите внимание, что следующая конструкция может в ряде случаев не работать:

id anObject = ;
 
;

Это связано с тем, что для ряда классов метод init может вернуть совсем другой указатель.

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

При создании нового класса обычно нет необходимости переопределять метод alloc, а вот необходимость переопределения метода init возникает достаточно часто.

Обратите внимание, что метод init является обычным методом, ничем не выделяющимся среди остальных.

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

Довольно часто у объектов бывает сразу несколько методов, начинающихся с init, например init, initWithName:, initWithContentsOfFile: и т. д.

Установившейся практикой в таком случае является выделение среди всех init-методов одного, называемого designated initializer. Все остальные init-методы должны вызывать его и только он вызывает унаследованный init метод.

- initWithName:  theName   // designated initializer
{
    ;                        // call inherited method
 
    name = strdup ;
}
 
- init
{
    return ;
}

В ряде случаев оказывается удобным совместить выделение памяти и инициализацию объекта в один метод, например в классе NSString есть ряд методов класса, возвращающих уже готовый объект:

+  stringWithCString:cString encoding:enc
+  stringWithFormat:format, ...

Mac OS X для управления временем жизни объектов используют reference counting — каждый объект содержит внутри себя некоторый счетчик, при создании устанавливаемый в единицу.

Посылка объекту сообщения retain увеличивает значение этого счетчика на единицу.

Установившейся практикой является посылка объекту сообщения retain всеми, заинтересованными в нём сторонами, то есть если вы запоминаете ссылку на объект, то следует послать ему сообщение retain.

Когда объект перестает быть нужен, то ему просто посылается сообщение release.

Данное сообщение уменьшает значение счетчика на единицу и, если это значение стало меньше единицы, уничтожает данный объект.

Перед уничтожением объекта ему посылается сообщение dealloc, позволяющее объекту произвести свою деинициализацию. При этом это также является обычным сообщением и в нём Вы явно должны в конце вызвать унаследованную реализацию через.

-  dealloc
{
    . . .
    ;
}


Просмотров: 11402


<<< Mission Control
Photo Booth >>>