@ "" тип строки и освобождение объекта у вас нет вопроса - PullRequest
3 голосов
/ 20 июля 2011

Нубский вопрос.

если у меня есть строка @ "Здравствуйте, я строка". @ "" это объект? что это ? где хранится?

Что произойдет, если я отпущу объект, который не создал? или каковы его осложнения?

NSString *string1 = [[NSString alloc] initWithString:@"string"];
NSString *string2 = string1;
[string2 release];

еще один вопрос, в чем разница?

NSString *string1 = [[NSString alloc] initWithString:@"string"];
NSString *string2 = @"string";

Я знаю, что я нуб, но я просто хочу знать.

Заранее спасибо

EDIT:

Я хотел сказать, чтобы выделить initWithString вместо stringWithString

Ответы [ 4 ]

6 голосов
/ 20 июля 2011

Никогда не выпускайте объекты, которые вам не принадлежат.Правило довольно простое: вы владеете объектом только в том случае, если получили его с помощью new, alloc, retain или copy (сокращенно NARC).

Объекты, полученные любым другим методомдолжен быть возвращен автоматически освобожден.Это означает, что объект будет автоматически освобожден при следующей загрузке пула автоматического выпуска.Если вы хотите сохранить объект, вам нужно retain it, затем release it.Если вам все равно, будет ли объект освобожден после того, как вы закончили использовать его в текущей области, то ничего с ним не делайте.

Итак, чтобы подвести итог:

  • Вы должны связать любой NARC с release
  • Вы должны , а не соединить любой не-NARC с release
  • Методы, отличные от NARC, вернутся autorelease d объекты
  • Вы должны retain любой autorelease d объект, если он вам нужен за пределами текущей области действия

Чтобы ответить на ваши конкретные вопросы:

  • @"Hello i am a string" - это объект.Это экземпляр NSConstantString, и он создается во время компиляции.Вы не можете и не должны release это.Он будет жить на протяжении всей жизни приложения.Посмотрите на этот вопрос , чтобы узнать больше об этом.
  • Если вы отпустите объект, который вам не принадлежит, вы уменьшите его счетчик хранения и вызовете сложности с кодом, который предполагаетоно не должно сохранять его.
4 голосов
/ 20 июля 2011

NSString *string2 = string1;

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

Из-за подробностей реализации ( внутренняя деталь реализации, которая не может быть верной во всех случаях и на которую никогда не следует полагаться ), это верно:

NSString *string1 = [NSString stringWithString:@"string"];
string1 == @"string"; // this is a true expression

Строковые константы - @ "dddd" - компилируются в двоичный файл компилятором. Они не могут быть освобождены, и есть только одна константа на уникальную строку. stringWithString: распознает константы и не создает новую копию.

Теперь, если бы вы сделали:

NSMutableString *string1 = [NSMutableString stringWithString:@"string"];
NSMutableString *string2 = string1;
[string2 release];

То, что скопирует @ "строку" в новый экземпляр NSMutableString, а строка1 будет указывать на этот объект.

Этот код, тем не менее, будет перевыпущен ([string1 release]; тоже будет), так как stringWithString: возвращает автоматически выпущенный объект.

Теперь, если бы вы:

NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"string"];
NSMutableString *string2 = string1;
[string2 release];

Тогда этот код является технически правильным с точки зрения количества сохраняемых данных; строковый объект будет освобожден. Но после release и string1, и string2 будут висячими указателями - то есть адрес, который они держат, больше не указывает на жизнеспособный объект и пытается сообщение либо приведет к неопределенным результатам.

1 голос
/ 20 июля 2011

Когда вы используете синтаксис @"", вы создаете объект. Это сокращение для создания неизменяемой строки, также известной как NSConstantString под обложками. Строковые константы хранятся в части сегмента данных двоичного файла приложения и загружаются в память вместе с кодом и используются во время выполнения.

Как уже упоминали другие, всякий раз, когда вы явно не выделяете место для объекта, вы не должны его освобождать. Каждый раз, когда вы переусердствуете с объектом, вы будете вызывать неожиданные и часто случайные проблемы в вашем приложении. Объяснение @ Раду точно.

1 голос
/ 20 июля 2011

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

Относительно вашего второго вопроса, есть хорошее обсуждение здесь .

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