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