web-dev-qa-db-ja.com

自動ARC変換後:保持されたオブジェクトを安全でないプロパティに割り当てます。オブジェクトは割り当て後に解放されます

Xcodeの自動リファクタリングを使用して、古いプロジェクトをARCに変換しました。

@property (nonatomic, retain) NSMutableArray *cards;

に置き換えられました:

@property (nonatomic) NSMutableArray *cards;

私が読んだことは、「強い」がデフォルトの状態であるということなので、これは理にかなっています。ただし、次の行ではタイトルにエラーが発生しています。

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

このエラーは、以前の保持があった場所にstrongを追加することで解決します。

@property (nonatomic, strong) NSMutableArray *cards;

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

29
Kenny Wyland

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

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

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

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

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

44
nschum

nonatomic, retainnonatomicに変換したのは間違っているようです。私はそれがnonatomic, strongに変換されるのを見てきました。あなたがそれを見る方法で変換する単純なプロジェクトを作ることができるなら、私はそれを使って レーダーをファイリングする を提案します。

ちなみに、最新のXcodeを使用していると思います。

8
mattjgalloway