您的位置:首页 > 移动开发 > IOS开发

iOS学习随笔-关于属性的一点感想

2017-06-29 14:27 295 查看
最近在重新从基础扫ios开发的东西,一直对oc属性这个特性的原理不是很理解,现在有空查了点资料,整理出一点感想。

对于objective-c来说,可以通过属性为类声名实例变量并实现相应的getter和setter方法,并且更简便。

简单粗暴的说,属性会为用户声明一个变量,顺便帮你自动生成对该变量的gettersetter(其实这么说不对,但可以帮助理解)

对于代码实现来说:

@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确实是一个简便的选择)

然而当你使用了gettersetter以后,访问和改变成员信息都将由对象自己来触发,而不是项目中的任意对象!

同时,使用了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的理解,欢迎指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios objective-c