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