2012-03-17 7 views
28

Xcodeの自動リファクタリングを使用して古いプロジェクトをARCに変換したばかりです。私が読んだことは「強い」はデフォルトの状態であるということですので、これは理にかなってAuto-ARC変換後:保持されているオブジェクトを安全でないプロパティに割り当てる。オブジェクトは割り当て後に解放されます

@property (nonatomic) NSMutableArray *cards; 

@property (nonatomic, retain) NSMutableArray *cards; 

は置き換えられました。ただし、次の行がタイトルに私にエラーを与えている:

self.cards = [[NSMutableArray alloc] initWithCapacity:54]; 

エラーが解決されるのstrongを追加することにより、バックにするために使用保持する該どこに:

@property (nonatomic, strong) NSMutableArray *cards; 

をしかし...私は必要がある場合戻ってstrongをすべての@property宣言に入れてください。それはretainでした...なぜARCリファクタリングはそれらをすべて削除しましたか?

+0

実際には、デフォルトのメモリ管理セマンティクスは 'strong'ではなく' assign'であり、警告メッセージが表示されます。 – jlehr

+5

jlehrはデフォルトのメモリ管理セマンティックについて正しくありません。彼は間違っていない。 LLVM 3.1&ARCの前にデフォルトが割り当てられています。しかし、今日は強いです。これは残念なことに非常によく文書化されていません。 nschumの答えを見てください。 – stigi

+1

デフォルトが強いので、警告は消えていたはずです。それはなぜですか? –

答えて

42

同じ警告が表示され、テクニカルサポートインシデントが開かれました。エンジニアは、がARC内の一貫性の理由から、デフォルトが「割り当て済み」から「強」に変更されたことを確認しました。

彼は、警告と文書の両方が間違っていて、修正されると言いました。それが完了するまで、私は暗黙のデフォルトを完全に避けます!

「強い」(BJホーマーが示唆したように)明示的に警告を消して互換性を持たせる安全な方法です。しかし、デフォルトでプロパティが保持されないと仮定しないでください。そこには常に「弱い」または「割り当て」をしてください。

編集:clang documentationはこの変更を正式に文書化しました。警告はfixedでした。

編集2:Xcode 4.4には明らかに修正が含まれています。

+0

警告が修正されました。この修正プログラムはいつxcodeで表示されますか? –

+1

@nschumこの警告はXcode 4.3.3の最新バージョンでも発生します。どうして? –

+0

残念ながら、リンクされたコミットはLLVMの* trunk *にありました。だから、必ずしもメンテナンスリリースで修正が出るとは思っていません。私はXcode 4.4を試していません。 – nschum

8

nonatomic, retainnonatomicに変換して間違っています。私はいつもそれがnonatomic, strongに変換されるのを見た。あなたがそれを見た方法で変換する単純なプロジェクトを作り出すことができるなら、私はfiling a radarとそれを提案します。

私はあなたが最新のXcodeを使用していることを前提としています。

+0

私は昨日App Storeからダウンロードした4.3.1を使用していますので、最新の方が良いでしょう。 :) –

+2

はい、残念ながら、これは4.3.1の既知のバグです。先日私はそれを自分自身に報告した。最も簡単な回避策は、 'retain(、| \))'のプロジェクト正規表現を 'strong \ 1'で置き換えることです。次に、ARC変換を再度実行します。 –

+1

確実にレーダーをファイルしてから@KennyWyland – mattjgalloway

関連する問題