нуб здесь - объективный указатель C, имеющий разные адреса? - PullRequest
3 голосов
/ 28 апреля 2011
NSString *msgg = [NSString alloc];
NSLog(@" address that msgg is holding is %p ", msgg);
msgg = [msgg init];
NSLog(@" address that msgg is holding is %p ", msgg);

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

Экземпляр также создается в том же пространстве. Поэтому я ожидаю, что адрес останется прежним. Но мой вывод на консоль выглядит следующим образом. Обратите внимание, что адреса отличаются

BasicObjC[3064:10b]  address that msgg is holding is 0x103340 
BasicObjC[3064:10b]  address that msgg is holding is 0xa0289328

Ответы [ 3 ]

2 голосов
/ 28 апреля 2011

В «нормальных» классах это должно быть правдой (но вы не должны зависеть от этого).Но в случае с NSString (и на самом деле со многими классами данных Apple: NSData, UIImage) этот класс на самом деле является «кластером классов».Вы используете объект с именем «NSString», но возвращаемый класс является секретным другим классом (скорее всего, NSCFString).За NSString существуют другие секретные классы.Когда вы выделяете NSString, он создает «фиктивный» объект, а затем, когда вы вызываете init с определенным значением, он определяет секретный класс, который он на самом деле хочет вам дать (отсюда и другой адрес).

Aболее понятным примером будет UIImage.UIImage может быть создан с различными типами изображений (png, jpg и т. Д.).Для вас это просто выглядит как UIImage, но когда вы вызываете init, он на самом деле возвращает отдельный подкласс для каждого типа изображения, на которое вы ссылаетесь.

2 голосов
/ 28 апреля 2011

Нет гарантии, что экземпляр, возвращаемый +alloc, является тем же экземпляром, который возвращается последующим инициализатором (например, -init).

Например, один из инициализаторов в NSString может вернуть буквенную строку, которая была предварительно выделена. В этом случае экземпляр, созданный с помощью +alloc, освобождается, а инициализатор возвращает адрес буквальной строки.

1 голос
/ 28 апреля 2011

Причина, по которой мы всегда вкладываем сообщения -alloc и -init, заключается в том, что -init не должен возвращать себя.Вы можете вернуть только что созданный объект.

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