2014-02-21 106 views
2

在我的代碼中,我想知道方法是類方法還是實例方法。我目前使用的代碼有效,但我想知道是否存在一種方式。方法是類方法或實例方法

當前代碼爲「檢測」,如果它是一個類方法或實例:

Method method = class_getInstanceMethod(class, selector); 
if (method) { 
    __strong Class object = [[class alloc] init]; 
    objc_msgSend(object, selector); 
}else { 
    method = class_getClassMethod(class, selector); 
    if (method) { 
    objc_msgSend(class, selector); 
    } 
} 
+0

我很確定你的代碼不能改進。如果您真的想要,您可以將'objc_msgSend'更改爲'performSelector:',但這樣做沒有實際意義。 – Avt

+2

我對你的動機很感興趣。 objective = c中的每個簽名都會告訴你它是一個類還是一個實例方法,所以我很好奇你爲什麼在運行時需要這個方法 –

+0

@NuclearGhost我想調用一個對象上可能不存在的方法。這可能是一個實例方法或類方法。沃倫伯頓爲什麼倒置,因爲它只會實例化,如果它是一種類方法。這個目標文件可能不會被導入。這是一個通用的功能。我可以做兩個功能,一個用於其他類。 – Haagenti

回答

3

有很少就可以提高超過兩個if聲明。您可以使用respondsToSelector:方法來代替,但因爲你沒有一個對象,開始時,你會落得一個if而不是內部的if一個更好看的else if

if ([class respondsToSelector:selector]) { 
    // Call class method 
} else { 
    id object = [[class alloc] init]; 
    if ([object respondsToSelector:selector]) { 
     // Call instance method 
    } 
} 

如果你可以修改程序流以一個對象而不是一個類開始,你可以這樣做:

if ([object respondsToSelector:selector]) { 
    // Call instance method 
} else if ([[object class] respondsToSelector:selector]) { 
    // Call class method 
} 
+0

方法沒有響應選擇器 – Haagenti

+0

@MouNtant方法是一個選擇器,一個對象有一個選擇器。這是比你在問題中發佈的代碼簡單得多的代碼 –

+0

@MouNtant我沒有意識到你一開始沒有「對象」。我編輯答案,以類似於你所做的方式開始。 – dasblinkenlight