iOS学习随笔-关于属性的一点感想
2017-06-29 14:27
295 查看
最近在重新从基础扫ios开发的东西,一直对oc属性这个特性的原理不是很理解,现在有空查了点资料,整理出一点感想。
对于objective-c来说,可以通过属性为类声名实例变量并实现相应的getter和setter方法,并且更简便。
简单粗暴的说,属性会为用户声明一个变量,顺便帮你自动生成对该变量的getter和setter(其实这么说不对,但可以帮助理解)。
对于代码实现来说:
(getter、setter实现部分省略)
和以下代码做了一样的事情
使用了属性之后,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中
.m中
这里的
实际效果与以下代码等效
以上就是目前我对oc @property的理解,欢迎指正
对于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的理解,欢迎指正
相关文章推荐
- 关于学习编程(struts)的一点小感想
- 关于技术学习的一点感想
- 关于学习MMU的一点感想
- 关于学习MMU的一点感想
- 【iOS学习笔记】关于iOS中的属性修饰符初见
- 关于语言学习的一点感想
- 关于学习MMU的一点感想
- 关于学习认知的一点感想
- 关于datatable的一点学习感想
- iOS学习爬坑记录8:关于自定义Cell的一点认识
- 看完首页文章谈谈关于C++学习的一点感想
- 关于技术的学习,一点自己的感想
- IOS学习笔记01-关于objective-c的成员属性
- 关于技术学习的一点感想
- 关于学习编程的一点想法
- 关于学习CCNA的一点经验总结
- 关于Extent属性的一点说明
- 关于Google收购FeedBurner的一点感想
- 关于DNN Module开发学习以来的一点总结
- 关于51单片学习的一点心得