Objective-C中属性和实例变量有什么区别?我需要用面向对象的术语来理解。属性声明只是一个方便的包装器(在实现中使用@synthesize)来访问实例变量吗?
谢谢,
codecowboy。
Objective-C中属性和实例变量有什么区别?我需要用面向对象的术语来理解。属性声明只是一个方便的包装器(在实现中使用@synthesize)来访问实例变量吗?
谢谢,
codecowboy。
属性和实例变量是两个完全不同的东西。
实例变量是存储在对象内部的变量,因此每个实例都有自己的实例变量。它通过指针相对于对象指针/ self进行引用(对于现代运行时略微间接,但在功能上等效)。ivars通常是类内部的,且默认情况下只能由类及其子类(@protected)访问。在方法中,它们可以无需限定符就可用,否则它们可以(但很少被使用,通常也不应该)通过间接方式访问,例如obj->ivar。
属性定义了getter和setter(setter是可选的)接口。这就是它所做的全部。它定义了两个公共方法:
- (TYPE) propname;
- (void) setPropname: (TYPE) newPropname;
@property (nonatomic, readonly) NSString* fullname;
然后实现 - (NSString*) fullname 方法,返回 firstname 和 lastname 的连接字符串。
属性和实例变量的区别在于,被设置为属性的变量可以在另一个类中被访问,而要访问实例变量,则需要先创建该类的对象,然后才能进行访问。 使用 @synthesize 关键字,编译器会为该属性生成相应的setter和getter方法。
- (TYPE)name; - getter方法
- (void)setName:(TYPE)aName; - setter方法