9

これは多くの質問がありますが、この質問は、これらの各方法をいつ使用するかの例を取得することです。セッターとゲッターの無限ループ以外の例を使用してください

例。

.h-
@property(nonatomic, strong)NSMutableArray* mutArray
.m-
@synthesize mutArray= _mutArray;

1)私は欲しいですか:
_mutArray = [[NSMutableArray alloc] init];
または
self.mutArray=[[NSMutableArray alloc] init];
なぜ私はそれらのそれぞれを行うのですか、そして違いは何ですか?!

2)オブジェクトを追加したい場合...
[_mutArray addObject:object];
または
[self.mutArray addobject:object];

なぜ?!

本当にありがとう!

4

3 に答える 3

13

ivarは、実装の詳細によって絶対に必要な場所(アクセサー自体の内部、または実際にメモリアドレスが必要な場所など)でのみ処理するinit必要deallocがあります。これらの場所以外では、常にアクセサを使用する必要があります。これは、[self foo]ではなくを意味し_fooます。

self.foo実際の呼び出しの周りの単なる構文糖衣です[self foo]self.fooこれは標準のObjCメッセージ送信であり、とまったく同じ意味であることを理解することが重要[self foo]です。慣例により、プロパティを参照する場合はドット構文のみを使用する必要があります。

ARC以前では、ivarを直接使用することが、私の経験でクラッシュの最大の原因でした。ARCを使用せずにivarに直接割り当てるときに失敗する可能性は、プログラムの範囲全体ですぐに100%に近づきます。

ARC以来、私はまだアクセサーを常に使用する必要があると主張していますが(上記の例外を除く)、理由はもっと微妙です。その主な理由は、アクセサーが現在のクラス、サブクラス、またはKVO(コードの外部で完全に発生する)のいずれかでカスタマイズされる可能性があるためです。ivarに直接アクセスする場合は、これをバイパスします。たとえば、プロパティが遅延作成されたとします(これはかなり一般的です)。次に、作成前にivarを使用すると、微妙なバグが発生します。したがって、そのプロパティについては、常にアクセサを使用することを覚えておく必要があります。同様に、通知などを呼び出しsetNeedsDisplayたり投稿したりすることもできます。

「私は常にアクセサーを使用します」という単純なルールがある場合は、コードを見て、それが正しいことを簡単に知ることができます。アクセサーを回避する必要があるいくつかのケースでは、_「ねえ、ここで注意してください、私は何か変なことをしています」と言います。

「アクセサーを必要とするプロパティには使用しますが、必要としないプロパティには使用しない」というルールがある場合、コードを調べてそれが正しいかどうかを知ることはほとんど不可能です。以前の開発者は、ivarが必要だったのか、それとも彼がそれを感じたという理由だけでivarを使用しましたか?変更できますか?知るのはとても難しいです。

したがって、ARC後でも、アクセサを一貫して使用することは優れた防御プログラミングであり、私はそれを強くお勧めします。

于 2013-03-26T18:35:54.233 に答える
0

_mutArrayはiVarであり、self.mutArrayは、プロパティを@synthesizeしたときに作成されるゲッターとセッターを介してプロパティにアクセスします。これらのゲッターとセッターは、カスタムのものに上書きすることができます。あなたの例では、あなたのプロパティはstrongに設定されています。これにより、プロパティに保持が追加されます。したがって、self.mutarray = [[NSMutableArray alloc] init]; このようなことをします(プロパティのセッターを上書きしない限り):

-(void)setMutarray:(NSMutableArray*)_mutArray{
    if(_mutArray != mutArray){
        [mutArray release];
        mutArray = nil;
        mutArray = [_mutArray retain];
    }
}

配列にオブジェクトを追加するには、ゲッターでカスタムを実行している場合を除き、プロパティではなく、iVarにアクセスするだけです。たとえば、ゲッターは次のようになります。

-(NSMutableArray*)mutArray{
    if(!mutArray){
        self.mutArray = [[[NSMutableArray alloc] init] autorelease];
    }
    return mutArray;
}

このようにして、オブジェクトを追加するための実際の配列が常にあることを確認できます。この場合、[self.mutArray addObject:object]を使用します。

したがって、ゲッターまたはセッターで何かカスタムを実行したい場合を除いて、iVarにアクセスしたいだけです。

于 2013-03-26T18:24:24.797 に答える
0

selfkeywordようです。this keywordJAVA

現在のオブジェクトにアクセスし、オブジェクトへのポインタでもあります。

selfこのチュートリアルを読むことについての詳細は

_ObjeNameで呼ばiVarれますObjective c

実装で宣言されたインスタンス変数は暗黙的に非表示になり(事実上プライベート)、可視性を変更することはできません(少なくとも現在のClangでは- @public, @protected and @private)コンパイラエラーは発生しませんが、無視されます。

例えば ​​:

間で異なります

1) NSString *someString = _name;

2) NSString * someString = self.name;

.mファイルにこの行があると仮定します(そして、_nameに直接アクセスするためのオーバーライドされたメソッドはありません)

@synthesize name = _name;

これは、プロパティname(self.name)にアクセスしようとすると、変数_nameを使用することを意味します。この場合self.nameは_nameと同じです


しかし、名前の動的プロパティがある場合は、次のようになります。

-(NSString)name{
    return @"1234";
}

それから違いがあります。self.nameは常に1234を返しますが、_nameをこの値と等しくすることはできません。

例:

_name = @"555";
NSLog(_name);
NSLog(self.name);

結果:

2012-02-09 14:27:49.931 ExampleApp[803:207] 555
2012-02-09 14:27:49.933 ExampleApp[803:207] 1234

上記の例私はこの質問から得ました。

于 2013-03-26T18:42:46.407 に答える