1

これは現在、私が持っているものですinit

- (id)init 
{
    self = [super init];

    if (self) {
        self.url = [[NSURL alloc] init];
        self.blurb = [[NSString alloc] init];
        self.author = [[NSString alloc] init];
    }

    return self;
}

何もしませんがinitWithObject:、引数を使用してインスタンス変数urlblurb、およびを埋める別のメソッドが呼び出されていますauthor。私はこれで何をすべきかわかりませんinit。例外をスローする必要がありますか? 他にどのようなオプションがありますか?

4

5 に答える 5

11

標準メソッドをオーバーライドする場合は、(使用したくない場合) を-init返すか、次のようにします。nil-init

- (instancetype)init
{
    return [self initWithObject:nil];
}

の使用を完全に停止したい場合は-init、使用できない属性としてタグ付けするか、NSAssert を使用できます。

// .h
// ...

- (instancetype)init UNAVAILABLE_ATTRIBUTE;

// ...

// .m
- (instancetype)init
{
    NSAssert(NO, @"This method should not be used");
    return nil;
}

UNAVAILABLE_ATTRIBUTEまたはのいずれかNSAssert()を使用できますが、使用する場合は、 を返すだけであっても、UNAVAILABLE_ATTRIBUTEの何らかの実装が必要です。-initnil

于 2011-10-31T22:00:01.763 に答える
3

私はあなたが読んだものを誤解したと思います。例外をスローすることはないと思います。あなたは出来る; ただし、メモリをリークします。initWithObject:メソッドが次のようになっている場合:

- (id)initWithObject:(id)obj {
     if ((self = [self init])) {
              self.url=[obj url];
              self.blurb=[obj blurb];
              self.author=[obj author];
     }
     return self;
}

そして、あなたは完全に大丈夫でしょう。オブジェクトが-initでインスタンス化され、実際に割り当てられた変数を使用した場合、例外が発生する可能性があります。したがって、以降のメソッドでは、オブジェクトを使用する前に、オブジェクトが存在することを確認してください。

-initWithObjectではなく-initを使用してオブジェクトを作成した場合、これにより例外がスローされる可能性があります。

- (void)dealloc {
         [url release];
         [blurb release];
         [author release];
         [super dealloc];
}
于 2011-10-31T22:00:47.543 に答える
3

単純なものである必要はありません。init単純に独自のinitWithObject:メソッドを使用できます。80% の確率で変わらない基本的なセットアップを行っている場合、またはすべてのイニシャライザに共通のコードがある場合は、 をオーバーライドできますがinit、必須ではありません。

また、initWithObject:名前をより具体的なものに変更することも検討してくださいinitWithPost:(これは、ivar に基づくある種のブログ エントリ フェッチャーであると想定しています)。これにより、必要なオブジェクトがより明確になります。

于 2011-10-31T21:55:58.387 に答える
1

呼び出したくないメソッドや、サブクラスでサポートしたくないメソッドがある場合は、Debug ビルドで例外をスローすることは完全に合理的です。

于 2011-10-31T22:36:43.243 に答える