写这篇文章的原因:
之前组里一个队友在写OC的时候,在OC的.h头文件里初始化并赋值了一个静态的字符串变量,并在多个.m实现文件引入了这个头文件然后使用了这个静态成员变量(虽然这种做法不提倡),导致程序出现了一些奇奇怪怪的行为(每个.m文件中的静态变量都不一样),他找了很久也百思不得解。这里我就针对这个问题谈谈预编译过程,以及浅谈相关的编译和链接的一些知识,希望对大家有帮助,也欢迎大神吐槽拍砖:
文章结构图.png 在.h中添加静态变量的情况如下:
s1.png
那我们开始,首先普及一下概念
静态变量:
-----首先普及一下加上 static 关键字的静态变量的特性:OC 是基于 C 语言的,在C语言中一个变量加上 static 关键字代表这个变量是只能在当前文件内使用的,并且在当前文件内同名的静态成员变量只能有一个,如果有多个那么后初始化并赋值的静态变量会把之前同名的覆盖。
预编译:
然后简单讲讲预编译:预编译就是在编译之前由IDE(对我们来说就是XCODE)对文件进行的一些处理,其中包括:1.宏替换(#define); 2.文件包含(#import) ;和 3.条件编译(#if #endif); 三项。这里只介绍概念,后文会细说。当然这个阶段还会对我们写的注释进行处理比如 #pragma 。通俗的说预编译就是对带 “井” 前缀(#***)的部分进行处理和简单的替换操作。那么以下我就针对开头我说的,在头文件中引入静态变量问题开始讲:
1.首先讲讲本次测试用的类的结构和方法,如下图:
首先是 ContainStringClass 类的 .h 文件中有一个静态变量方法:
static NSString *staticString = @“origin”;
然后是它的两个方法,一个是改变静态变量 staticString 值的方法