之前寫過一篇利用runtime解決由nstimer導致的記憶體洩漏的文章,最近和同事討論覺得這樣寫有點複雜,然後發現有nsproxy
這麼好用的根類
,根類
,根類
,沒錯nsproxy
與nsobject
一樣是根類,都遵守協議。
實際上本篇用了訊息**的機制來避免nstimer
記憶體洩漏的問題,無論是nsproxy
與nsobject
的派生類在objective-c
執行時找不到訊息都會執行訊息**。所以這個解決方案用nsproxy
與nsobject
的子類都能實現,不過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:
方法。改方法傳入乙個封裝了nsmethodsignature
的nsinvocation
物件。然後該物件通過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.將負的限定係數...