在OC中声明实例变量的方式有两种:
{
类型 实例变量名;
}
另外一种是用@property (属性)类型 实例变量名;
下面来看一个简单的OC程序:
@interface A : NSObject
@property int x;
-(void) initVar;
@end
#import "A.h"
@implementation A
@synthesize x ;
-(void) initVar
{
_x = 100;
NSLog(@"%d ",_x);
}
@end
#import "A.h"
@interface B : A
-(void) printVar;
@end
@implementation B
-(void) printVar
{
NSLog(@"x = %i",x);
}
@end
其中在类的继承中对于第一种方式子类能够直接访问到父类中得实例变量,此时可以用实例变量名直接访问,也相当于self ->实例变量,因为此时声明的实例变量是protected类型的,在外部不能访问,但是可以在其子类中直接访问。
当用@property和 @synthesize 配合声明实例变量时,不仅将实例变量声明出来,同时也生成了实例变量的set 和 get方法,而且此时的实例变量为private类型的,这时在其子类中就不能访问到该类的实例变量,而是通过访问实例变量所对应的set、get方法来对实例变量进行访问,此时用 self.实例变量名进行访问。
在4.3版本以上的Xcode之后,在开发IOS程序的过程中,大家都习惯的将 @synthesize 实例变量名;省去不写,只通过@property进行声明,然后再本类中通过在变量名前面加上下划线 _ 如:(_x)进行对实例变量的访问;这时候的_x 只是实例变量的属性名,而在其子类中要通过调用对应的方法进行访问;
在这可以说明一下 点(.)操作还有 -> 操作:
其中前者对应的是访问方法;
而 -> 操作符则是直接对实例变量进行访问
还有一种解释的方式:
可以将@property所声明的实例变量作为是方法名而不是实例变量名,即对应相应的set 和get方法。(因为在系统所自带的一些协议中,有一部分方法是通过@property 进行声明的,然后协议的要求是只能增加方法,但不能增加实例变量,可见这里面所声明的并不是实例变量,而是其所对应的方法)
所以在子类访问的过程中由@property声明的要通过点(.)操作符调用实例变量的set、get函数进行对实例变量的访问;
而直接声明的实例变量可以直接通过实例变量名进行访问;
备注:第二种解释的方法有点牵强,希望大家可以综合这两种方式对着两种声明方式进行理解及运用。