Сохранять / копировать автоматически выпущенные объекты - PullRequest
4 голосов
/ 21 июня 2011

Я хочу убедиться, что я правильно понимаю управление памятью здесь. Есть ли какая-то конкретная причина использовать один из методов assignCurrentDate поверх другого? Кроме того, все это не приводит к утечкам памяти, верно?

в .h у нас есть:

NSDate *currentDate1;
NSDate *currentDate2;
NSDate *currentDate3;
NSDate *currentDate3; 
//and 
@property (nonatomic, retain) NSDate *currentDate1;
@property (nonatomic, retain) NSDate *currentDate2;
@property (nonatomic, retain) NSDate *currentDate3;
@property (nonatomic, retain) NSDate *currentDate4;

в .м:

-(void) assignCurrentDate1
{
currentDate1 = [[NSDate date]retain];
//[NSDate date] is autoreleased
}

-(void) assignCurrentDate2
{
currentDate2 = [[NSDate date]copy]; 
}

-(void) assignCurrentDate3
{
self.currentDate3 = [NSDate date];
}

-(void) assignCurrentDate4
{
currentDate4 = [[NSDate alloc]init];
//[[NSDate alloc]init] is not autoreleased.
}

-(IBAction) printDate
{
NSLog ("%@", currentDate1);
NSLog ("%@", currentDate2);
NSLog ("%@", currentDate3);
NSLog ("%@", currentDate4);
}

- (void)dealloc
{
[currentDate1 release];
[currentDate2 release];
[currentDate3 release];
[currentDate4 release];
[super dealloc];
}

Ответы [ 2 ]

6 голосов
/ 21 июня 2011

Эмпирическое правило, когда дело доходит до управления памятью iOS:

Для каждого alloc, retain, copy или new у вас должно быть соответствующее release или autorelease.

Вы на самом деле протекаете в нескольких местах. В своем заголовке вы retain используете объекты даты, а затем в своем методе dealloc вы освобождаете их. Это правильно. Однако В ваших методах assignDate вы не можете выпустить копию или сохранить дату. Пока [NSDate date] автоматически выпущен, вы сохраняете и копируете их самостоятельно.

Нет никаких причин использовать ваши assignCurrentDate методы. Вы можете просто сделать что-то вроде следующего в вашем методе init:

self.currentDate1 = [NSDate date];

Вот и все.

Редактировать: (Хорошо, это не это.)

Как отмечает Джим в комментариях:

Сохранение в заголовке означает, что синтезированный установщик для этих свойств сохранит назначенные им объекты. Но если вы посмотрите на методы assign *, вы увидите, что на самом деле только assignCurrentDate3 использует это свойство. Остальные присваивают непосредственно ивару, минуя синтезированный сеттер, поэтому они не сохраняются при назначении.

2 голосов
/ 21 июня 2011

Да, вы правильно понимаете управление памятью. Ни одна из этих утечек, если вы не вызываете методы более одного раза. Второй менее эффективен с точки зрения использования памяти, поскольку создаются два экземпляра NSDate. На самом деле все они немного различаются по производительности, но незначительно, если только вы не заключаете их в узкие петли.

С точки зрения дизайна программы, вы не захотите писать такой код, потому что если вы когда-нибудь вызовете 1, 2 или 4 более одного раза, первоначально выделенный экземпляр будет просочиться. Если вы уверены, что это не проблема (например, если вы назначаете в viewDidLoad и выпускаете в viewDidUnload), то вы можете безопасно использовать любой из этих стилей, но если вы не уверены, что это В этом случае вам необходимо либо защитить свое назначение, отпустив его, либо использовать третий метод, основанный на свойствах, который делает это за вас.

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