さくせん:いろいろやろうぜ

いろいろなことをやって、楽しみます。

ACAccountとACAccountStoreの関係

ACAccountStoreのrequestAccessToAccountsWithType:withCompletionHandler:でアクセスを要求後、ACAccountStoreのaccountsWithAccountTypeメソッドでACAccountのArrayを取得。
取得したArrayのItemにアクセスすると落ちた。
[array count]は大丈夫だが、[array objectAtIndex:0]だとダメ。
エラーメッセージはコピー忘れたが、

すでに解放済みのオブジェクトにアクセスしてる

のようなエラー。よくReleaseしすぎなオブジェクトにアクセスすると出るアレです。
ACAccountのオブジェクトなんて一度も触ってないし、releaseも一度もしてないのに!と思い少々悩んだ。

結果、エラーメッセージとドキュメント読んだら理解した。
以下、ドキュメント。

Each ACAccount object belongs to a single ACAccountStore object.

結論は、それぞれのACAccountオブジェクトはACAccountStoreオブジェクトに属していて(belong)、ACAccountStoreオブジェクトがautoreleaseで生成してたので、勝手に解放されていた、というオチ。ドキュメントはしっかり読みましょう・・・。
belongしていると、親がいなくなったら子もいなくなるのね。
AssetLibarayとAssetsもこんな関係だったのを思い出した。メモリ管理は慣れない。