Этот вопрос следует из предыдущего вопроса, который поднял еще одну проблему. То, что я пытаюсь понять, только тогда, когда создаются указатели и объект в этом примере, и что в конечном итоге происходит с ними. Я все еще пытаюсь обойти это, поэтому, пожалуйста, извините любые ложные предположения, которые я, возможно, сделал.Сеттер для 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?
У меня есть вопрос о 5/E. В этом случае это утечка памяти? Что происходит с постоянными строками? Как память для них восстановлена? – jergason
Большое спасибо, отлично. Что касается (5/E), я бы предположил, что он просто автоматически уничтожается (автоматически), когда он выходит из сферы действия, но это просто предположение, поскольку я делаю это в течение 8 дней :) – fuzzygoat
Это не утечка памяти. Вы не возвращаете память из строковых констант - они сохраняются на протяжении всей программы. Для строковых констант код для их создания испускается компилятором (и, следовательно, является частью исполняемого двоичного файла) - в частности, они хранятся в области, известной как «сегмент данных» двоичного файла (сохраняются программные инструкции в «текстовом сегменте»). Поэтому вам не нужно беспокоиться о «освобождении» или «утечке» строковых констант. (Это, по крайней мере, относится к C и C-производным языкам, таким как ObjC.) – mipadi