Objective c ARC在管理从C风格函数返回的目标C对象时会遇到问题吗
我在文档中找到这个问题的答案时遇到了一些困难,但也许你们在这方面做得更好 我已经创建了一个名为Types.h的Objective c ARC在管理从C风格函数返回的目标C对象时会遇到问题吗,objective-c,automatic-ref-counting,Objective C,Automatic Ref Counting,我在文档中找到这个问题的答案时遇到了一些困难,但也许你们在这方面做得更好 我已经创建了一个名为Types.h的.h文件,其中我定义了一个NS_枚举: #ifndef Types_h #define Types_h #import <Foundation/Foundation.h> typedef NS_ENUM(NSInteger, DataType) { TYPE_STRING, TYPE_NUMBER, TYPE_BOOLEAN, TYPE_N
.h
文件,其中我定义了一个NS_枚举:
#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
它的目的是返回常用NS_枚举的字符串表示形式,以用于调试
但是,我想验证这种行为是否适用于ARC。例如,从C样式方法中分配并返回Objective-C对象。它确实适用于ARC<代码>数据类型字符串返回Objective-C字符串文字。无论如何返回对象(圆弧或无圆弧)。字符串文字的重新计数始终为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.
它确实适用于ARC。是正确的,字符串是否是字符串文字无关紧要。这个答案实际上是“它是巧合”。更好的答案是,在ARC下从C函数返回对象的工作原理与从方法返回对象的工作原理相同(这并不奇怪,因为方法只不过是带有两个预定义参数的C函数)。此外,重新计算的措辞是错误的,暗示它有意义也没有用。
2
TYPE_BOOLEAN
0x107b51058
0x107b51058 // The same address because the same string literal exists just only one.