Вы должны помнить, что self.property - это то же самое, что и [self propertyGetter].
Имя свойства и переменная экземпляра не должны иметь одно и то же имя, чтобы избежать путаницы.
Лучший способ - всегда предварительно представлять общий префикс для ivars.
@interface MyClass {
// You don't have to declare iVar. Feel free to remove line.
NSDateFormatter * iVarDateFormatter;
}
@property (retain) NSDateFormatter * dateFormatter;
@end
А при реализации
@implementation MyClass
@synthetize dateFormatter= iVarDateFormatter;
...
@end
Итак, вы можете написать:
- (NSDateFormatter *) dateFormatter
{
if ( nil == iVarDateFormatter )
{
iVarDateFormatter = [[NSDateFormatter alloc] init];
// Do other stuff with the dateFormatter
}
return iVarDateFormatter;
}
Еще лучше для одноэлементных объектов, таких как этот, используйте GCD dispatch_once!
- (NSDateFormatter *) dateFormatter
{
static dispatch_once_t pred;
dispatch_once(& pred, ^{
iVarDateFormatter = [[NSDateFormatter alloc] init];
// Do other stuff with the dateFormatter
});
return iVarDateFormatter;
}