我在文档中找到了一些问题的答案,但也许你们更擅长!
我创建了一个名为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.