MyiVar = nil поддерживается в ARC? - PullRequest
2 голосов
/ 13 декабря 2011

Я использую фрагмент кода как

if ([Array count] != 0) {
    Array = nil;
}
Array = [[NSMutableArray alloc]init];

Это разрешено при использовании ARC? Это вызывает какие-либо сбои? Почему я делаю это каждый раз, когда мой метод вызывается Array, получает новый набор данных. Я использую этот фрагмент во многих местах моего класса.

Ответы [ 3 ]

10 голосов
/ 13 декабря 2011

ARC в стороне, операция бессмысленна.Вы назначаете ивару nil, а затем сразу же назначаете что-то еще.Это ничем не отличается от простого присвоения чего-то другого.

До ARC это привело бы к утечке памяти (с или без вашего присвоения nil), если бы переменная имела предыдущее значение.С ARC нет утечки.

3 голосов
/ 13 декабря 2011

Лучшее решение: протестируйте и убедитесь сами!Это очень короткий пример!

Но да, это работает, конечно!ARC означает автоматический подсчет ссылок.Он просто говорит, что вам не нужно заботиться о release, retain и т. Д.

Если вы хотите, чтобы объект был нулевым, вы все равно можете это сделать, так как это простое присвоение указателя!

А что касается вашего кода, вы устанавливаете Array на ноль, прежде чем переназначить его oO!

Попробуйте получить логику вашего кода:

Если мой массив имеетобъекты

Then Array point to a new nil object

Но во всех случаях вы делаете:

Мой массив указывает на новый объект NSMutableArray

Так или нетваше условие оценивается как true, ваш код бесполезен, так как переменная примет другое значение сразу после!

0 голосов
/ 17 декабря 2013

Пример кода, который вы показали, действителен.Вот несколько вариантов:

if ([Array count] != 0) {
    Array = [[NSMutableArray alloc] init];
}

Пример 2:

if ([Array count] != 0) {
    Array = [NSMutableArray array]; //value will be retained
}

Пример 3:

if ([Array count] != 0) {
    self.Array = [[NSMutableArray alloc] init]; //Will NOT leak under ARC.
}

Пример 4:

//if ([Array count] != 0) {
[Array removeAllObjects];
//}

Все четыре примера действительны для ARC.

Другое дело: переменные экземпляра обычно имеют первую букву в нижнем регистре, но все еще следуют методу CamelCase.Еще один способ сделать это - сделать подчеркивание перед именем переменной: это делается, если у вас нет @synthesize метода, соответствующего вашему значению @property.

...