extern引起的闹剧

最近一个朋友让我帮他解决一个问题,因为源代码不方便贴出来,因此就本身写了个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联合使用。

先到这吧,有后续资料再补充。。。

相关文章
相关标签/搜索