Как се увеличава броят на запазване на променлива тип NSMutableArray в iOS

Ето следната програма за увеличаване на d retain 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 само ако заменяте методите getter/setter. "_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

Накратко, никога не трябва да разчитате на стойността, върната от retain count.

person Garfield81    schedule 03.03.2014

Alloc init създава запазен екземпляр +1. След това запазеното свойство добавя задържане към присвояването +2. За да получите брой на запазване от едно, a) използвайте ARC и силно свойство, то ще вмъкне освобождаване за вас b) създайте незапазен екземпляр:

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