Как увеличить количество сохранений переменной типа NSMutableArray в iOS

Вот следующая программа об увеличении значения d keep count переменной типа NSMutableArray в интерфейсной части.

@property (nonatomic, retain) NSMutableArray *dataArray;

И часть реализации

NSLog(@"%d",[self.dataArray retainCount]);
self.dataArray = [[NSMutableArray alloc] init];
NSLog(@"%d",[self.dataArray retainCount]);

Теперь в первой строке показано, что значение счетчика сохранения равно O внутри NSLog, однако, когда мы выделяем массив, он увеличивает количество сохранений до 2. Я не понимаю, почему количество сохранений увеличивается до 2 вместо 1. Пожалуйста, помогите мне понимание этого.


person Kashif    schedule 03.03.2014    source источник


Ответы (4)


Вы должны использовать _object, только если вы переопределяете методы получения/установки. «_object =» просто назначает, а «self.object =» вызывает свой метод установки. Вы должны использовать _object для предотвращения и управления счетчиком сохранения с помощью методов установки. Проверьте разницу между написанием кода:

@property (nonatomic, retain) NSMutableArray *arr;


//=============Accessing with _object==========
 NSLog(@"Retain Count before Allocation => %lu", (unsigned long)_arr.retainCount);

    _arr = [NSMutableArray arrayWithArray:@[@"arrobj1", @"arrObj3"]];
    NSLog(@"Retain Count before Allocation => %lu", (unsigned long)_arr.retainCount);



    _arr = [[NSMutableArray alloc] init];
    NSLog(@"Retain Count After alloc+init => %lu", (unsigned long)_arr.retainCount);
//============================================
Output is :
Retain Count before Allocation => 0
Retain Count before Allocation => 1
Retain Count After alloc+init => 1




###### And also with accessing objects with self.object#######
//=============Accessing with _object==========

    NSLog(@"Retain Count before Allocation => %lu", (unsigned long)self.arr.retainCount);

    self.arr = [NSMutableArray arrayWithArray:@[@"arrobj1", @"arrObj3"]];
    NSLog(@"Retain Count before Allocation => %lu", (unsigned long)self.arr.retainCount);



    self.arr = [[NSMutableArray alloc] init];
    NSLog(@"Retain Count After alloc+init => %lu", (unsigned long)self.arr.retainCount);


//============================================
Output is: 
Retain Count before Allocation => 0
Retain Count before Allocation => 2
Retain Count After alloc+init => 2

Я надеюсь, что это поможет вам.

person Satish Azad    schedule 03.03.2014

Возможно, это поможет:

http://whentouseretaincount.com

Короче говоря, вы никогда не должны полагаться на значение, возвращаемое функцией сохранения счетчика.

person Garfield81    schedule 03.03.2014

Инициализация alloc создает сохраненный экземпляр +1. Затем сохраненное свойство добавляет удержание к заданию +2. Чтобы получить количество сохранений, равное единице, а) используйте ARC и сильное свойство, оно вставит выпуск для вас б) создайте незадержанный экземпляр:

self.dataArray = [NSMutableArray array];

или c) автоматический выпуск явно:

self.dataArray = [[[NSMutableArray alloc] init] autorelease];
person danh    schedule 03.03.2014
comment
Спасибо за ответ, так что в интерфейсной части, когда мы объявляем сохранение типа свойства, его счетчик сохранения будет равен 0. - person Kashif; 03.03.2014

Поскольку установщик свойства также вызывается

self.dataArray = [[NSMutableArray alloc] init];

Количество сохранений увеличивается до 2.

вы можете попробовать и это

NSMutableArray   *temp=[[NSMutableArray alloc]init];
self.dataArray = temp;
[temp release];

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

person amar    schedule 03.03.2014