мне нужно распределить и инициализировать переменные с сохранением свойств? (iphone) - PullRequest
0 голосов
/ 06 июля 2011
@interface Approval : NSObject 
{
    NSMutableArray *approvalValues;
}
@property (nonatomic,retain) NSMutableArray *approvalValues;

Если я сделаю это, мне все равно нужно будет вызывать `opyValues ​​= [[NSMutableArray alloc] init] в методе init?У меня сложилось впечатление, что я должен был, но это вызывает утечку.В методе dealloc я выдаю значения утверждения

Ответы [ 3 ]

2 голосов
/ 06 июля 2011

Вам нужно alloc и init approvalValues.Кажется, проблема связана с тем, что вы чрезмерно сохраняете свой объект.

Ваш код, вероятно, выглядит следующим образом:

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

alloc вернет объект с retainCount из 1, и при использовании установщика retain он будет увеличен до 2. Чтобы решить его, вы можете захотеть autorelease объект перед его назначением, создавая код, который выглядит следующим образом:

self.approvalValues = [[[NSMutableArray alloc] init] autorelease];

Это приведет к тому, что переменная экземпляра будет иметь retainCount только 1, поэтому, когда вы dealloc объект, он не будет протекать.

0 голосов
/ 06 июля 2011

В методе init вы часто обращаетесь к ivar напрямую и инициализируете его так:

approvalValues = [[NSMutableArray alloc] init];

В dealloc вам понадобится релиз matchin, подобный этому:

[approvalValues release];

Часто рекомендуется обращаться к ivars напрямую через метод init и dealloc, чтобы избежать любых побочных эффектов, вызываемых сеттерами / геттерами.

Во всем классе вы захотите использовать KVC setters /геттеры или точечные обозначения для установки таких объектов

// Dot notation
NSMutableArray *tmpApprovalValues = [[NSMutableArray alloc] init];
self.approvalValues = tmpApprovalValues;
[tmpApprovalValues release]; tmpApprovalValues = nil;

// Call to setters/getters
NSMutableArray *tmpApprovalValues = [[NSMutableArray alloc] init];
[self setApprovalValues:tmpApprovalValues];
[tmpApprovalValues release]; tmpApprovalValues = nil;

Исправленная терминология благодаря @ Yuji

0 голосов
/ 06 июля 2011

Да, вам все еще нужно выделить / init, но вы можете использовать только метод dealloc.

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