2009-08-28 3 views
1

Этот вопрос следует из предыдущего вопроса, который поднял еще одну проблему. То, что я пытаюсь понять, только тогда, когда создаются указатели и объект в этом примере, и что в конечном итоге происходит с ними. Я все еще пытаюсь обойти это, поэтому, пожалуйста, извините любые ложные предположения, которые я, возможно, сделал.Сеттер для NSString, как он работает?

// MAIN 
int main (int argc, const char * argv[]) { 
    PlanetClass *newPlanet_01 = [[PlanetClass alloc] init]; 
    [newPlanet_01 setGeekName:@"StarWars"]; 
} 

.

// CLASS 
@interface PlanetClass : NSObject { 
    NSString *geekName; 
} 

- (NSString*) geekName; 
- (void) setGeekName:(NSString*)gName; 
@end 

.

// SETTER 
- (void)setGeekName:(NSString *)gName { 
    if (geekName != gName) { 
     [geekName release]; 
     geekName = [gName copy]; 
    } 
} 

(A) ... Когда экземпляр PlanetClass «newPlanet_01» сначала создается это экземпляр NSString изменяемый объект создан, или просто указатель возможного будущего объекта? Если это всего лишь указатель, то что я выпускаю позже в установщике как его просто указатель, а не указатель на объект?

(B) ... В приведенном выше примере «gName» является указателем на объект NSString @ «StarWars»?

(C) ... Далее это указатель geekName отличается от gName (т.е. если geekName делает уже не указывает на @ "StarWars")

(D) ... geekName релиз, что выпустили в первый раз, когда код запускается, я понимаю, что geekName - это просто указатель на то, что он не указывает ни на что. Или релиз просто не выпустит ничего в первый раз?

(E) ... Наконец geekName = [gName copy]; недавно выпущенному geekName теперь назначено указать копию gName, что происходит с оригинальным gName?

ответ

2
  1. Вы создаете указатель, который инициализируется nil. Если вы знакомы с C или Java, то nil в основном то же самое, что и NULL или null - это фактически указатель на ничего.
  2. Да. @"StarWars" называется «строковым литералом». Подумайте о строковой литературе как о «постоянной» строке, которая хранится программой, а gName (в данном случае) является указателем на ячейку памяти этой строки.
  3. Yep - эта строка гарантирует, что входящий gName не совпадает с переменной geekName объекта. Предположим, что проверки там не было, и gName и geekName указали на ту же строку - тогда следующая строка освободит эту строку, что может привести к тому, что строка следующая недействительна (это будет копирование выпущенной строки - очень плохо!).
  4. Предполагая, что geekName по-прежнему nil, тогда да, ничего не выпущено; или, скорее, сообщение release отправляется на объект nil, который ничего не делает с сообщением. (В отличие от C или Java, в Objective-C вы можете отправлять сообщения nil, но все такие сообщения игнорируются, а nil - это возвращаемое значение из всех таких сообщений).
  5. Вы создаете копию gName в случае gName является действительно экземпляром NSMutableString - вы не хотите другой код, чтобы мутировать строку, которую вы лечите, как неизменны. Но что происходит с оригиналом объектом, на который указывает gName? Ну, это зависит от того, что делает абонент.Он может быть выпущен, его можно сохранить, его можно передать другому объекту ... вы действительно не знаете. В этом конкретном случае, поскольку gName указывает на строковый литерал «StarWars», с этим объектом ничего не происходит (так как это строковый литерал - см. Выше). И сам указатель действителен только в рамках этого метода и уходит после возвращения метода.
+0

У меня есть вопрос о 5/E. В этом случае это утечка памяти? Что происходит с постоянными строками? Как память для них восстановлена? – jergason

+0

Большое спасибо, отлично. Что касается (5/E), я бы предположил, что он просто автоматически уничтожается (автоматически), когда он выходит из сферы действия, но это просто предположение, поскольку я делаю это в течение 8 дней :) – fuzzygoat

+1

Это не утечка памяти. Вы не возвращаете память из строковых констант - они сохраняются на протяжении всей программы. Для строковых констант код для их создания испускается компилятором (и, следовательно, является частью исполняемого двоичного файла) - в частности, они хранятся в области, известной как «сегмент данных» двоичного файла (сохраняются программные инструкции в «текстовом сегменте»). Поэтому вам не нужно беспокоиться о «освобождении» или «утечке» строковых констант. (Это, по крайней мере, относится к C и C-производным языкам, таким как ObjC.) – mipadi

 Смежные вопросы

  • Нет связанных вопросов^_^