利用NSProxy解決NSTimer記憶體洩漏問題

2021-07-11 18:01:31 字數 2444 閱讀 8625

之前寫過一篇利用runtime解決由nstimer導致的記憶體洩漏的文章,最近和同事討論覺得這樣寫有點複雜,然後發現有nsproxy這麼好用的根類根類根類,沒錯nsproxynsobject一樣是根類,都遵守協議。

實際上本篇用了訊息**的機制來避免nstimer記憶體洩漏的問題,無論是nsproxynsobject的派生類在objective-c執行時找不到訊息都會執行訊息**。所以這個解決方案用nsproxynsobject的子類都能實現,不過nsproxy從類名來看是**類專門負責**物件**訊息的。相比nsobject類來說nsproxy更輕量級,通過nsproxy可以幫助objective-c間接的實現多重繼承的功能。

當程式執行時呼叫乙個沒有實現的方法,會採用三個訊息**步驟如果這三個步驟都不能成功那麼此時程式會丟擲乙個異常。

1.新增方法到類物件,對於例項方法呼叫respondstoselector:,對於類方法呼叫resolveclassmethod:

+(bool)resolveclassmethod:(sel)sel;

-(bool)respondstoselector:(sel)aselector;

2.查詢forwardingtargetforselector:方法,該方法返回乙個新物件,如果返回nil那麼將跳轉到下一步驟。

-(id)forwardingtargetforselector:(sel)aselector;
3.通過methodsignatureforselector:方法獲取乙個nsmethodsignature型別的物件,呼叫forwardinvocation:方法。改方法傳入乙個封裝了nsmethodsignaturensinvocation物件。然後該物件通過invakewithtarget:方法將訊息**給其它物件。

-(nsmethodsignature *)methodsignatureforselector:(sel)aselector;

- (void)forwardinvocation:(nsinvocation *)invocation;

.h檔案

#import 

@inte***ce

lsyviewcontroller : uiviewcontroller

@end

@inte***ce

lsyproxy : nsproxy

@property (nonatomic,weak) id obj;

@end

.m檔案

#import "lsyviewcontroller.h"

@inte***ce

lsyviewcontroller ()

@property (nonatomic,strong) lsyproxy *proxy;

@property (nonatomic,strong) nstimer *timer;

@property (nonatomic) nsinteger count;

@end

@implementation

lsyviewcontroller

-(void)viewdidload

-(void)timerevent

-(void)dealloc

@end

#pragma mark - lsyproxy implementation

@implementation

lsyproxy

- (nsmethodsignature *)methodsignatureforselector:(sel)aselector

- (void)forwardinvocation:(nsinvocation *)invocation

@end

原理和我之前寫的利用runtime解決由nstimer導致的記憶體洩漏是一樣的,只不過實現不同,之前是利用關聯物件的方法來斷開nstimer與檢視之間的引用關係,這個是利用訊息**來斷開nstimer物件與檢視之間的引用關係。

NSProxy解決迴圈引用問題

最近在使用nstimer 新增到runloop時 發現引用timer的view和controller無法正常釋放,即不會呼叫view或者controller的 dealloc 方法。這是因為timer在新增target時,timer持有target,而target本身又持有timer,導致迴圈引用。...

利用棧解決迷宮問題

迷宮問題 如圖所示 從左上角出發,然後從下面出來。利用檔案讀寫的方式,讀取迷宮,然後利用棧,進行搜尋是否能夠找到出口,上下左右四個方向進行判斷,如果找不到,就回溯。pragma once pragma once include include define n 10 struct position ...

利用Matlab解決規劃問題

整數規劃 非線性規劃 二次規劃 將線性規劃問題的一般形式轉化為標準形式 1.若為maxf x 則化為 maxf x 2.將不等式約束化為等式約束 1 若gi x bi,轉為gi x xk bi 2 若gi x bi,轉為gi x xk bi 3.將任意變數轉為非負變數 即xi 0 4.將負的限定係數...