2016-04-16 57 views
0

說我有這樣的實例方法[1]:動態的方法添加到應用程序委託

-(BOOL)application:(UIApplication *)application 
       openURL:(NSURL *)url { 

     NSLog(@"url --> %@", url); 
     //Do something... 
     return YES; 
    } 

如果我沒有記錯,[[UIApplication sharedApplication] delegate] [2] 是我的應用程序委託的實例。

我想動態地將我的實例方法[1]添加到任何其他類的應用程序委託[2]。

我發現class_addMethod*info可能會幫助我,但它沒有提及如何指定它的實例方法或類方法。

編輯:

繼@mipadi的建議波紋管,我想打電話給

class_addMethod([AppDelegate class], @selector(newMethod), (IMP)myMethodIMP, "[email protected]:");

,但我得到了以下錯誤:

  • Missing '[' at start of message send expression
  • Expected ']'
  • Size of array has non-integer type 'Class'

與以下警告:

  • Type specifier missing, defaults to 'int'

我真的不知道什麼是錯誤的,這個錯誤沒有多大意義的我。

+1

爲什麼?解釋你真正想要完成的事情。您的問題可能有更好的解決方案。 – rmaddy

+1

是的,聽起來像[X-Y問題](http://meta.stackexchange.com/q/66377/192165)。 –

+0

我想不出一個用例。你能解釋一下你爲什麼要這樣做嗎? – vikingosegundo

回答

1

class_addMethod始終將實例方法添加到類中。要添加類方法,您需要將該方法添加到您的類元類

假設您的代理班級名爲MyDelegate。顯然你可以創建MyDelegate的實例。例如,在id obj = [[MyDelegate alloc] init]中,objMyDelegate的一個實例。但是,MyDelegate類本身是其元類的一個實例。正是這個元類添加了MyDelegate的類方法,因爲MyDelegate的類方法實際上是在其元類上定義的實例方法。

所以,添加一個實例方法,你會做這樣的事情:

class_addMethod([MyDelegate class], @selector(newMethod), (IMP) newMethodImpl, newMethodTypeSig); 

要添加一個類的方法,你會做同樣的MyDelegate的元級作爲第一個參數,你可以得到使用object_getClass

class_addMethod(object_getClass([MyDelegate class]), @selector(newClassMethod), (IMP) newClassMethodImpl, newClassMethodTypeSig); 

(需要注意的是有點混亂,[myDelegateInstance class][MyDelegate class]實際上將返回相同的對象;日在,+[MyDelegate class]返回自己。 [MyDelegate class]確實不是返回MyDelegate的元級,如你所料。)

相關問題