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

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


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

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

对于代码实现来说:


@interface BaseViewController :  NSObject
{
    UIView *_test;
}
-(void)setTest:(UIView *) n;
-(UIView *)test;
@end

gettersetter实现部分省略)


和以下代码做了一样的事情

@interface BaseViewController :  NSObject
@property  (nonatomic,strong) UIView *_test;
@end


使用了属性之后,gettersetter将在编译时自动生成。当然gettersetter也可以被overwrite,语法和普通的存取器相同。但是如果gettersetter都被覆盖,实例变量就不会自动生成!

注:属性名字不用下划线,编译器更具属性生成实例变量时会自动加上。

每个属性都可以有一组特性可选,可以选三个,分别是多线程特性,读写特性,内存管理特性。

关于属性的特性,贴上另一个已经讲的很清楚的博客的地址:http://blog.csdn.net/hierarch_lee/article/details/49886371


插一点别的。为什么需要gettersetter

先贴上知乎和stack overflow上的讨论链接:

https://www.zhihu.com/question/21401198

https://stackoverflow.com/questions/1568091/why-use-getters-and-setters

很多教材上对gettersetter方法的解释为:把成员变量直接暴露在外不符合OOP的封装性原则,不安全

但问题就在于,对于一个成员,最主要的操作就是访问成员信息和修改成员信息,(事实上对学生现在做的这些个人小项目所有变量都设置为public确实是一个简便的选择)

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

同时,使用了gettersetter能提高扩展性,易于添加新功能(如对一个自定义string对象能添加拼写检查等),且能保证外部接口不变的情况下修改内部逻辑,易于维护。最后,最粗暴的,修改数据的时候能下断点...


说回oc

对于oc来说,变量可以有privatepublic,然而属性是没有的。介于现在连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的理解,欢迎指正









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值