Ответ 1
Фактически вы не указали переменную, вы только определили свойство (которое неявно определяет переменную, которая является частной). И поскольку свойство - это просто метод, вам нужен синтаксис точки. Обратите внимание, что self.property
совпадает с [self property]
.
Чтобы исправить это, укажите переменную. Я приведу вам пример, где переменная имеет другое имя, чем свойство. Большинство людей выбрали одно и то же имя для обоих, но мне нравится, чтобы они отличались, поэтому я сразу вижу, какой из них предназначен.
// a.h
@interface MyClass : NSObject {
// Instance variables are "protected" by default, except if you
// use @private or @public.
Object *myObjectVar;
}
@property (nonatomic, retain) Object *myObject;
@end
// a.m
@implementation MyClass
@synthesize myObject = myObjectVar;
@end
// b.h
@interface AnotherClass : MyClass
@end
// b.m
@implementation AnotherClass
- (void) someMethod {
// works
Object *obj = myObjectVar;
// works
obj = self.myObject;
// the same as self.myObject
obj = [self myObject];
}
@end
Обратите внимание на разницу при назначении: если вы назначаете свою переменную, объект не сохраняется автоматически. Но он сохраняется, если вы используете свойство:
myObjectVar = someObject; // not retained, old object not released!
self.myObject = someObject; // old object released, new object retained
[self setMyObject:someObject]; // same as the line above
Изменить: Упомянуто, что синтезированные переменные экземпляра являются закрытыми по умолчанию, как отмечает @Jason Coco. И @NSGod прав, что обычные переменные экземпляра защищены по умолчанию, а не public, исправлены.