リファレンスカウンタが予想と違う挙動をするのですが、なにか? Reloaded

以前リファレンスカウンタが予想と違う挙動をするのですが、なにか?といっていた件ですが、どうやら「retainCountの値はあくまで目安」ということっぽいです。
以下、少々長いですが2chからの引用です。同じ悩みの方が質問されていました。

300 :名称未設定 :2010/07/21(水) 05:21:12 id:zFNDBeCY0 (1 回発言)

すみません、どうにもわからないのでお伺いしたいのですが、

以下のような処理をしてみました。

-(void)buttonDidPush{
    NSLog(@"4 titlePicView= %d", [titlePicView retainCount]); >>> 出力 2
    [titlePicView removeFromSuperview];
    NSLog(@"5 titlePicView= %d", [titlePicView retainCount]); >>> 出力 1
    [titlePicView release];
    NSLog(@"6 titlePicView= %d", [titlePicView retainCount]); >>> 出力 1
}

[titlePicView release]の時点で、titlePicViewのretainCountは0になり、メモリが解放されると思うのですが、

最後の行でretainCountが表示1として表示されてしまいます。(本当はクラッシュしなければならないと思うのですが)


これは何故なんでしょうか?

おわかりになる方いらっしゃいますか?




301 :名称未設定 :2010/07/21(水) 06:00:54 id:bGBnRBwPP (1 回発言)


>>300
retainCountを数えるなってことだよ



302 :名称未設定 :2010/07/21(水) 06:01:33 ID:0eSUBa8H0 (2 回発言)


>>300
存在しないオブジェクトにアクセスしてもクラッシュするとは限らない。


C言語から来た人なら分かると思うけど、JAVAPHPの人には分かんないよなあ・・






305 :300 :2010/07/21(水) 08:38:16 id:Z7Vnn1iO0 (2 回発言)


>>301, 302

ありがとうございます。


retainCountを数えると、retainしちゃうってことですか?

[titlePicView release] で リファレンスカウンタが0になって

最後のretainCountでまたretainされたということでしょうか?


>存在しないオブジェクトにアクセスしてもクラッシュするとは限らない。


クラッシュしないにしても、0か-1が返されるかと思ったのですが…




306 :名称未設定 :2010/07/21(水) 09:12:48 id:xWcmBjM30 (5 回発言)


>>300
[titlePicView release]でdeallocされ、メモリが解放される。

ここで注意。メモリは解放されてるけどクリアされてるとは限らない。で、titlePicViewはそこを示している。

retaincountは最後1だったけど、そこでreleaseするとおそらく0にされる前にdeallocが呼ばれる。


こんなもんでいい?




322 :300 :2010/07/21(水) 15:57:27 id:Z7Vnn1iO0 (2 回発言)


>>306

ありがとうございます。


>retaincountは最後1だったけど、そこでreleaseするとおそらく0にされる前にdeallocが呼ばれる。


retainCountが0にされる前にdeallocが呼ばれた場合、

retainCountは1でも、メモリはreleaseでdeallocが呼ばれた時点で解放されていて

メモリ管理上は問題ないと考えてよろしいでしょうか?



323 :名称未設定 :2010/07/21(水) 16:27:24 id:jLqdgbnH0 (1 回発言)


retainCountなんて目安でしかない

retain と releaseのバランスさえ取れていれば何も問題ない



324 :名称未設定 :2010/07/21(水) 17:23:46 id:xWcmBjM30 (5 回発言)


>retainCountは1でも、メモリはreleaseでdeallocが呼ばれた時点で解放されていて

正確にはdeallocが呼ばれた後、かな。





339 :300 :2010/07/22(木) 08:27:38 ID:+1UZR9Tw0 (1 回発言)


>>323,324


ありがとうございます。


いままで本のチュートリアルやってきて、初めて1から自分でアプリつくってるんですけど、

iPadのフル画面の画像のPageControlしてて、アプリが落ちまくって、

初めてメモリ管理の問題に直面しました。


retainConut表示しながらソースをみなおして、落ちる原因を排除して、

なんとなくですが、メモリ管理のことがわかってきたんですが、

今回のような状態になったので、どういうことなのかと分からなくなったのです。


301:retainCountを数えるなってことだよ


これは、過信するなってことなんですね。


まだ初心者なので、逐次retainCountみないとバグてんこもりになってしまうので、

うまくやっていきます。


みなさん、ありがとうございました。



340 :名称未設定 :2010/07/22(木) 09:30:16 id:EjfTMiqx0 (4 回発言)


>>332
両方が載っているViewに対してアニメーション指定じゃだめ?

>>334
IBのFiles ownerの横に「NSObject」とか表示されてない?

>>336
CAAnimationのほうじゃなくってCATransitionのほうに押し出す、ってなかったっけ?kCATransitionPushがそれか。

>>339
実行→パフォーマンスツールを使って実行→Leaks/Allocations、というのも一度つかってみてね。

http://logsoku.com/thread/hibari.2ch.net/mac/1278433229/#300


「存在しないオブジェクトにアクセスしてもクラッシュするとは限らない。」というのは想像を絶しますね。事実クラッシュしないんだもの…。どういう原理なんでしょ?