RunLoop 的内部逻辑
根据苹果在文档里的说明,RunLoop 内部的逻辑大致如下:
内部代码整理为:
一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程能随时处理事件但并不退出,通常的代码逻辑是这样的:
1 2 3 4 5 6 7 |
|
这种模型通常被称作 Event Loop。 Event Loop 在很多系统和框架里都有实现,比如 Node.js 的事件处理,比如 Windows 程序的消息循环,再比如 OSX/iOS 里的 RunLoop。实现这种模型的关键点在于:如何管理事件/消息,如何让线程在没有处理消息时休眠以避免资源占用、在有消息到来时立刻被唤醒。
1、# (stringizing)字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。 如:
1 2 |
|
当使用该宏定义时:
1、在使用block前需要对block指针做判空处理。
不判空直接使用,一旦指针为空直接产生崩溃。
if (!self.isOnlyNet) { if (succBlock == NULL) { //后面使用block之前要先做判空处理 return; } id data = [NSKeyedUnarchiver unarchiveObjectWithFile:[self favoriteFile]]; if ([data isKindOfClass:[NSMutableArray class]]) { succBlock(data,YES); }else{ succBlock(nil,YES); } }
事实上,OC是具备异常处理机制的,但是具体情况下不会启用该机制。原因是ARC下默认不是“异常安全”的。 理由是,如果抛出异常,那么本应该在作用域末尾释放的对象在现在不能自动释放了。 如果想生成“异常安全”的代码,需要设置编译标志“-fobjc-arc-exceptions”,并且需要引入额外的代码,在不抛出异常时,也照样执行这段代码。 及时不适用ARC,也很难在抛出异常后不会导致内存泄露。例如:
1 2 3 4 5 6 |
|
中文版:
github:https://github.com/yangchao0033/Harpy
Harpy 将用户手机上已安装的iOS app版本与当前App Store最新可用版本进行检查对比。如果有新的可用版本时,使用弹窗及时提醒用户最新版本信息,并然用户选择是否需要进一步操作。
你可以使用这段代码来阻止控制器播放在播放结束后自动dismissing(消失),并且捕捉到用户点击完成的按钮事件去自己定义并处理让你的MPMoviePlayerViewController播放器的消失(dismiss)的时机
首先,我们先对使用autoreleasepool的场景进行性能对比。
1 2 3 4 5 6 7 8 |
|
–关于在storyboard中使用静态TableViewCell的可变高度的使用技巧
起因:在storyboard使用之前,创建tableView视图,通常是采用代码控制数据源,通过数据源数据的长度来决定tableView中cell的个数,而这样做的好处还有就是可以通过将已经在界面中展示的cell放入缓存池中,以供后续数据展示再从缓存池中取出进行复用。这样做的好处是为了防止数据过大时创建大量的cell浪费不必要的空间。显而易见,tableView就是为了进行批量数据的展示。