ARC管理什么样的变量?

时间:2012-10-16 17:09:18

标签: objective-c automatic-ref-counting

有人可以澄清一下ARC管理的确切内容吗?我听说它不管理c-structs,但我仍然看到人们使用它们。请告诉我以下哪些变量将由ARC管理以及为什么。

static CGPoint _var1;
int _var2;

@interface class1:NSObject
    CGPoint _var3;
    CGPoint _var4;
    NSString *_var5;
    NSString *_var6;
}
@property (assign) CGPoint var3;
@property (strong) NSString *var5;
@end

@implentation class1
@synthesize var3 = _var3;
@synthesise var5 = _var5;
@end

2 个答案:

答案 0 :(得分:1)

ARC自动管理Objective-C对象。所有其他类型的管理方式与它们一直在C中一样。

请注意,在您的示例中,没有与CGPoint实例变量关联的分配;内存有效地与对象内联分配。

答案 1 :(得分:0)

与MRC(与GC相对 - 现已弃用)相比,ARC管理Objective-C对象 - 无retainreleaseautorelease

一般情况下,它不管理核心基础对象 - 仍然需要CFRetainCFRelease

ARC不管理分配有malloc和朋友的C对象,因为需要手动内存管理。

C结构不是动态分配的,它们是值类型,就像整数和字符一样。如果您将指针声明为C结构并使用malloc和朋友动态分配它们,那么您可以像使用任何其他动态分配的C对象一样手动管理它们。

您在ARC和C结构方面所听到的内容是对允许的字段类型的更改。根据MRC声明:

typedef struct
{
   int count;
   NSString *name;
} Item;

有效name是使用通常的retain等手动管理的。但是对于ARC,它是不允许的,没有对象引用由ARC可以用作结构中的字段类型。

上述结构的推荐替代方法是使用Obj-C对象。但是,如果您确实需要值语义,则可以使用__unsafe_unretained属性标记字段:

typedef struct
{
   int count;
   __unsafe_unretained NSString *name;
} Item;

此属性指示ARC忽略存储在name字段中的任何引用,以确定是否应保留或释放对象。 ARC可以随时释放name引用的对象,因此不安全& 未保留。要安全地使用这样的结构,您必须确保引用的对象被其他方式保留,例如:通过强烈提及ARC正在管理它。