Управление памятью новичка - PullRequest
0 голосов
/ 20 ноября 2011

Мне нужно знать, должно ли retaincount объектов всегда быть 0, если я хочу иметь хорошее управление памятью в моем коде. Я получил следующий код из книги. и есть утверждение NSLog, которое называется after release = 2, поэтому я должен выпустить его еще 2 раза, чтобы retaincount было равно 0?

#import <Foundation/NSObject.h>
    #import <Foundation/NSAutoreleasePool.h>
   #import <Foundation/NSString.h>
 #import <Foundation/NSArray.h>
 #import <Foundation/NSValue.h>
 int main (int argc, char *argv[])
 {
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 NSNumber *myInt = [NSNumber numberWithInteger: 100];
 NSNumber *myInt2;
 NSMutableArray *myArr = [NSMutableArray array];
 NSLog (@”myInt retain count = %lx”,
 (unsigned long) [myInt retainCount]);
 [myArr addObject: myInt];
 NSLog (@”after adding to array = %lx”,
 (unsigned long) [myInt retainCount]);
 myInt2 = myInt;
 NSLog (@”after asssignment to myInt2 = %lx”,
 (unsigned long) [myInt retainCount]);
 [myInt retain];
 NSLog (@”myInt after retain = %lx”,
 (unsigned long) [myInt retainCount]);


 NSLog (@”myInt2 after retain = %lx”,
 (unsigned long) [myInt2 retainCount]);
 [myInt release];
 NSLog (@”after release = %lx”,
 (unsigned long) [myInt retainCount]);
 [myArr removeObjectAtIndex: 0];
 NSLog (@”after removal from array = %lx”,
 (unsigned long) [myInt retainCount]);
 [pool drain];
 return 0;
 }

Вывод программы

myInt retain count = 1
после добавления в массив = 2
после присвоения myInt2 = 2
myInt после сохранения = 3
myInt2 после сохранения = 3
после выпуска = 2
после удаления из массива = 1

UPDATE

Следующий код был взят из документа управления памятью Apple . Они сохранили объект NSNumber и никогда не были освобождены, это нормально?

- (void)setCount:(NSNumber *)newCount {
[newCount retain];
[_count release];
// Make the new assignment.
_count = newCount;
}

Ответы [ 2 ]

5 голосов
/ 20 ноября 2011

Вам не следует беспокоиться о сохранении количества ваших объектов, особенно потому, что NSArray или другие объекты могут сохранить, а затем только позже освободить вещи, которые вы передаете им.Вместо этого я настоятельно рекомендую сосредоточиться на Objective-C и правилах управления памятью Cocoa , которые гарантируют, что все будет очищено при необходимости.

1 голос
/ 20 ноября 2011

Это не для того, чтобы отвлечься от существующих ответов, а для того, чтобы обратиться к вашему редактированию (что, кстати, должно ДЕЙСТВИТЕЛЬНО быть отдельным вопросом.):

Они сохранили объект NSNumber и никогда не были освобождены, это нормально?

- (void)setCount:(NSNumber *)newCount {
[newCount retain];
[_count release];
// Make the new assignment.
_count = newCount;
}

Ну, не было бы, если бы это было то, что они сделали. Вы путаете указатели с объектами. Вы видите (NSNumber *) как раз перед newCount. Это * означает, что newCount является указателем на объект NSNumber. Разрешите мне перевести.

[newCount retain];

Сохранить объект, на который указывает указатель 'newCount'.

[_count release];

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

_count = newCount; 

Заставить указатель '_count' ссылаться на объект, на который ссылается указатель 'newCount'

Думайте об этом так, если у вас есть машина, которую вы, скорее всего, просто назовете myCar. Когда вы говорите myCar, вы имеете в виду свою машину, машину, которой вы владеете. Допустим, вы на какое-то время покупаете новый автомобиль, назовете его newCar, чтобы вы могли увидеть разницу. Таким образом, вы получаете право собственности на свой новый автомобиль [newCar retain], и на короткое время у вас есть два автомобиля. Теперь вы продаете свою старую машину, которую вы до сих пор называете myCar, [myCar release] (очень грустно). Но теперь, когда вы говорите myCar, вы имеете в виду ваш новый автомобиль myCar = newCar. У вас больше нет своей старой машины. И теперь ваш новый автомобиль - просто мой автомобиль, и вы владеете им. Когда ты умрешь, dealloc, твоя машина будет продана, [myCar release].

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