0

誰かがARCが管理しているものを正確に明確にしてくれませんか?c-structを管理していないと聞きましたが、それでも人々がそれらを使用しているのを目にします。以下のどのバリアルブが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 オブジェクトを管理します - no retainreleaseまたはautorelease.

一般に、それはコア基盤オブジェクトを管理しません-それらのためにCFRetainCFReleaseまだ必要です。

mallocARC は、およびフレンドに割り当てられた 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ため、安全ではなく、保持されませ。このような構造を安全に使用するには、参照されているオブジェクトが他の手段で保持されていることを確認する必要があります。

于 2012-10-16T19:15:47.893 に答える