2

誰かが、initメソッドまたは指定された初期化子で@property iVarsを使用する際のベストプラクティス/コード規約に関する知識を共有できますか?

私の例を見てください:

@interface MyClass ()
@property(nonatomic,strong) nsstring *tempString;
@property(nonatomic,strong) NSMutableArray *arrItems;
@end

@implementation ViewController

- (id)init
{
    if (self = [super init]) {

        //Is this best practice / correct
        _tempString = @"";
        _arrItems = [[NSMutableArray alloc] initWithCapacity:0];
        ...
        ...

        //Or this
        self.tempString = @"";
        self.arrItems = [[NSMutableArray alloc] initWithCapacity:0];
    }
    return self;
}

@end

どちらか一方を使用する必要がある理由について何かアドバイスはありますか?

ありがとう...

4

5 に答える 5

2

このスレッドを読んでください:init/deallocでObjectiveC2.0アクセサーを使用すべきではないのはなぜですか?

言い換えると、KVOを使用する予定がない場合は、2番目のアプローチを使用できます。

//Or this
        self.tempString = @"";
        self.arrItems = [[NSMutableArray alloc] initWithCapacity:0];

ただし、alloc-initで十分に注意してください。自動リリースを忘れないでください。

于 2012-10-05T19:55:29.243 に答える
2

このトピックに関するAppleのガイダンスは、適切な名前のセクション「Initializerメソッドとdeallocでアクセサメソッドを使用しない」に含まれています。

于 2012-10-05T20:09:43.193 に答える
0

ジェレミーが言及した理由の一部(ほとんど?)で、プロパティ表記を定義するときは通常、プロパティ表記を使用する方が適切です。

メソッドセッターのオーバーライドでブレークポイントを設定し、それを変数を変更するすべてのコードパスに適用できると、特定の変数のデバッグがはるかに簡単になります。

もう1つの理由は、一貫したメモリ管理モデルを維持することですが、ARCを使用しているため、それほど重要ではありません。ただし、そうではなく、strongが保持されている場合は、プロパティに設定しているオブジェクトが、プロパティを設定するすべての場所で自動解放されることを確認します。直接設定している場合は、現在の値の解放に対処する必要はありません。変数。

一貫性は、どのような方法を使用する場合でも、保守/可読性とデバッグにとって重要です。

于 2012-10-05T19:55:47.550 に答える
0

プロパティにはレイジーインスタンス化方式が好きです。

ゲッターをオーバーライドして、プロパティを遅延インスタンス化でき@synthesizeます

例えば:

-(NSString *)tempString {

    if(!tempString) {
        _tempString = @"";
    }
    return _tempString;
}

-(NSMutableArray *)arrItems {

    if(!_arrItems) {
        _arrItems = [[NSMutableArray alloc] initWithCapacity:0];
    }
    return _arrItems;
}

メソッドにプロパティを設定する場合はinit、ドット表記self.myPropertyを使用して、プライベートクラスメソッドではなく、プロパティに定義されたセッターを直接使用するようにします。

于 2012-10-05T20:02:34.267 に答える
0

Appleによれば、次の方法でアクセサを使用しないでください。init...dealloc

プロパティが設定された時点では、オブジェクトの残りの部分がまだ完全に初期化されていない可能性があるため、初期化メソッド内から常にインスタンス変数に直接アクセスする必要があります。カスタムアクセサメソッドを提供しない場合や、独自のクラス内からの副作用を知らない場合でも、将来のサブクラスが動作をオーバーライドする可能性があります。

このドキュメントからの抜粋:データのカプセル化

于 2012-10-05T20:04:05.667 に答える