静态NSMutableArray和多线程用法的含义

 小涵竹叶 发布于 2023-01-31 12:17

static以下代码究竟做了什么,何时应该或更好地使用Static:

// Returns an array of 30 odd numbers
- (NSArray *)odds
{
static NSMutableArray *odds;
odds = [[NSMutableArray alloc] init];
int i = 1;
while ([odds count] < 30) {
[odds addObject:[NSNumber numberWithInt:i]];
i += 2;
}
return odds;
}

Martin R.. 8

你问题中的代码最初是

- (NSArray *)odds
{
    static NSMutableArray *odds = [[NSMutableArray alloc] init];
    // ... fill array ...
    return odds;
}

并且您在(现已删除)评论中说,您在"大书呆子牧场指南"中找到了该代码.

好吧,那个指南有一个错误.

程序生命周期中存在一个静态局部变量,但只能在声明它的函数内部看到.在重复的函数调用之间保留变量的值.

在C和Objective-C中,静态局部变量只能用编译时常量初始化

static NSMutableArray *odds = [[NSMutableArray alloc] init];

无效的.(顺便说一下,C++中不存在这种限制.因此,上述代码在Objective-C++中有效,尽管没有意义.)

那么如何解决这个问题呢?方法1 :(最简单的解决方案.)删除static:

- (NSArray *)odds
{
    NSMutableArray *odds = [[NSMutableArray alloc] init];
    // ... fill array ...
    return odds;
}

现在odds是一个普通的局部变量,每次调用函数时都会创建并填充数组.

方法2:当第一次调用该方法时,静态变量只能用于创建和填充数组一次.那看起来像是:

- (NSArray *)odds
{
    static NSMutableArray *odds = nil;
    if (odds == nil) { // Check if array has already been initialized or not.
        odds = [[NSMutableArray alloc] init];
        // ... fill array ...
    }
    return odds;
}

函数"记住"变量的值,因此当第二次调用该函数时,它将返回现有数组,而不会创建新数组.

方法3:仅初始化一次的"现代"方法是使用GCD功能dispatch_once():

- (NSArray *)odds
{
    static NSMutableArray *odds;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        odds = [[NSMutableArray alloc] init];
        // ... fill array ...
    });
    return odds;
}

这具有线程安全的额外优点.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有