【问题标题】:How to convert this to ARC如何将其转换为 ARC
【发布时间】:2016-12-08 18:14:42
【问题描述】:

我正在将一些较旧的 Obj-C 代码转换为 ARC。我有这个方法:

+ (NSString **)sortKeys
{
    return sortKeys;
}

我从自动转换中得到的抱怨是:

无法使用“NSString *__strong”类型的左值初始化“NSString *__autoreleasing *”类型的返回对象 [14]

sortKeys 声明为:

static NSString *sortKeys[] = {
NAME_KEY,
CATNUM_KEY,
CATNUM_NAME_KEY,
MAG_KEY,
DISTANCE_KEY,
CONST_KEY,
RISE_KEY,
TRANSIT_KEY,
SET_KEY,
RA_KEY,
DEC_KEY,
AZM_KEY,
ALT_KEY,
DATE_KEY
};

调用时也有投诉:

    NSString **sortKeys = [ListMgr sortKeys];

我不想转移字符串的任何所有权,我只是希望调用者能够遍历它们。

使用ARC时如何声明方法?

【问题讨论】:

    标签: objective-c automatic-ref-counting


    【解决方案1】:

    这与 ARC 不兼容。它不能安全地对它进行内存管理。您依赖于未承诺的行为(因此这一直是不安全的)。 sortKeys 没有保留 NAME_KEY,因此无法保证 NAME_KEY 有效。您可能碰巧有特殊的知识(因为 NAME_KEY 是一个静态字符串,例如),但这是一个实现细节,而不是语言承诺。 ARC 是关于保证,而不是“我们碰巧侥幸逃脱”。

    正确的工具是NSArray

    @interface MyClass : NSObject
    + (NSArray<NSString *>*)sortKeys;
    @end
    
    @implementation MyClass
    
    static NSArray<NSString *>* sortKeys;
    
    + (void)initialize {
        if (self == [MyClass class] ) {
            sortKeys = @[ ... ];
        }
    }
    
    + (NSArray<NSString *>*)sortKeys
    {
        return sortKeys;
    }
    
    @end
    

    如果您无法更改接口,则必须将此定义保存在非 ARC 文件中。

    我把你的缓存放在这里,但如果你不经常调用+sortKeys,我会去掉static,每次只构造一个新数组。它很便宜,尤其是在这种情况下:

    @interface MyClass : NSObject
    + (NSArray<NSString *>*)sortKeys;
    @end
    
    @implementation MyClass
    
    + (NSArray<NSString *>*)sortKeys
    {
        return @[...]; // Just put your value here; then it's simple
    }
    
    @end
    

    【讨论】:

    • 是的,我想我可以改变界面。需要大量其他代码更改,但在总体方案中没有任何内容。谢谢大家。
    【解决方案2】:

    您可以使用NSArrayinitWithObjects:count: 初始化程序将C 数组转换为Foundation 数组,并创建一个ARC、内存安全数组:

    + (NSArray<NSString *> *)sortKeys
    {
        static NSArray<NSString *> *convertedKeys;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            convertedKeys = [[NSArray alloc] initWithObjects:sortKeys count:sizeof(sortKeys)];
        });
        return convertedKeys;
    }
    

    您将获得与 ARC 兼容的代码,还可以访问 NSArray 的辅助方法 - 例如 count、快速枚举等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多