6

init次のようにメソッドをラップすることは、Objective-C/Cocoa で許容可能/安全ですか?

-(id)init {
    if ((self=[super init])) {
         self.bar = [[Bar alloc] init];
    }
    return self;
}

-(id)initWithFoo:(Foo *)f {
    if ((self=[self init])) {
         self.foo = f;
    }
    return self;
}

に注意し[self init]てくださいinitWithFoo

おそらく、これは単純な「はい」の答えです...当たり前のように見えますが、標準ではありませんか?

4

2 に答える 2

8

それは確かに受け入れられ、安全です。それが標準的な慣行かどうかは定かではありませんが、悪い慣習ではないと思います。

注:これはオーバーロードではありません。オーバーロードとは、C に似た言語 (特に C++) で、同じ名前の複数の関数があり、それらの数やパラメーターの型によってのみ区別される、非常に特殊なことを指します。これを表すより適切な用語は、おそらくforwardingWrappingのようなものでしょう。

于 2012-11-15T19:06:23.480 に答える
2

私はパーティーに遅れていることを知っていますが、私は2セントを追加すると思っていました.

init (間違いなく行う) と initWithBlah の両方を提供する場合は、次のようなことを行うのが最善です...

- (id)initWithValue:(int)value
{
    self = [super init];
    if (self) {
        self.value = value;
    }
    return self;
}

- (id)init
{
    int defaultValue = 10;

    return [self initWithValue:defaultValue];
}
于 2013-05-12T11:45:07.930 に答える