7

次の例では、発生する可能性のある問題は何ですか。

id c = [Person alloc];
[c init];
4

4 に答える 4

14

この例のコードの主な問題は、場合によっては、-initメソッドが+allocで作成したオブジェクトとは異なるオブジェクトを返すことです。それが起こった場合、[c init]cに結果を割り当てていないため、コードは正しくなく、間違ったオブジェクト(およびその時点で適切に初期化されていないオブジェクト)で作業することになります。これが、標準のイディオムが常に+allocと-initを同じ行で組み合わせる理由です。

id c = [[Person alloc] init];

これで、Personクラスを作成し、-initが常に同じオブジェクトを返すことを直接知っているかもしれませんが、コードを読んでそれが正しいかどうか。あなたのコードは、あなたが通常の慣習に従えば、それが正しいことをしていると誰もが言うことができるという意味で「より良い」です。

cをタイプIDとして宣言するのは恐ろしいことではないと思いますが、この場合はばかげているように見えます。cはPerson*型になることを知っているので、なぜそれをidとして宣言し、コンパイラーがより良いコードを書くのに役立つ有用な情報を捨てるのですか?idを使用する正当な理由がある場合はそれで問題ありませんが、タイプについてより具体的にできる場合は、そうする必要があります。

于 2011-07-16T17:43:06.290 に答える
4

ジェネリック型を使用しているid場合、存在しないメソッドを呼び出そうとしても警告は表示されません。コンパイラーは、ユーザーが何をしているかを知っていることを前提としています。

そうでなければ、私が考えることができる問題はありません。これはいくつかの状況で一般的です(異種コンテナータイプでの高速列挙を考えてください)

于 2011-07-16T17:40:32.963 に答える
2

もう1つの潜在的な危険は、時間の経過とともに、特定の場合にのみ誤って初期化を行うロジックを追加する可能性があることです...割り当てられているが初期化されていないオブジェクトを残すことは、その中のすべての値が本質的にランダムであり、意図されたセットアップコードがまだ完成してない。

于 2011-07-16T17:45:45.663 に答える
-1

まず、型キャストの問題です。''を使用するたびに、つまり、型キャストcする必要がある場合があります。(Person *)

[c aMthod]次に、Personで宣言されたメソッドがある場合、それをスタイルとして呼び出すことはできません。使用する必要があります。[(Person *) c aMethod].

于 2011-07-16T17:32:23.443 に答える