2013-10-22 28 views
3

我們使用[ClassName class]檢查新版本iOS中的弱鏈接類或類。 [ClassName class]引發了什麼?它是否通過NSClassFromString?[ClassName class]引發了什麼?

+1

如果你想薄弱環節,我相信'[類名類]'將無法工作。你有一個關於類符號的鏈接引用,所以你將無法使用它。你將不得不使用'NSClassFromString()'。 – nielsbot

+0

第一個編譯和鏈接一個類的引用,第二個沒有關於類的可用性的假設。所以不,'[ClassName類]'可能不使用'NSClassFromString()' – nielsbot

+0

@nielsbot [它會編譯和鏈接](http://stackoverflow.com/questions/14002304/how-to-import-social-據我所知,僅限於框架 - for-ios-6/14002350#14002350)。 – 2013-10-22 23:03:54

回答

2

請記住,在obj-c中,您可以發送消息給nil。

我懷疑發生了什麼事是ClassName是零,直到它由運行時加載。如果它永遠不會被加載,那麼你基本上是將類的消息發送到nil,根據文檔它將返回0/nil。根據the docs

這工作,因爲如果一個弱鏈接的類不可用時,將消息發送到它像發送消息到零。如果您對弱鏈接的類進行子類化,並且超類不可用,那麼該子類也不可用。

重要的是,對於這個工作框架必須支持其類的NS_CLASS_AVAILABLE(10_5, 2_0)宏。

0

這裏有一些事情正在進行。弱鏈接只是告訴LLVM(-weak_framework <framework_name>)不要擔心符號和優化。 Apple建議在支持以前的未來運行時SDK時啓用此選項。您不能鏈接到SDK中不存在的框架。

至於[ClassName class]這不是NSString也不是免費橋對應CFStringRef。這是Objective-C類的元數據

typedef struct objc_object { 
    Class isa; 
} *id; 

身份通過NS_CLASS_AVAILABLE宏觀測試,其掃描從運行時元數據導出的所有對象。

蘋果參考文件 https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW3

+0

我敢肯定'[類名類]'返回一個Class(又名'typedef結構objc_class *類;')不是objc_object(又名* ID) –

+0

@BradAllred是正確的,它實際上是 '@interface NSObject的 { Class isa; }' –

相關問題