Автоматические iVars с @synthesize - PullRequest
6 голосов
/ 17 марта 2011

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

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

.h file

@interface myClass {
    NSIndexPath *_indexPath
}

@property(nonatomic, retain) NSIndexPath *indexPath

@end

.m file

@implementation myClass

@synthesize indexPath = _indexPath;

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

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

Ответы [ 3 ]

6 голосов
/ 17 марта 2011

Я прошел через много разных способов борьбы с этим. Мой текущий метод заключается в использовании свойства доступа в 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
5 голосов
/ 17 марта 2011

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

@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.

3 голосов
/ 17 марта 2011

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

.h

@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 , а не к соответствующему методу доступа, получая дополнительное преимущество - производительность.

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