探索 iOS 小技能:static 和 extern 存储类的应用
2023-09-09 08:22:58
在 iOS 开发中,存储类是一个重要的概念,它决定了变量或函数的作用域和生存期。两个常用的存储类是 static 和 extern,它们在不同的场景下发挥着不同的作用。
static 存储类
- static 存储类使变量或函数仅在定义它们的源文件中可见。
- static 变量在第一次被访问时被初始化,并且在整个程序的执行期间保持其值。
- static 函数不能被其他文件中的函数调用,除非它们被声明为 extern。
- static 变量和函数通常用于实现模块化和封装。
extern 存储类
- extern 存储类使变量或函数对所有源文件可见。
- extern 变量在第一次被访问时被初始化,并且在整个程序的执行期间保持其值。
- extern 函数可以被其他文件中的函数调用,前提是它们在该文件中被声明为 extern。
- extern 变量和函数通常用于实现全局变量和公共方法。
创建共享实例
static 存储类可以用于创建共享实例。共享实例是指在整个应用程序中都可以访问的实例。例如,我们可以使用 static 来创建一个数据库连接实例,如下所示:
static sqlite3 *database = nil;
@implementation DatabaseManager
+ (sqlite3 *)database {
if (database == nil) {
// 初始化数据库连接
database = ...;
}
return database;
}
@end
这样,我们就可以在任何地方使用 [DatabaseManager database]
来访问数据库连接。
声明公共方法
extern 存储类可以用于声明公共方法。公共方法是指可以在其他文件中调用的方法。例如,我们可以使用 extern 来声明一个公共方法,如下所示:
extern void someFunction();
@implementation MyClass
- (void)someMethod {
// 调用公共方法
someFunction();
}
@end
这样,我们就可以在 MyClass
中调用 someFunction()
方法。
全局字符串常量
static 存储类可以用于声明全局字符串常量。全局字符串常量是指在整个应用程序中都可以访问的字符串常量。例如,我们可以使用 static 来声明一个全局字符串常量,如下所示:
static NSString *const kMyString = @"Hello, World!";
这样,我们就可以在任何地方使用 kMyString
来访问字符串常量。
static 和 extern 的差异
static 和 extern 之间的差异主要在于作用域和可见性。static 变量或函数仅在定义它们的源文件中可见,而 extern 变量或函数对所有源文件可见。
static 和 extern 的优缺点
static 和 extern 各有其优缺点。static 的优点是它可以实现模块化和封装,而 extern 的优点是它可以实现全局变量和公共方法。
结语
static 和 extern 是两个重要的存储类,它们在 iOS 开发中发挥着不同的作用。理解和掌握这两个存储类的用法,可以帮助我们编写出更加健壮和可维护的代码。