ARC 是否会在管理从 C 风格函数返回的 Objective C 个对象时遇到问题

Will ARC have trouble managing Objective C objects returned from a C-style function

我在文档中找不到这个问题的答案,但也许你们更擅长!

我创建了一个名为 Types.h 的 .h 文件,我在其中定义了一个 NS_ENUM:

#ifndef Types_h
#define Types_h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, DataType) {
    TYPE_STRING,
    TYPE_NUMBER,
    TYPE_BOOLEAN,
    TYPE_NULL,
    TYPE_UNDEFINED
};

NSString *dataTypeString (DataType dt);

#endif

C 风格的方法定义在 .m 文件中实现:

#import "Types.h"

// Ugly but convenient name.
NSString *dataTypeString (DataType dt) {
    switch(dt) {
        case TYPE_STRING:   return @"TYPE_STRING";
        case TYPE_NUMBER:   return @"TYPE_NUMBER";
        case TYPE_BOOLEAN:  return @"TYPE_BOOLEAN";
        case TYPE_NULL:     return @"TYPE_NULL";
        case TYPE_UNDEFINED:return @"TYPE_UNDEFINED";
    }
}

它的目的是 return 我经常使用的字符串表示 NS_ENUM 用于调试目的。

但是,我想验证这种行为是否适用于 ARC。即从 C 风格的方法中分配和 returning 一个 Objective-C 对象。

它确实适用于 ARC。 dataTypeString returns Objective-C 字符串文字。 return 对象,ARC 或不带 ARC 并不重要。 string literal 的 retainCount 总是 1(或者 -1,无论它意味着常数,无限)。

您也可以像这样使用 C 宏从枚举中获取 Objective-C 字符串文字。

@import Foundation;

typedef NS_ENUM(NSInteger, DataType) {
    TYPE_STRING,
    TYPE_NUMBER,
    TYPE_BOOLEAN,
    TYPE_NULL,
    TYPE_UNDEFINED
};

#define STRINGIFY(x) @#x

int main()
{
    NSLog(@"%ld", TYPE_BOOLEAN);
    NSLog(@"%@", STRINGIFY(TYPE_BOOLEAN));
    NSLog(@"%p", STRINGIFY(TYPE_BOOLEAN));
    NSLog(@"%p", STRINGIFY(TYPE_BOOLEAN));
    return 0;
}

结果是

2
TYPE_BOOLEAN
0x107b51058
0x107b51058   // The same address because the same string literal exists just only one.