如何要声明一个可以被全局访问的的字符串常量👇
UIKIT_EXTERN NSString *const PYSearchPlaceholderText;
#define UIKIT_EXTERN extern __attribute__((visibility ("default")))
</br>
const 用法解释
四种写法:
1. static const NSString *HSCoder = @"汉斯哈哈哈"; // 指向的指针不能改变,static限制了不能被外部文件访问了
2. const NSString *HSCoder = @"汉斯哈哈哈"; // 指向的内存地址的内容不能改变,但是可以改变指向的指针
3. NSString const *HSCoder = @"汉斯哈哈哈"; // 指向的内存地址的内容不能改变,但是可以改变指向的指针
4. NSString * const HSCoder = @"汉斯哈哈哈"; // // 指向的内存地址的内容不能改变(NSString本身就不能改变),指向的指针也不能改变。
注意:
- 以上4种情况,在另外一个文件中使用extern修饰变量,可以直接改变地址内存的内容。(不知道该怎么解决....才能使得在另外的文件中也不能修改)
- 局部常量:用static修饰后,不能提供外界访问
参考http://www.jianshu.com/p/f83335e036b5
</br>
static 用法解释
</br>
extern 用法解释
在源文件A里定义的变量,在其它源文件里是看不见的(即不能访问)。为了在源文件B里能调用这个函数,应该在B的头部加上一个外部声明: extern 变量; 这样,在源文件B里也可以调用那个变量了。
注意这里的用词区别:在A里是定义,在B里是声明。一个函数只能(也必须)在一个源文件里被定义,但是可以在其它多个源文件里被声明。定义引起存储分配,是真正产生那个实体。而声明并不引起存储分配。
打一个粗俗的比方:在源文件B里声明后,好比在B里开了一扇窗,让它可以看到A里的那个变量。
attribute 用法解释
attribute是GNU C的一种机制,用法为attribute_ ((attribute-list))。当项目需要作为一个库被外包引用的时候通常在编译时可以用参数-fvisibility指定所有符号的可见性。在编译命令中加入 -fvisibility=hidden参数,会将所有默认的public的属性变为hidden。此时,如果对函数设置attribute((visibility ("default")))参数,使特定的函数仍然按默认的public属性处理,则-fvisibility=hidden参数不会对该函数起作用。所以,设置了-fvisibility=hidden参数之后,只有设置了attribute((visibility ("default")))的函数才是对外可见的。
</br>
总结:如果需要让类或方法可以让库外被引用,就需要使用以上代码确保代码的可见性。