"Присвоение сохраненного объекта слабому свойству" с помощью init? - PullRequest
0 голосов
/ 22 января 2019

Играя с ARC, я заметил, что когда у меня слабая строка:

@property (weak, nonatomic) NSString *myString;

А потом, если бы я сделал это:

self.myString = [[NSString alloc] init];

или даже

[[NSString alloc] initWithString:@""]

Xcode немедленно предупреждает меня: «Назначение сохраненного объекта слабому свойству; объект будет освобожден после назначения». И хотя я могу это понять, поскольку его счетчик ссылок равен 0, почему это работает без предупреждений:

self.myString = @"";

Какая разница для ARC?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Для «ОК», так почему же отображается то же предупреждение, если я делаю это: [[NSString alloc] initWithString:@""]? «

Когда вы используете [[NSString alloc] initWithString:@""], система создаст новую строку с @ "", и она будет размещена в куче памяти.

0 голосов
/ 22 января 2019

Потому что, когда у вас слабое свойство, ARC не увеличивает счетчик ссылок ...

Поэтому, когда вы пишете:

self.myString = [[NSString alloc] init];

ARC добавляет release сразу после,потому что это то же самое, что и запись:

[[NSString alloc] init];

Основное отличие от @"" состоит в том, что это статическая строка, в некотором смысле сохраненная в другом месте ...

Каждый раз, когда выиспользуйте @"", это указывает на тот же объект.

Редактировать : Разница между @"" и [[NSString alloc] initWithString:@""] состоит в том, что первый является статической строкой иобрабатывается во время компиляции.Если он используется в другом месте, другое использование будет указывать на ту же статическую строку.Второе, обрабатывается во время выполнения.Он действительно создает новый объект с его счетом сохранения и т. Д. Вот почему ARC выполняет свою работу для созданного экземпляра (вы конкретно называете alloc) и почему он не заботится о статических строках.

...