Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c ARC在管理从C风格函数返回的目标C对象时会遇到问题吗_Objective C_Automatic Ref Counting - Fatal编程技术网

Objective c ARC在管理从C风格函数返回的目标C对象时会遇到问题吗

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

我在文档中找到这个问题的答案时遇到了一些困难,但也许你们在这方面做得更好

我已经创建了一个名为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_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.