学习YZDisplay的过程

横向滑动滚动条,之前自己写过一个,但是存在很多的缺陷,功能单一,实现的也不是很漂亮,今天看到YZDisplayViewController这个类,拿来学习一下,自己接触iOS时间不算长,看别人的代码还存在很多的困难,在这里,我会记录下所有自己能够想到的问题,以便以后自己回顾。

首先是很基础的知识点,nonatomic和atomic的区别,assign,weak,strong的区别。

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。atomic提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择atomic就是说系统会自动创建lock锁,锁定变量;nonatomic禁止多线程,变量保护,提高性能。

atomic设置成员变量的property属性时,默认为atomic,提供多线程安全。在多线程环境下,原子操作是必要的,否则可能引起错误的结果,加了atomic,setter函数会变成下面这样,是一个原语操作,如果有多个线程同时调用setter,不会出现一个线程在没执行完全部代码前,另一个线程开始执行setter的情况,相当于给函数头尾加锁,可以保证数据的完整性。

{lock}

    if(property != newValue)

{

[property release];

property = [newValue retain];

}

{unlock}

nonatomic禁止多线程,不保证setter、getter的原语行,所以可能会出现取到不完整的东西,比如,更改两个变量的值,而当前只更改了一个变量,另一个程序开始了,当前程序返回的是更改了一个变量的错误结果,因此,在多线程的环境下原子操作很重要,否则可能会引起错误的结果。当然如果不需要多线程支持的话,用nonatomic就够了,执行率更快些。通过上面的代码可以看出来,用atomic会在多线程的设备取值时加锁,中间执行层是处于被保护的一种状态,atomic是防止在写入未完成时被另外一个线程读取,造成数据错误,而这种机制是消耗系统资源的,如果没有使用多线程间的通讯编程,nonatomic是一个不错的选择。


strong和weak是ARC引入的对象变量属性

assign是简单赋值,不更改引用计数,用于基本数据类型。

copy:建立一个索引计数为1的对象,但是只用于NSString,不能用于NSMutableString,此属性只对实行NSCopying协议的对象类型有效,如果不希望a和b共享一个内存时可用,a和b各自有自己的内存。

retain:引用了引用计数,当引用计数为0时,dealloc函数被调用,内存回收;retain释放旧的对象,将旧对象的值赋给输入对象,输入对象的索引计数为1,用于指针变量,就是定义一个变量,在程序运行过程中该变量被改变,会影响其他方法。

strong:和retain类似。

retain是指针拷贝,copy是内容拷贝。

weak和strong的区别:当一个对象没有strong指针指向它时,就可以释放,即使这个对象有weak指针正在指向它,依然可被释放。从别的博客看到一个这样的例子形容weak和strong的区别,比较通俗易懂,假如对象是一条狗,狗跑掉就是被释放。strong型指针就像被拴住的狗,只要用绳子拴住狗,狗就不会跑,假如有5个人牵绳子,只有5条绳子都脱落,狗才会跑,而weak就像一个小孩看见了狗说,有一只狗,不管多少小孩再看不管多少weak,只要strong没有了绳子没有了,狗都会跑,都会被释放。

在这里最想说的是weak和assign的区别,看了很多文档都没有这个的介绍,都认为是一样的东西,以前我也这么认为的,直到之前参加网易的面试被问到,才深入的研究了一下这俩的区别,weak修饰对象类型,是一种弱引用,可避免循环引用问题,而assign用于修饰基金数据类型,assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能会产生野指针,而weak一旦不进行使用后,永远不会使用了,就不会产生野指针。

以上两个问题都是面试网易时被问到的问题,现在想到了就整理一下,很基础的东西,但是很重要,在写项目的过程中会影响到内存和运行速度,这也就是为什么一些大公司反而注重基础的原因吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值