Почему переменная NSString должна быть сохранена? - PullRequest
2 голосов
/ 05 февраля 2011

В моем файле .h есть следующий код:

@interface Utils : NSObject {
    NSString *dPath;
}    
@property(nonatomic, retain) NSString *dPath;

И в моем .m файле:

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
dPath = [[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName];
[dPath retain]; 

Почему я должен сохранить dPath , если он уже определен как (неатомный, сохранить )? Если я не добавлю [dPath retain]; Я получаю некоторые странные, случайные ошибки и происходит сбой приложения при использовании этой переменной в других функциях. Я думаю, это из-за какого-то автоматического выпуска где-то, но у меня его нет.

Итак, что (неатомарное, retain ) делает в любом случае? Действительно ли необходимо сохранить [dPath]; или я просто что-то скрываю с этим?

Ответы [ 3 ]

7 голосов
/ 05 февраля 2011

Поскольку код не вызывает метод установки свойства dPath, он просто устанавливает переменную экземпляра dPath напрямую:

dPath = [[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName];
[dPath retain]; 

Поэтому его необходимо сохранить вручную.

Вы сможете (на самом деле вам нужно) пропустить вызов retain, если установщик свойств использовался следующим образом (обратите внимание на self.):

self.dPath = [[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName];

или таким образом (уведомлениеsetDPath:):

[self setDPath:[[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName]];

Сеттер оставляет за собой NSString, поэтому вам не придется делать это самостоятельно.


Хорошая небольшая практика, которой нужно следоватьчтобы избежать путаницы, добавьте подчеркивание к вашему имени ивара, чтобы указать, что это ивар:

    NSString *dPath_;

Затем синтезируйте свое свойство следующим образом, чтобы связать его с вашим по-разному иваром:

// self.dPath is the property, dPath_ is the ivar
@synthesize dPath = dPath_;

Затем измените ваш метод dealloc, а также любой другой код, который напрямую ссылается на экземпляр var, чтобы использовать вместо него добавленное имя:

- (void)dealloc {
    [dPath_ release];

    [super dealloc];
}
0 голосов
/ 05 февраля 2011

Если вы хотите вызвать метод установки свойств, который вызовет сохранение, то вы хотите написать:

self.dPath = ...

Зажимаем вещи в переменную с помощью:

dPath = ...

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

0 голосов
/ 05 февраля 2011

попробуйте установить и получить с помощью

self.dPath
...