有人可以澄清一下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
答案 0 :(得分:1)
ARC自动管理Objective-C对象。所有其他类型的管理方式与它们一直在C中一样。
请注意,在您的示例中,没有与CGPoint实例变量关联的分配;内存有效地与对象内联分配。
答案 1 :(得分:0)
与MRC(与GC相对 - 现已弃用)相比,ARC管理Objective-C对象 - 无retain
,release
或autorelease
。
一般情况下,它不管理核心基础对象 - 仍然需要CFRetain
和CFRelease
。
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正在管理它。