4

Java のバックグラウンドを持つ私は、Objective-C で防御的にプログラミングする方法を理解するのに苦労しています。SomeClassが変更可能でコピーメソッドを提供する
と仮定すると、これは Java で書く典型的なコードです。

public MyClass  
{ 
    private SomeClass customerList;
    ...
    public SomeClass getCustomerList() {
        return this.customerList.copy(); 
    }
    public void setCustomerList(SomeClass list) {
        this.customerList = list.copy();
    }
}

私はそれを理解するのに少し時間がかかりました

@property (nonatomic, copy) SomeClass *customerList;  

customerList プロパティに割り当てる前に、setter の引数のコピーを作成します。私を混乱させるのは、適切なゲッターを書くことです。これまでのところ、次のようになります。

(SomeClass *)customerList {  
    if(!_customerList) {  
        _customerList = [[SomeClass alloc] init];
    }
    return _customerList;
}  

これは、self.customerList = ... のようなすべての内部メソッド呼び出しで機能しますが、セキュリティ違反を引き起こす外部呼び出しへの直接ポインターを渡します。コピーを返す別の public getter を提供することを検討していましたが、型にはまらない名前が必要になるため、これは避けたいと考えています。この状況をどのように対処しますか?
ありがとうございました。

4

2 に答える 2

3

-customerList実装を次のようにオーバーライドできますreturn [_customerList copy];。通常、他の人がアクセサーの動作を期待する方法ではないことに注意してください。そのため、必ず文書化してください。

于 2013-01-05T18:55:01.617 に答える
0

プロパティとそのゲッターに基づくコピーを返したい場合は、次のフォームを使用するのは非常に簡単です。

@interface MyClass : NSObject
- (SomeClass *)copyCustomerList;
@end

@interface MyClass ()
@property (nonatomic, copy) SomeClass * customerList; // hide what you can
@end

@implementation MyClass
- (SomeClass *)copyCustomerList { return self.customerList.copy; }
@end

代わりに独自のゲッターを実装することもできますが、カールが言及しているように、それは ObjC では型破りです。

別の方法として、実際のプロパティに別の名前を使用することもできます。

@interface MyClass : NSObject
- (SomeClass *)customerList;
@end

@interface MyClass ()
@property (nonatomic, copy) SomeClass * privCustomerList;
@end

@implementation MyClass

- (SomeClass *)customerList
{
 // -autorelease if MRC
 return self.privCustomerList.copy;
}

@end
于 2013-07-10T05:02:58.770 に答える