首页 > 其他 > 详细

实例变量的访问

时间:2016-02-23 20:46:35      阅读:227      评论:0      收藏:0      [点我收藏+]

先来个铺垫,实例变量的四个作用域类型

技术分享

注意啦第二条是默认,就是说所有没有表明作用域的实例变量们都是这个类型,如下面这个例子的实例变量_age就是默认的@protected.

技术分享技术分享技术分享技术分享

通过上面的测试能知道在Person类内部,能涌过_age或者self->_age访问到该实例变量,而且经过本人验证,该访问方法四大作用域类型都通用。

那么如何在类的外部(比如main函数或者其他类)访问这个类的实例变量呢?

技术分享

直接用实例变量名_age访问是肯定行不通的,xcode提示使用了没有声明过的变量。确实啊,不管main里有没有导入过Person.h,_age始终是属于Person的实例变量,main里没有声明过直接用_age当然不行。那么有同学会思考那能不能用指针p->_age访问呢,试试看:

技术分享

很可惜想法丰满现实骨感,报错了。提示说_age是被保护的,等等,你是说因为四个作用域类型当中的默认作用域类型而报错吗?那其他的作用域类型能访问吗?很高兴的告诉你,有一个作用域是能访问的!@public作用域类型是可以直接用指针访问的,而且他三个不行。

那么从类外部访问类的实例变量难道就只能先把作用域设置成@public吗?当然不是!实例变量有四个作用域类型,但是方法没有啊,所有方法都是@public的喔,所以我们可以通过事先在本类中设置好访问这个实例变量的方法,这样就可以从类的外部访问了!说白了就是getter 和setter啦。技术分享技术分享技术分享

 就这样我们预先设置了setAge和age方法。在本类外部就能通过setAge来设置实例对象的_age的值,再通过age来取得_age的值。不要怀疑,通过这样的方法访问Person里的实例变量是四个作用域都通用的。这样就能优雅从一个类的外部访问这个类的实例变量了,嗯,就是稍微有点麻烦啊,每个变量都要设置一个getter和setter吧,那有些类上百个实例变量的话......卧槽仔细一想坑爹啊,太麻烦了吧。失主莫慌,老衲还有一计,直接上图:

技术分享技术分享技术分享

什么?看不懂?莫慌。看到那句@property int age了吗,就是因为有了这句,实例变量不用写了,getter和setter也不用写了。换句话说@property int age;这句等价于注释掉的绿色的所有部分。

还不懂?那这样说,写了这句,就相当于写了一个实例变量_age和-(void)setAge:(int)newage;和-(int)age;所以即使注释掉这些后你依然能在类外部调用-(void)setAge:(int)newage;和-(int)age;方法来访问类内部的实例变量了。

用这个方法还有一个好处,就是当你用这个方法的时候[p setAge:25]能写成p.age = 25,[p age]能写成p.age。即点在等号左边就调用setter,没有等号或在等号右边就调用getter方法。

然后,刚才说的@property int age 这句话来声明的实例变量就称为属性,[p setAge:25]写成p.age = 25就是所谓的点语法。

 

实例变量的访问

原文:http://www.cnblogs.com/Chen-Jun-jun/p/5210963.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!