Автоматические iVars с @synthesize

Я понимаю, что начиная с iOS 4, теперь есть возможность вообще не объявлять iVars и позволять компилятору автоматически создавать их для вас, когда вы синтезируете свойство. Тем не менее, я не могу найти документацию от Apple по этой функции.

Кроме того, существует ли какая-либо документация по передовым методам или рекомендованным Apple руководствам по использованию iVars и свойств? Я всегда использую такие свойства:

.h файл

@interface myClass {
    NSIndexPath *_indexPath
}

@property(nonatomic, retain) NSIndexPath *indexPath

@end

.m файл

@implementation myClass

@synthesize indexPath = _indexPath;

- (void)dealloc {
    [_indexPath release];
}
@end

Я использую _indexPath вместо indexPath в качестве имени iVar, чтобы быть уверенным, что я никогда не буду использовать indexPath когда мне нужно использовать self.indexPath, Но теперь, когда iOS поддерживает автоматические свойства, мне не нужно беспокоиться об этом. Тем не менее, если я пропущу декларацию iVar, как мне поступить с ее выпуском в моем dealloc? Меня учили использовать iVars напрямую при выпуске в dealloc, а не использовать методы свойств. Если у меня нет iVar во время разработки, я могу просто вызвать метод свойства?

3 ответа

Решение

Я прошел через много разных способов борьбы с этим. Мой текущий метод заключается в использовании доступа к свойству в dealloc. Причины не слишком надуманы (на мой взгляд), чтобы этого не делать, за исключением случаев, когда я знаю, что свойство имеет странное поведение.

@interface Class
@property (nonatomic, retain) id prop;
@end

@implementation Class
@synthesize prop;

- (void)dealloc;
{
    self.prop = nil;
    //[prop release], prop=nil; works as well, even without doing an explicit iVar
    [super dealloc];
}
@end

В итоге я делаю следующее:

@interface SomeViewController : UIViewController

@property (nonatomic, copy) NSString *someString;

@end

а потом

@implementation SomeViewController

@synthesize someString;

- (void)dealloc
{
    [someString release], someString = nil;
    self.someString = nil; // Needed?

    [super dealloc];
}

@end

Примечание. В какой-то момент Apple включит синтез по умолчанию, для которого больше не требуется директива @synthesize.

Вы можете напрямую получить доступ к переменным экземпляра, используя -> символ вместо точки . (который вызовет соответствующий метод доступа ivar):

.час

@interface myClass {
}
@property(nonatomic, retain) NSIndexPath *indexPath

@end

.m

@implementation myClass

- (void)dealloc {
    [self->indexPath release];
    self->indexPath = nil; // optional, if you need it

    [super dealloc];
}
@end

Таким образом, вы получите прямой доступ к iVar, а не к соответствующему методу доступа, получая дополнительное преимущество - производительность.

Другие вопросы по тегам