onExit分析

defer引发的OnExit

在swift中,是经常用到defer的,在作用域结束的时候,执行defer的命令,但是在Objective C中是无法使用的,不过有个宏 onExit可以达到这样的效果,比如

1
2
3
4
5
if (1) {
@onExit {
NSLog(@"ffffff");
};
}

就会在if作用域之后打印fffffff,那么他是怎么实现的呢,主要是用到了 __attribute__变量属性,具体的onExit的定义如下:

1
2
3
4
5
#ifndef onExit
#define onExit \
ext_keywordify \
__strong ext_cleanupBlock_t metamacro_concat(ext_exitBlock_, __LINE__) __attribute__((cleanup(ext_executeCleanupBlock), unused)) = ^
#endif
  1. ext_keywordify
  2. ext_clearupBlock_t
  3. metamacro_concat
  4. clearup

其中ext_keywordify 在debug下就是一个@autoreleasepool, release下是@try..cache…finally
这里强制要求添加一个@,否则编译器会报错

ext_clearupBlock_t 是一个typedef void (^ext_cleanupBlock_t)();

metamacro_concat(A, B) 就是 metamacro_concat(A, B) A ## B ,将AB连接起来,例如

metamacro_concat(ext_exitBlock_, __LINE__)
拼接为:ext_exitBlock_19

clearup

http://draveness.me/defer/

ios7下UIScrollView和滑动返回

问题

之前因为某些历史原因,外卖基本禁止了所有的滑动返回手势,这次产品过来说需要开发一些正常流程的返回操作,于是在修复菜单页的过程中遇到了一些问题。菜单页可以说是整个外卖最复杂的页面,如下图菜单页

图中有p1,p2,p3,p4,p5,整个菜单页的结构是:
P5 最底层,UIScrollView
P4 标题,UIView
P3 内容, UIView
P2 tab, UIScrollView
P1 page, UIScrollView

层次是:p1 + p2 –> p3 + p4 –> p5

这样就有了问题,左右滑P1,其实是UIScrollView的页面切换,分别显示,菜单,点评和商家详情。
在整个P3区域进行滑动返回操作,是不起效果的。

atomic使用

平时我们使用atomic的时候,是希望对一个porperty的操作进行一个原子操作,但是这里的原子操作应该是仅仅对应于Setter和Getter方法,如果property是一个array,比如

  • (void)setProp:(NSString )newValue {
    [_prop lock];
    _prop = newValue;
    [_prop unlock];
    }
    按我理解:
    1.此处的线程安全是就getter,setter而言的。比如对于@property(nonatomic,copy)NSString
    str; 当调用self.str = @”HELLO,GUY”;如果是多线程,在一个线程执行setter方法的时候,会涉及到字符串拷贝,另一个线程去读取,很可能读到一半的数据,也就是garbage数据。
    2.另外的话,它也仅限于getter,setter时的线程安全。比如@property(atomic,strong)NSMutableArray *arr;如果一个线程循环读数据,一个线程循环写数据,肯定会产生内存问题。因为它和setter,getter没有关系。

互联网协议相关内容资料

下面的文章都是对网络介绍比较深入和有趣的,持续更新。。。

阮一峰

RSA算法原理(一)

RSA算法原理(二)

数字签名是什么?

互联网协议入门(一)

互联网协议入门(二)

DNS 原理入门

SSL/TLS协议运行机制的概述

图解SSL/TLS协议

TCP/IP的三次握手与四次挥手详解 渣渣360doc,还要登陆才能复制

iOS http & https & 网络请求过程 这篇文章的第一个动态度很不错,过程也挺清晰

IOS支持IPv6 DNS64/NAT64网络

公众号:码农翻身

CPU阿甘

我是一个路由器(我是一个网卡姊妹篇)

我是一个网卡