iOS 个人部分基础统计

NSMethodSignature的组成

方法签名包含了方法的名称、参数、返回值target。iOS中使用Type Encoding的方式来表示。 [返回值][target][action][参数] 例如 @@:@

atomic 和 nonatomic 的区别

  • atomic 原子的, nonatomic非原子
  • 原子:保证setter、get方法的完整性,在setter、getter方法里加入了@synchronized(就是锁)
  • Atomic不能保证对象多线程的安全。所以Atomic 不能保证对象多线程的安全。它只是能保证你访问的时候给你返回一个完好无损的Value而已
  • atomic所说的线程安全只是保证了getter和setter存取方法的线程安全,并不能保证整个对象是线程安全的。
  • 举例: 线程 A 调了 getter,与此同时线程 B 、线程 C 都调了 setter——那最后线程 A get 到的值,有3种可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同时,最终这个属性的值,可能是 B set 的值,也有可能是 C set 的值。

nsuserDefault

plist文件 阻塞调用线程 即使只是修改一个 key 都会 load 整个文件,不适合存储大量数据。 NSUserDefaults是保存成文本格式的,容易被破解,解析效率也比较低。所以数据太大的时候,解析起来就慢了。 NSUserDefaults你每次同步都要全写,打开要全读

多进程通信

  1. URLSchema
  2. 剪切板
  3. 钥匙串(Keychain)
  4. UIDocumentInteractionController(文档传输) 、 UIActivityViewController(分享的) UIDocumentInteractionController主要是用来实现同设备上app之间的共享文档,以及文档预览、打印、发邮件和复制等功能
  5. local socket 这种方式不太常见,也是很容易被iOS开发者所忽略但是特别实用的一种方法。它的原理很简单,一个App1在本地的端口port1234进行TCP的bind和listen,另外一个App2在同一个端口port1234发起TCP的connect连接,这样就可以建立正常的TCP连接,进行TCP通信了,那么就想传什么数据就可以传什么数据了。
  6. AirDrop 暂时没用过

响应链冲突

  1. 一个UIControl子类(UIButton/UISwitch)方法,其响应事件的方式不同于普通的UIView,它们的事件处理由UIApplication单例直接控制!尽管文档中提到其事件处理部分仍可能使用UIResponder响应链逻辑,但其事件分发与普通的UIView完全不同。
  2. 默认情况下,识别一个触摸事件的时候,手势识别将优先于UIResponder响应链式机制,而具体体现为: 手势识别开始、变化的过程,gestureRecognizer与touchesBegan,touchesMoved同时处理响应事件。,但是,只有在gestureRecognizer判定失败的时候(譬如一个tapGestureRegcognizer遇到了一个swipe手势),系统才会触发UIResponder响应链中的touchesEnded,否则,会触发touchesCancelled。

可以通过debug+断点,看出 control的addtarget action就是通过uiapplication触发的, 手势优先级高,但手势和control都是基于响应链来做的,只能说是出于平凡,却高于平凡。

  1. control上加手势,会只执行手势(前提条件:tap手势、control是tapupinside)
  2. 父视图上添加了一个UITabelView和一个UIButton。父视图上加手势,此时能响应UIbutton,但tableivew内部的会有问题

交换两个数的方法a,b

  • 添加临时变量
  • 位运算
    int a = 3, b = 5;
    a ^= b;
    b ^= a;
    a ^= b;
    
  • 加法
    a += b;
    b = a - b;
    a = a - b;