MRC と比較して (現在非推奨となっている GC とは対照的に) ARC は Objective-C オブジェクトを管理します - no retain
、release
またはautorelease
.
一般に、それはコア基盤オブジェクトを管理しません-それらのためにCFRetain
、CFRelease
まだ必要です。
malloc
ARC は、およびフレンドに割り当てられた 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;
name
この属性は、オブジェクトを保持するか解放するかを決定するために、フィールドに格納されたすべての参照を無視するように ARC に指示します。ARC は、 によって参照されるオブジェクトをいつでも解放する可能性があるname
ため、安全ではなく、保持されません。このような構造を安全に使用するには、参照されているオブジェクトが他の手段で保持されていることを確認する必要があります。