0

有人可以澄清一下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
4

2 回答 2

1

ARC 自动管理 Objective-C 对象。所有其他类型都像在 C 中一样进行管理。

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

于 2012-10-16T17:14:33.657 回答
0

与 MRC 相比(相对于 GC - 现在已弃用)ARC 管理 Objective-C 对象 - noretain或.releaseautorelease

一般来说,它不管理核心基础对象——对于那些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 管理的对它的强引用。

于 2012-10-16T19:15:47.893 回答