2012-01-20 5 views
0

私のクラスの1つに私は-(id) initメソッドを持っています。その方法で最初に起こるのは、[super init]スーパーinitは動作しなくなった

への呼び出しです。これはすべて問題ありませんでしたが、最近私のコードは新しいxcodeプロジェクトにインポートされました。私は、この行のエラーを取得:

エラー:自動参照カウントの問題:デリゲートのinitの呼び出しの結果はすぐに「自己」に返却または割り当てる必要があります

なぜこのエラーが発生していますか?これはARCシステムの下で償却されるからですか?または、他の何か?

+2

エラーメッセージをお読みください。既に何が間違っていて、どのように修正するかを明確にしています。 – fzwo

+0

@fzwo私の質問はなぜ以前に働いたのかということでした。 – SirYakalot

+0

あなたが頼むのは残念ですが、それはあなたが尋ねたものではありません。あなたはなぜそれが今起きたのか尋ねました(エラーメッセージによって答えられました)。 (また、ビーンカウンターのように出かけて申し訳ありませんが、私は、可能な限り明確にフレーズの質問を試みることが重要であり、丁寧ですと思います。あなたの質問に「私は間違いを見て、すでにそれを修正しましたが、なぜそれが以前に働いたのか不思議です」 – fzwo

答えて

3

古いシステムではどうでしたか? LLVMはGCCが以前よりもはるかに厳しいですので、あなたは

self = [super init]; 

if (self) ... 

return self; 
+0

古い方法はあなたの方法だったが、 '自己='なし。これはまったく何のことなのですか。 – SirYakalot

+0

'self'は' init'で構築されているオブジェクトへのポインタです。 '[super init]'はスーパークラスのコンストラクタを呼び出し、 'self = [super init]'は変数selfにそれを指すように割り当てます。 '' self''を指さずに '[super init]'を書くだけであれば、チェーンのどこかであなたはおそらく 'self = [super init]'を持っているかもしれません。私は彼らがARCでこの動作を非難したと思います。 – vakio

+0

@vakio: "チェーンのどこかであなたはおそらくself = [super init]を持っているから"これは間違った答えです。 'self'はローカル変数であり、別のメソッドのローカル変数への代入は効果がありません。 'self = [super init];が必要な理由は、' init'が呼び出されたものとは異なるオブジェクト( 'nil')を返す可能性があるためです。 'init'が呼び出されたオブジェクトを常に返すと、' [super init];だけで十分です。それがまだ動作する理由は、 'init'メソッドの99%が呼び出されたオブジェクトを返すだけなのです。 – newacct

1

それはあなたのために前に働い行うために(両方のバージョンに)期待しています。 GCCはエラーを検出しなかったので、彼のコメントで@vachioが指摘したように、チェーン内のどこかにあるself = [super init]が存在していたために機能しました。 LLVMはコンパイル時にこのエラーを検出し、誤ったコードをコンパイルできないようにします。

0

これは私にはうまくいった:

は自己に何かを割り当てる必要がある。

-(id) init { 
    self = [super init]; 
    return self; 
} 
関連する問題