1. 程式人生 > >iOS 不使用 Weak-Strong Dance,怎麼避免迴圈引用?

iOS 不使用 Weak-Strong Dance,怎麼避免迴圈引用?

疑惑

以下是引用:

這是來自 PopCustomAnimation.h 

/**

@param target The object being animated.

Reference the passed in target to help avoid retain loops.

*/

typedef BOOL (^POPCustomAnimationBlock)(id target, POPCustomAnimation *animation);

這個block裡面的引數,從某種意義上來說,是冗餘的。因為你從block中總是能夠 顯式的引用到任何的外部物件。
但是它是非常有用的,因為現在你能夠使用引數,而不是做一個 weak 的引用。

之前看到這個的時候,一直沒想明白
直到後來看了這篇文章
使用 Heap-Stack Dance 替代 Weak-Strong Dance,優雅避開迴圈引用
的詳細介紹後
才明白


正題

之前有看到過
iOS 之 UIControl 的 Block 響應方式
這種使用方式
缺點是需要使用 Weak-Strong Dance
來避免迴圈引用

於是
我就想著
既然明白了不使用 Weak-Strong Dance 就能避免迴圈引用的道理
為何不改進一下 UIControl 的 Block 響應方式

呢?


實現

參考 BlocksKit 中 UIControl+BlocksKit.m的實現方式

實現如下:

.h

typedef void(^JHUIControlBlock)(id target, id sender);

@interface UIControl (JHBlock)

- (void)jh_handleEvent:(UIControlEvents)events inTarget:(id)target block:(JHUIControlBlock)block;

@end

示例:

在一個控制器 ( DemoViewController ) 內添加了一個按鈕
新增點選事件

[button jh_handleEvent:1<<6 inTarget:self block:^(id  _Nonnull target, id  _Nonnull sender) {
        
}];

把 block 內的引數 id _Nonnull target 修改為 DemoViewController *vc

[button jh_handleEvent:1<<6 inTarget:self block:^(DemoViewController *vc, id  _Nonnull sender) {
	
        // 這裡就可以直接 使用控制器 vc 了
        vc.navigationItem.title = @"修改了標題";
        
        // 呼叫其他方法
        [vc goNextVC];
        
        // 不再需要使用 Weak-Strong Dance 了
        // 內部對 target ( 這裡是指 self ) 是使用的 weak 引用
        // 所以不用擔心
}];

倉庫

地址 : https://github.com/xjh093/JHUIControlBlock


參考