objective-c static变量的使用总结
在java中,我们经常使用的是单例模式,这些设计模式在ios开发中也比较常用,最近也在考虑使用在ios开发中使用单例模式
在objective-c中,需要在.m文件里面定义个static变量来表示全局变量(和java里面的类变量类似,但是在objective-c中,static变量只是在编译时候进行初始化,对于static变量,无论是定义在方法体里面 还是在方法体外面其作用域都一样
在我们经常使用的UITableViewController里面,在定义UITableCellView的时候,模板经常会使用以下代码
1
2
3
4
5
6
7
8
9
10
11
|
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; return cell; } |
在上面 定义了static变量,这个变量在编译期会对这个变量进行初始化赋值,也就是说这个变量值要么为nil,要么在编译期就可以确定其值,一般情况下,只能用NSString或者基本类型 ,并且这个变量只能在cellForRowAtIndexPath 访问,这个变量和java里面的static属性一样,但是java的static属性是可以在java类里面的任何访问,定义在方法体里面的static变量只能在 对应的访问里面访问,但是变量确是类变量。这个和C语言里面的static的变量属性一样。
1
2
3
4
5
6
7
8
9
10
11
|
void counter{ static int count = 0; count ++; } counter(); counter(); |
上面代码执行完成之后,第一次count的值为1,第二次调用count的值为2
static变量也可以定义在.m的方法体外,这样所有的方法内部都可以访问这个变量。但是在类之外是没有办法方法的,也就是不能用 XXXClass.staticVar 的方式来访问 staticVar变量。相当于static变量都是私有的。
如果.m文件和方法体里面定义了同名的static 变量,那么方法体里面的实例变量和全局的static变量不会冲突,在方法体内部访问的static变量和全局的static变量是不同的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@implementation IFoundAppDelegate static NSString * staticStr = @"test"; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { static NSString * staticStr = @"test2"; NSLog(@"the staticStr is %@ -- %d",staticStr,[staticStr hash]); } - (void)applicationWillResignActive:(UIApplication *)application { NSLog(@"the staticStr is %@ -- %d",staticStr,[staticStr hash]); } |
以上两个static变量是两个不同的变量,在didFinishLaunchingWithOptions方法内部,访问的是方法体内部定义的staticStr变量,在applicationWillResignActive方法体里面,访问的全局定义的staticStr变量。可以通过日志打印其 hash来进行确认两个变量是否一样。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库