2

iOS で自動参照カウントを使用してカスタム プロパティを実装しようとしています。

私の.hファイル:

@interface AObject : NSObject
@property(nonatomic,copy) NSString* str;
@end

私の.mファイル:

@implementation AObject

@synthesize str = _str;

-(void)setStr:(NSString *)str {
    if (![_str isEqualToString:str]) {
       // Which one is right?
        _str = [str copy];   //(1)
        _str = str;          //(2)
    }
}

@end

(1) と (2) の 2 行のどちらを使用すればよいですか? 両方をテストしましたが、どちらも機能しているように見えました。違いはありますか?

4

3 に答える 3

3

ARC は自動的に保持のみを行い、コピーは行いません。コピーしたい場合は(1)が正解です。

于 2012-06-14T03:41:03.240 に答える
2

ベネディクトがあなたの質問に対する具体的な答えで言っていることは正しい(+1)ですが、あなたには別の小さな「問題」があります。

if (![_str isEqualToString:str])

やり過ぎです。あなたもするかもしれません

if (_str != str)

strこれははるかに高速な比較であり、がに等しいと比較される可変文字列である場合にのみ、重大なペナルティにつながり_strます。

于 2012-06-21T10:45:47.917 に答える
2

_str = [str copy];正しい。(ARCはオブジェクトを保持することを暗黙的に示しています)のcopy代わりに、がのサブクラスであるためです。これは、それが可能性があり、後でその値を変更する可能性があることを意味しますが、これはおそらくあなたが望むものではありません。が変更不可能である場合、別のコピーを作成せず、保持カウントを増やすだけなので、使用することによるパフォーマンスへの影響はありません。retainNSMutableStringNSStringstrNSMutableStringcopystrNSStringcopy

于 2012-06-21T09:46:41.180 に答える