注: これは、長い間修正されてきた一部の XCode ベータ バージョンのバグによるものです。ARC に問題がある場合、この質問と回答は役に立たないでしょう。
プロジェクトを手動参照カウントから ARC に移行していますが、問題に遭遇しました:保持プロパティのカスタム セッターが実際に保持されていることを確認するにはどうすればよいですか?
ではmyClass.h
、プロパティを宣言しました: @property (retain) NSDate *date
。__strong
ivarを手動で設定するか、自動生成するかは問題ではありません。
実装では、もちろん@synthesize date
、カスタム セッターを実装しました (またはデモ Xcode プロジェクトをダウンロードするだけです)。
- (void)setDate:(NSDate *)newDate
{
if (allowedToSetNewDate)
{
date = newDate;
}
}
これは日付を保持していないようで、後でmessage sent to deallocated instance
アクセスしようとしたときに、newName が元の場所で (自動) 解放されたときに私に知らせますmyClass.date
(Zombie が有効になっている場合、それ以外の場合は静かにクラッシュします)。
セッターを使用するように変更するとdate = [newDate copy]
、エラーを回避できますが、実際には必要ありません。カスタム セッターの削除も機能しますが、明らかに望ましくありません。
ここで何が欠けていますか?保持プロパティのカスタム セッターが実際に ARC 環境で保持されるようにするにはどうすればよいですか? これは非常に基本的で一般的なタスクのように思われるため、非常に明白なことを見落としていると思います。
(注: ARC は LLVM の一部として公開されているため、これは Apple NDA の条件には該当しません)
編集:問題をデモする小さな Xcode プロジェクトを作成し、github にアップロードしました。気軽にダウンロードして遊んでみてください。私は機知に富んでいます (確かに、今日の機知は最高ではありませんが)。
編集: このサンプル プロジェクトでは、この問題は解決されています (受け入れられた回答を参照)。残念ながら、私が共有する自由がないより大きなプロジェクトでは、問題は解決しません。回避策として、合成されたセッターを使用して重複したstrong
プロパティを追加しました (ivar は機能しません)。新しいカスタム セッターは次のようになります。
- (void)setDate:(NSDate *)newDate
{
if (allowedToSetNewDate)
{
self.date_arcretain = newDate; //this property is only there as a workaround. ARC properly retains it, but only if the setter is synthesized
date = newDate;
}
}