ARC在管理从C风格函数返回的Objective - C对象时会遇到麻烦吗?



我在文档中找到了一些问题的答案,但也许你们更擅长!

我创建了一个名为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";
    }
}

它的目的是返回我经常使用的NS_ENUM的字符串表示形式,用于调试目的。

然而,我想验证这种类型的行为是否适用于ARC。即从c风格的方法中分配并返回一个Objective-C对象。

它与ARC一起工作。dataTypeString返回Objective-C字符串字面值。无论如何返回对象,是否使用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.

最新更新