2015-12-21 66 views
1

快速的問題。我有一個沒有實現文件的類的項目。是否有編譯器標誌,以便鏈接器警告我這個? .h文件不帶.m文件

然後在AppDelegate中我有:

#import "AppDelegate.h" 
#import "SomeClass.h" 
@interface AppDelegate() 

@property (nonatomic, strong) SomeClass *myProperty; 

@end 

@implementation AppDelegate 


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    [self.myProperty hello]; 

// self.myProperty = [[SomeClass alloc] init]; // uncomment and fails as expected. 

    return YES; 
} 

不應該有人告訴我,有沒有實現文件?某種警告或任何事情?

如果我做了一個alloc] init],它不會按預期編譯。

該代碼實際編譯。

這是github中的項目。

https://github.com/nmiyasato/noImplementation

由於

+0

如果某個類沒有實現,它將無法鏈接。警告通常是用於編譯和鏈接的東西,但可能是錯誤的。 – dan

+0

應該有一個擴展名爲.a的庫文件,或者應該有一些與之相關的SDK(框架)。 – Smile

+0

該代碼實際編譯...我已經添加了一個示例項目。 – miya

回答

3

號這不是在編譯時或在目標C的鏈接時間檢測的。

首先,編譯器確切地知道沒有關於「頭文件」或「實現文件」的。 (這與新的模塊系統稍有不同,但這不是我們在這裏討論的。)

#import不由編譯器處理。它由預處理器處理。它需要文件SomeClass.h並在編譯器甚至看到第一行之前以文本的形式將其寫入AppDelegate.m。因此,所有編譯器必須使用的是這個巨大的文件,其中包含所有頭文件的所有文本以及此實現(儘管現在有「整個模塊優化」,這是一個鏈接步驟,而不是編譯步驟)。它無法訪問項目的其餘部分。

所以編譯器無法知道你沒有提供實現。而在ObjC中,即使編譯器查看了所有的代碼,也無法真正知道在任何地方都沒有實現,因爲您可以在運行時添加實現。其實,這很漂亮這樣做通常。這就是所有核心數據的工作原理。這些實現也可以通過共享框架(這是很常見的)連接起來,並且甚至可以在OS X上的運行時鏈接到該實現。或者實現可能位於靜態庫中,因此缺少.m仍然沒有幫助。

它甚至有可能的self.myProperty結果是隨機的「其他東西」,也就是隻假裝SomeClass。是的,我知道這聽起來很瘋狂。歡迎使用Core Foundation橋接的類集羣。這是一件事。所以甚至可能沒有以你想的方式實施。 Objective-C是一個非常瘋狂的動態語言。

作爲一個例子,下面是合法的ObjC(它甚至工作):

@interface NSString (Hello) 
- (void)hello; 
@end 

@implementation NSString (Hello)  
- (void)hello { 
    NSLog(@"I'm string's Hello!"); 
} 
@end 

... 
self.myProperty = (SomeClass *)@""; 
[self.myProperty hello]; 

你會認爲也許可以連接數字出來,但當時我們得到的鏈接,所有的對象類型爲id,所有方法都只是選擇器和方法簽名。大部分類型信息都沒有了。

那麼,如果你打電話給[[SomeClass alloc] init],爲什麼不能鏈接?首先注意到它編譯,它只是不鏈接。原因是[self.myProperty hello]是一個對象的消息。鏈接器不知道或關心對象的類型。它只需要一個指向實例的指針。但[SomeClass alloc]是一個類的消息。爲了鏈接它,鏈接器必須有一個指向類的指針。你會發現任何沒有實現的類的消息都會導致鏈接器錯誤(嘗試[SomeClass initialize])。

在你的代碼中沒有任何反應,因爲self.myProperty是零,所以沒有錯誤。即使你有一個實現,這也是一樣的。在絕大多數情況下,缺少實現文件將在鏈接期間被捕獲,因爲某處在您的系統中,您可能會撥打+alloc。所以在實踐中,這不應該經常出現,而且這種罕見的情況在不破壞大量合法的ObjC的情況下極難檢測到。

相關問題