OC中变量的两种声明方式分析

本文介绍了Objective-C中声明实例变量的两种方法:直接声明和使用@property。详细解释了这两种声明方式在父类和子类间的访问差异,以及@synthesize的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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



在上面这个简单的继承中是用第一种方法对实例变量进行声明的,此时要想在A的子类B中访问A中所声明的 x 变量就可以用实例变量名 x 直接访问,相当于用NSLog(@"x = %i ", self -> x);
如果用 @property (属性) int x; @synthesize x; 对 x 进行声明,则需要用到NSLog(@"x = %i ", self.x);在子类中对父类实例变量进行访问;这是什么原因呢?解释如下:

其中在类的继承中对于第一种方式子类能够直接访问到父类中得实例变量,此时可以用实例变量名直接访问,也相当于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函数进行对实例变量的访问;

而直接声明的实例变量可以直接通过实例变量名进行访问;

备注:第二种解释的方法有点牵强,希望大家可以综合这两种方式对着两种声明方式进行理解及运用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值