0

IOSセッターの一般的な方法は次のとおりです。

- (void)setMyString:(NSString *)newString {
    if ( newString != myString ) {
        [myString release];
        myString = [newString retain];
    }
}

それどころか、これは良い習慣ではありません

- (void)setMyString:(NSString *)newString {
    if ( myString != nil ) [myString release];
        myString = [newString retain];
    }
}

最初のケースで同等性をチェックする理由は何ですか?秒の場合の問題は何ですか?

4

3 に答える 3

2

[object setMyString:[object myString]];等値をチェックせずにこのようなものを設定すると、クラッシュします! メッセージを送信する前に解放されるため、保持します。(オブジェクト自身の文字列のみの場合)。また、最初の例では、余分な操作を避けるために等価性をチェックしています。

于 2012-09-28T14:26:09.277 に答える
0

私はこれがやや冗長であることを知っていますが...

新しいオブジェクトと古いオブジェクトが同じである場合、古いオブジェクトに送信releaseして割り当てが解除されると、新しいオブジェクトへのポインターは、それが指していたオブジェクトが存在しなくなるため、ダングリング ポインターになります (同じオブジェクトを指しているため)。古いオブジェクト ポインタとして)。元。myString保持カウントが 1 の同じインスタンスを指している場合newString、1 を引くとゼロになります。割り当てが解除されるため、今追加するには遅すぎます。ただし、 and の呼び出しを逆にするretainrelease、問題ないはずです。保持カウントが 1 の場合、1 を追加すると、2 になり、リリースを安全に送信できます。一般に、オブジェクトの所有権を放棄する前に、まず新しいオブジェクトの所有権を主張します。

また、セッターの最初のタイプは、retain/strongスタイル セッターに使用するものです。assign所有権が主張されていないため、保持/解放する必要がない場合。多くの場合、NSStrings にはcopy、引数をコピーしてそれを使用するスタイル セッターがあり、保持する代わりにコピーを作成します。copy誰かが NSMutableString を渡して後ろでそれを変更したくないので、私は通常、変更可能なサブクラスを持つものに使用します。このページではアクセサーについて説明します。古い値を解放する前に新しい値を保持していることに気づき、その理由を説明します。

于 2012-09-28T17:34:51.027 に答える
0

これをメモリ管理 ( https://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/ ) に持っていくことができます。

于 2012-09-28T14:50:02.733 に答える