Счетчик сохранения объекта — это деталь реализации, о которой вам не следует беспокоиться. Вы должны действительно беспокоиться только о том, когда вы получаете и теряете право собственности на объект. Вот почему:
+alloc
возвращает объект со счетчиком сохранения, равным 1. Однако вы немедленно отправляете ему сообщение инициализации, которое может вернуть вам совершенно другой объект. Например
NSString* foo = [[NSString alloc] initWithString: @"foo"];
Дает вам объект с числом сохранений равным 1, верно? Неверно в текущих реализациях Cocoa. Строка, возвращаемая +alloc, немедленно освобождается, и вместо нее возвращается ссылка на @"foo". Счетчик сохранения @"foo" равен INT_MAX
.
Сохранение объекта увеличивает количество его удержаний, верно? Возможно, но опять же отправка сохранения в постоянные строки не имеет никакого эффекта, и некоторые синглтоны также имеют нулевую реализацию сохранения.
Точно так же выпуск обычно влияет на количество удержаний, но опять же не обязательно по тем же причинам.
Отправка копии должна дать вам новый объект с числом сохранений равным 1, верно? Неправильный. Неизменяемые объекты могут реализовывать копирование, отправляя себя, а затем возвращая себя. В большинстве случаев это добавит единицу к счетчику сохранения, но, конечно, со строковыми константами ничего не происходит.
Если вы просто думаете о сохранении и освобождении прав собственности, все то, что я только что сказал, становится не относящимися к делу деталями реализации.
person
JeremyP
schedule
23.11.2010