1

ここに2つのコードのスナップショットがあります-

@interface A:NSObject
{
     NSMutableArray *a;
}

@property (retain)   NSMutableArray *a;


@implementation

@synthesize a;

-(id)init
{
      if(self=[super init])
     {
            a=[[NSMutableArray alloc] init];
     }
}

@end


@interface A:NSObject
{
     NSMutableArray *_a;

}

@property (retain)   NSMutableArray *a;



@implementation

@synthesize  a=_a;

-(id)init
{
      if(self=[super init])
     {
            _a=[[NSMutableArray alloc] init];
     }
}

@end

今私が知る必要があるのは、アクセサーを使用するのではなく、コードインスタンス変数に直接値が割り当てられ、保持カウントが1であることです? またはそれらの間に違いがあります。ありがとう。

もう 1 つ、Apple は init/dealloc でアクセサを使用しないことを推奨しましたが、同時に iVar を直接設定しないように求めました。では、init() で ivar の値を割り当てる最良の方法は何ですか??

4

2 に答える 2

1

ARC と非 ARC

まず、自動参照カウント (ARC) と手動参照カウントのどちらを使用するかを決定する必要があります。後者を選択したようです。後からいつでも ARC に移行できるため、これで問題ありません。

プロパティ属性/setter セマンティクス

プロパティのセッター セマンティクスを としてマークしましaretain。これは機能します。ただし、プロパティはクラス インターフェイスで公開されるため、クラス ユーザーはそれを使用して_aivar を設定できます。クラスのユーザーは、クラスが渡したインスタンスAを直接変更することを期待していない可能性があるため、変更可能なオブジェクト プロパティのセマンティクスを使用することをお勧めします。NSMutableArraycopy

initとのプロパティ アクセスdealloc

initおよびで宣言されたプロパティの使用はdealloc、KVO による副作用が生じる可能性があるため、推奨されません。これらの副作用は、部分的に構築または部分的に分解されたオブジェクトではうまく機能しない場合があります。

あなたの質問

これが私がすることです:

// assumes Xcode 4.4+ for autosynthesize
@interface A:NSObject
@property (nonatomic,copy) NSMutableArray *a;
@end

@implementation A

- (id)init {
    self = [super init];
    if( !self ) return nil;

    _a = [[NSMutableArray alloc] init];

    return self;
}
@end

編集:

または、自動合成が利用できない場合:

@interface A:NSObject
@property (nonatomic,copy) NSMutableArray *a;
@end

@implementation A

@synthesize a = _a;

- (id)init {
    self = [super init];
    if( !self ) return nil;

    _a = [[NSMutableArray alloc] init];

    return self;
}
@end
于 2012-09-19T10:31:46.177 に答える
0

あなたが言及した上記の2つのコードに違いはありません。最新のコンパイラでは、プロパティでインスタンス変数を指定する必要がなくなりました。したがって、上記のコードは次のようになります。

@interface A:NSObject
@property (strong) NSMutableArray *a;
@end

@implementation
-(id)init
{
    if (self = [super init])
    {
       _a = [[NSMutableArray alloc] init];
    }
    return self;
}

@end

この場合、プロパティ「a」には自動合成があり、_a はインスタンス変数です。基本的にプロパティ名の前に付く _ はインスタンス変数名です。

ARC の場合はリリースなし。それ以外の場所にアクセスするには、self.a を使用します。

Apple は、初期化されていないため、初期化子と解放ロックでプロパティを使用しないことをお勧めします。

そして、あなたの質問への答え:「プロパティで使用すると、異なるiVar名の変更はカウントを保持しますか」は、プロパティを使用する場合、これについて心配する必要はないということです。短期間の保持カウントが異なる場合がありますが、それはユーザーやコードにとって重要ではありません。

それが役に立てば幸い。

于 2012-09-19T10:23:41.647 に答える