二十三

循环引用:
block与delegate循环引用问题
block:代码块里面用self调用的对象,block对它会一次强引用,引用计数加一. 在 Block 内如果需要访问 self 的方法、变量采用weakself,避免循环引用,造成内存泄露.
Masonry的self不会造成循环引用, 因为 Masonry ,它内部根本没有捕获变量 self,进入block的是testButton,所以执行完毕后,block会被销毁,没有形成循环引用环。所以,没有引起循环依赖。

项目中如何管理内存,怎么解决循环引用: 在ARC下,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决,比如: delegate代理属性,通常就会声明为weak。循环引用的主要是因为是相互引用对象之间形成了一个循环引用环,我们只要打破这个环,给某个引用对象使用 weak 修饰,就可以解决循环引用的问题

内存泄漏:
僵尸对象与野指针问题:
僵尸对象:内存已经被回收的对象。
野指针:指向僵尸对象的指针,向野指针发送消息会导致崩溃。
解决方法:
对象已经被释放后,应将其指针置为空指针(没有指向任何对象的指针,给空指针发送消息不会报错)。

单例:dispatchOnce static id _instance = nil; + (instancetype)sharedDataTool { if (_instance == nil) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; }); } return _instance;}
单例的用处:
单例的好处以及常用的地方:
好处:只创建一次,全局都能用.可以节省内存,提高效率,这也是iOS的优化的一种方式
常用的地方:网络工具类,日期转化工具类,数据库管理工具类等等

懒加载:
懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小)。懒加载,写的是其getter方法。就是在开发中,当程序中需要利用的资源时。在程序启动的时候不加载资源,只有在运行当需要一些资源时,再去加载这些资源。
iOS设备的内存有限,如果在程序在启动后就一次性加载将来会用到的所有资源,那么就有可能会耗尽iOS设备的内存。这些资源例如大量数据,图片,音频等等,所以在使用懒加载的时候一定要注意先判断是否已经有了,如果没有那么再去进行实例化
使用懒加载的好处:
1,不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强
2,每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合
3,只有当真正需要资源时,再去加载,节省了内存资源

通知:通知的用法[[NSNotificationCenter defaultCenter] postNotificationName:@“test” object:nil];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:@“test” object:nil]; }通知是一对多,当需要进行多个队象之间的传值,这时候就可以用到通知,比如做的一个运动类型的 APP,模型数据中处理 GPS 信号的显示,在地图控制器和运动记录控制器中,都需要进行 GPS 信号的刷新,通知是不二之选

代理:
block(闭包):
swift 闭包 block区别
let demo= {
(参数) ->(返回值类型)in
return 返回值
}
调用:demo(参数)
区别:
1.OC中默认截获变量,Swift默认截获变量的引用。它们都会强引用被截获的变量。
2.Swift中没有__block修饰符,但是多了截获列表。通过把截获的变量标记为weak避免引用循环
3.两者都有Weak-Strong Dance,不过这一点上OC的写法更简单。
4.在使用可选类型时,要明确闭包截获了可选类型还是实例变量。这样才能正确判断是否发生循环引用。

KVO(观察者设计模式):监听属性的变化原理:KVO的实现基于OC的Runtime机制,当观察某对象A时,KVO机制动态创建一个对象A当前类的子类,并为这个新的子类重写了被观察属性keyPath的setter 方法。setter 方法随后负责通知观察对象属性的改变状况。如何实现: 1.注册观察者,实施监听;2.在回调方法中处理属性发生的变化;3.移除观察者项目中使用:在MVC设计架构下的项目,KVO机制很适合实现mode模型和view视图之间的通讯。最常见的KVO运用是监听scrollView的contentOffset属性,来完成用户滚动时动态改变某些控件的属性实现效果,包括渐变导航栏、下拉刷新控件等效果。KVC与KVO的不同:KVC(键值编码),即Key-Value Coding,一个非正式的Protocol,使用字符串(键)访问一个对象实例变量的机制。而不是通过调用Setter、Getter方法等显式的存取方式去访问。KVO(键值监听),即Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,对象就会接受到通知,前提是执行了setter方法、或者使用了KVC赋值。与通知的区别KVO 是一对一,通知是一对多,notification的优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,例如键盘、前后台等系统通知的使用也更显灵活方便。

KVC:
1.Key Value Coding,键值编码,是一种间接访问实例变量的办法,它提供了一个使用字符串而不是访问器的方法,去访问一个对象实例变量的机制。
2.NSKeyValueCoding.h 头文件中可以看到这个类里面包含了对类 NSObject、NSArray、NSDictionary、NSMutableDictionary、NSOrderedSet、NSSet的扩展,扩展方法基本上- (id)valueForKey:(NSString *)key;
- (void)setValue:(nullable id)value forKey:(NSString *)key; 基本上 Objective-C里所有的对象都支持KVC操作,操作包含如上两类方法,动态读取和动态设值。
3.通过 KVC 键值编码访问属性,1.可以使用 key 值查找,2.路径查找,3.同时给多个属性赋值
4.KVC 抛出异常的方法:1.使用 kvc设置值对象时,如果当前类没有找到对象的 key 值,系统会自动调用 setValue:forUndefinedKey:方法,该方法默认实现是抛出一个异常,如果不想抛出异常,就重写这个方法,这里可以写一个分类;2.使用 KVC 取值的时候,如果当前类没有找到对应的 key值,系统会自动调用 valueForUndefinedKey:方法,默认也是抛出一个异常,我们可以重写这个方法。
KVC 的实现机制:
1.检查是否存在 getter 方法-方法,或者 setter 方法-set方法
2.如果没有上述方法,则检查是否有名字为_, 的成员变量
3.如果仍未找到,则调用 valueForUndefinedKey:方法,setValueForUndefinedKey:方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值