最近一個朋友讓我幫他解決一個問題,因爲源代碼不方便貼出來,因此就本身寫了個demo把問題重現一次app
一、新建一個application,添加一個繼承於NSObject的類spa
原本是隨便寫的,就將此類命名爲Object,會出如今控制檯輸出一段文字以下code
Class Object is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/libobjc.A.dylib and /Users/groupfly/Library/Developer/CoreSimulator/Devices/1B7CAB3E-6F13-49EC-B5F7-96CB62C1D5A6/data/Containers/Bundle/Application/60D48F1B-E49D-4D2D-AAD7-A72984CF8CB7/extern.app/extern. One of the two will be used. Which one is undefined.orm
沒有仔細查閱資料,大概意思應該是 libobjc.A.dylib這個庫裏面也有一個已經實現了的Object,二者重複致使的,屬於運行時問題(編譯起來沒問題,不管有沒有在其餘文件中使用,運行以後都會出現這段文字)blog
而後把類型改成NObject繼承
.m文件以下:內存
#import "NObject.h"開發
extern int mtu;io
@interface NObject ()編譯
@end
@implementation NObject
+ (void)test{
mtu = 1; // 通常來講全局變量在聲明的文件中,不會實現
}
@end
二、不少開發者應該都知道,extern是用來聲明全局變量的,通常在聲明文件中,不會被實現,可是從朋友發出來的代碼是公司供應商提供的demo,主要文件中使用到了這個extern關鍵字,而且在此文件中對該變量屢次操做。問題即將出現,當你將此文件導入到本身的項目中時,即
#import "ViewController.h"
#import "NObject.h" // 不管有沒有導入此文件 都會報錯(此文件中聲明瞭全局變量,而且也同時對他進行了操做(複製等))
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {}
@end
這時就會報錯以下圖:
這個報錯是否是有點相似於導入第三方庫時可能會出現的現象
三、解決方法:在使用導入後的文件時,引入該全局變量便可:
#import "ViewController.h"
#import "NObject.h"
int mtu ;
@interface ViewController ()
@end
@implementation ViewController...
這樣便可解決報錯
四、查閱資料:
extern做用: 只是用來獲取全局變量(包括全局靜態變量)的值,不能用於定義變量
extern工做原理:先在當前文件查找有沒有全局變量,沒有找到,纔會去其餘文件查找。
// 全局變量:只有一分內存,全部文件共享,與extern聯合使用。
先到這吧,有後續資料再補充。。。