最近在重新从基础扫ios开发的东西,一直对oc属性这个特性的原理不是很理解,现在有空查了点资料,整理出一点感想。
对于objective-c来说,可以通过属性为类声名实例变量并实现相应的getter和setter方法,并且更简便。
简单粗暴的说,属性会为用户声明一个变量,顺便帮你自动生成对该变量的getter和setter(其实这么说不对,但可以帮助理解)。
对于代码实现来说:
@interface BaseViewController : NSObject
{
UIView *_test;
}
-(void)setTest:(UIView *) n;
-(UIView *)test;
@end
(getter、setter实现部分省略)
和以下代码做了一样的事情
@interface BaseViewController : NSObject
@property (nonatomic,strong) UIView *_test;
@end
使用了属性之后,getter和setter将在编译时自动生成。当然getter和setter也可以被overwrite,语法和普通的存取器相同。但是如果getter和setter都被覆盖,实例变量就不会自动生成!
注:属性名字不用下划线,编译器更具属性生成实例变量时会自动加上。
每个属性都可以有一组特性可选,可以选三个,分别是多线程特性,读写特性,内存管理特性。
关于属性的特性,贴上另一个已经讲的很清楚的博客的地址:http://blog.csdn.net/hierarch_lee/article/details/49886371
插一点别的。为什么需要getter和setter?
先贴上知乎和stack overflow上的讨论链接:
https://www.zhihu.com/question/21401198
https://stackoverflow.com/questions/1568091/why-use-getters-and-setters
很多教材上对getter和setter方法的解释为:把成员变量直接暴露在外不符合OOP的封装性原则,不安全
但问题就在于,对于一个成员,最主要的操作就是访问成员信息和修改成员信息,(事实上对学生现在做的这些个人小项目所有变量都设置为public确实是一个简便的选择)
然而当你使用了getter和setter以后,访问和改变成员信息都将由对象自己来触发,而不是项目中的任意对象!
同时,使用了getter和setter能提高扩展性,易于添加新功能(如对一个自定义string对象能添加拼写检查等),且能保证外部接口不变的情况下修改内部逻辑,易于维护。最后,最粗暴的,修改数据的时候能下断点...
说回oc
对于oc来说,变量可以有private、public,然而属性是没有的。介于现在连Apple官方文档里都是用@property比较多,所以如果一个属性不想被外部访问,可以将属性定义在 .m文件中(就和定义私有方法一样,虽然因为oc的动态消息传递机制,oc其实不存在真正意义上的私有方法,但反正这么做的效果是一样的)。
简而言之,对于oc来说,尽量用@property的语法代替变量的定义,对于想不想被外部访问的就定义在.m文件中,其他就定义在.h中即可。
不过在.h中声明属性时也只会生成存取器的声明,为了让属性生成实例变量和存取器,需在.h中写@synthesize进行属性合成(虽然通常情况下编译器会进行自动合成),也就是说,我们可以通过@synthesize来将自定义的存取器和属性进行合成,比如改变方法名来防止不恰当访问。
.h中
@interface SearchViewController : BaseViewController
@property (nonatomic,strong)NSDictionary *result;
@end
.m中
@implementation SearchViewController
@synthesize result;
这里的
@synthesize result;
实际效果与以下代码等效
@synthesize result = result;
以上就是目前我对oc @property的理解,欢迎指正