iOS

iOS - Block

2019-08-12  本文已影响0人  ienos

使用 clang 可以将 Objective-C 编译成 C++ 代码,终端指令 clang -rewrite-objc file.m

>> Block 是什么?

>> Block 的实质是什么?

struct __Block_byref_i_0 {
  void *__isa;
__Block_byref_i_0 *__forwarding; 
 int __flags;
 int __size;
 int var;
};

>> Block 和 Delegate 区别是什么?

>> Block 分类

继承链: __NSGobalBlock__ 、__NSStackBlock__、__NSMallocBlock__ : NSBlock : NSObject

>> 对上面三种 Block 进行 Copy 操作会发生什么?

>> Block 的几种形式

>> Block 的使用场景

全局变量可以直接访问,静态变量通过获取指针修改,局部变量只能值传递,因为局部变量会随函数执行结束释放,不能通过获取指针修改

>> ARC 下编译器会自动将 Block 复制到堆区

>> MRC

>> 解决循环引用的问题 __weak

>> 为什么 __weak 之后还需要用 __strong 修饰?

__weak typeof(self) weakSelf = self;
person.block = ^{
    __strong typeof(weakSelf) myself = weakSelf;
    NSLog(@"age is %d", myself->_age);
};

强引用 weakSelf 是为了避免 weakSelf 在 Block 执行过程中被释放,一般存在于多线程开发中,Block 执行完后会释放 weakSelf,也就不会一直处于强引用状态

>>__weak 的原理 见 objc-weak

Runtime 中 __weak 维护一个哈希表,Key 为所指对象的指针,value 为 weak 指针

上一篇 下一篇

猜你喜欢

热点阅读