2015-07-01 68 views
5

所以我對NSObject的稱爲CustomCategory類別,如下:類別上NSObject中也適用於

#import <Foundation/Foundation.h> 

@interface NSObject (CustomCategory) 

-(BOOL)doSomething; 

@end 

#import "NSObject+CustomCategory.h" 

@implementation NSObject (CustomCategory) 

-(BOOL)doSomething 
{ 
    NSLog(@"Done"); 
    return NO; 
} 

@end 

理想的情況下,這將是這樣一個對象上工作:

NSObject* object = [NSObject new]; 
[object doSomething]; 

然而,我發現它也可以這樣工作,沒有問題:

[NSObject doSomething]; 

所以我想知道,因爲它是一個實例方法我已經添加了類,爲什麼它也適用於類?

+1

顯示類別的聲明和定義代碼。 – zaph

+0

通過工作您的意思是它編譯或它運行doSomething內的代碼 –

+0

所有類都是NSObjects(除了可能的NSProxy)。 – user3125367

回答

3

NSObject上的實例方法也是NSObject上的類方法。

這是因爲Objective-C進行動態分派的方式。如果您向任何對象發送消息,則會在對象類中查找方法實現。如果您向某個類發送消息,則會向該類對象發送常規消息。在所謂的元類中查找實現。元類是由編譯器自動生成的。類方法只是元類的實例方法。這由編譯器透明地處理。

繼承也適用於元類級別。因此,類的元類繼承自其超類的元類。我們有兩個並行的繼承層次結構。只有像NSObject這樣的根類纔會有不同的處理。那裏的元類不能繼承超類的元類,因爲沒有超類。對於根類,元類繼承自根類本身。

而且由於類的類方法是其元類的實例方法,並且NSObjects元類繼承自NSObject,因此NSObject上的實例方法也是NSObject上的類方法。

+1

s/NSObject/Root Class/g。還有其他的根類,如NSAtom,NSProxy等。 –

+0

NSObject的元類IS NOT NSObject。它絕對是分開的。 –

+0

是的,解決了這個問題。它不是NSObject,它從NSObject繼承。否則,根類根本就沒有類方法。 – Sven

-2

Objective C中的每個Class在內部都是一個對象,這意味着它是NSObject的一個子類。

+0

不完全。元類不是全部從'NSObject'繼承,也不是'NSObject'的實例。實際上,它們在方法解析期間完全分開處理,以處理根對象情況。 –

+0

沒錯,每個班級都是一個對象。但類對象類不是自動的NSObject。 @ RichardJ.RossIII:從NSObject繼承的任何類的元類也從NSObject繼承。根類是他們自己的元類。 – Sven

+1

@Sven,但它不是'NSObject'的實例,這使得這個答案誤導。真正的答案是,對於傳統用途,方法解決方案是針對根類別單獨處理的。 –

3

僅供參考,以人找的這個在運行源的實際位置,但目前居住在objc-runtime-new.mmmethodizeClass功能:

... snip... 

// Root classes get bonus method implementations if they don't have 
// them already. These apply before category replacements. 

if (cls->isRootMetaclass()) { 
    // root metaclass 
    addMethod(cls, SEL_initialize, (IMP)&objc_noop_imp, "", NO); 
} 

... snip ... 

...和元級的+initialize方法從其實例添加所有方法實現並將它們轉換爲類方法。

而與@Sven所說的相反,NSObject的元類實際上並不是NSObject。一個類在運行時總是有一個單獨的元類,不管它是否是root。

+0

你的代碼片段什麼都沒說,它顯示了從根元類的初始化來自哪裏。我承認,我有點不準確,我只是查了一下。 NSObject的元類不是NSObject,它直接從NSObject繼承。每個對象都有一個類,每個類都必須有一個超類,並且這些並行繼承層次結合在一起。 – Sven

相關問題