ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

iPhone/iPod touch/iPad:開発者コミュの教えてください

  • mixiチェック
  • このエントリーをはてなブックマークに追加
iPhoneアプリ開発に関して質問があります。

画像をフリックでペラペラめくるアプリを作っているのですが
「データフォーマッタが一時的に使用できなくなっています。
”続ける”の後で再施行します。
(Unknown error loading shared library "/Developer/usr/lib/libXcodeDebuggerSupport.dylib")」
というエラーが起こりアプリが落ちてしまいます。

調べたのですが、何が問題なのか分からない状況です。

iPadやiPhone4では問題なく動いているのですが。。。
現象が起こるのはiPod toucheやiPhone3G(iOS3.1.3)です

ご存知のかたは、
私にメッセ・もしくは下記コメント欄に記述してもらえればと思います。


宜しくお願いします(>_<)

コメント(19)

メモリ不足とか原因は色々考えられますが、
何れにしろプログラムに問題があるときに出るエラーですね。
回答ありがとうございます。

毎回落ちるタイミングが異なるのですが
追いかける方法はありますでしょうか?

UIImageViewに毎回画像をセットして、アニメーション(めくれる)しているだけなのですが。。。
UIImageは一度ロードするとキャッシュなどするのでしょうか?

何度も質問ごめんなさい!
宜しくお願いします><
UIImageはreleaseしてもメモリ解放されずに残っている場合があるそうですね。
つまり自前でメモリ解放させる必要がありそうです。

http://d.hatena.ne.jp/aiam/20091217/1261021575

に解放に関する記事が載っていますね。
上記サイトを参考に修正したところ、
問題は解決されました。

ありがとうございます!!!!
> 5 らばびー@さん

解決されてなにより。
これだけではURL読まないとわからないので、URL内容について私が理解した内容を簡潔に書いておきます。

UIImage *image;
と宣言して、imageに画像を放り込んで、
[image release];
でメモリを解放したと思っていたら、実は解放されていないことがある
そのため、画像をいろいろ表示するプログラムなどの場合、メモリリークが怒る可能性があるということでしょうね。

おそらく、iPhone4やiPadはメモリもiPhone 3GS以下やiPod Touchよりも大きいので問題が顕在化しなかったのかなと思います。

この解決方法で簡単なのが、

image = nil;
とnil(何も無いものを入れる)を入れる、つまりimageを空にした上で
[image release];
と解放してやると、メモリが本当に解放されるようだということです。
もしreleaseしてリファレンスカウンタが0になって、deallocが呼ばれたらメモリ解放されるんじゃないかなとは思います。
その段階でimageView = nil; は必要あるのかなぁとか思ったりします。
むしろ、releaseしてもどこかでretainしていてdeallocが呼ばれない状態の場合を考えて、nilしてとりあえずデータなしをいれとくことでメモリ使用量を0にするって考えたほうがいいんですかねぇ。
いま、retain/releaseあたりの勉強をしてて、ふとそうおもったんです。
横から失礼します。
オブジェクトをプロパティとしてretainで宣言していると、オブジェクトにnilを代入した段階で、一度releaseが実行されます。
詳しくはこちらのブログをご参照ください。

http://iphone-dev.g.hatena.ne.jp/tokorom/20100315/1268677134

オブジェクトにnilを代入しておくと、解放後、メッセージを送ってもランタイムがメソッド呼び出しを行わない為、実行時エラーにならないという利点もあります。

開放されているかどうか、ですが、[imageView release];の後に、imageView.retainCountの値をNSLogなどで表示させるようにして、デバッガでそこにブレークポイントをしかけ、その行を実行させたら、実行時エラーが出れば開放されています。(存在しないオブジェクトにメッセージを送った為)
正常に動作して、retainCountの値が1以上なら、どこかでretainされている事になりそうです。

もし配列オブジェクトや辞書オブジェクトを使っていたら、そのあたりが怪しいかも知れません。
ブログ読ませて頂きました。
これによると、[imageView release]; は必要なく、
imageView = nil;
だけでよい

と読み取れると思います。
同時に「8: あらあむ or がいち」さんがおっしゃられる
[imageView release];
imageView = nil;
という順序については、releaseを試みるが、しかし
release仕切れていない場合があるので、nilを代入して
それを確実にさせる。
ということであり、その逆の記述だとreleaseを書く意味が
薄れるということでしょうか。
逆の記述の場合ですが、プロパティがretainになっていれば、nil代入だけでよいと思います。
もし、assignでしたら、releaseして、nil代入は意味があると思います。
あるいは、クラス内でしかアクセスしないプロパティにしていないオブジェクトの場合も意味があると思います。

releaseの動作、retainCount、オーナーシップの概念については、詳説ObjectiveC2.0に詳しく説明がありますので、そちらをご参照いただくと良いかと思います。

簡単に説明すると、releaseは、retainCountを-1し、もし、retainCountが0になったら、deallocを実行する、というもの。
自分が参照するオブジェクトが他から勝手にdeallocされると困るので、そうされたくないオブジェクトをretainする。retainは、retainCountを+1する動作。
retainCountが1以上と言う事は、どこからか必要とされている。
そのためreleaseを実行しても、retainCountを-1するだけで、0でなければ、deallocは実行しない。

もし、objectA,B,Cがimageをretainしていたら、retainCountは3になり、
[image release]; // ここで3-1→2
image=nil;  // ここで2-1→1
では、retainCountは1となるため、deallocされない事になります。

オーナーシップの概念は、retainしたオブジェクトは、retainメッセージを送ったオブジェクト自身が責任をもって、releaseするべきだ、というようなものです。

(私の覚え間違いでしたらすみません)
あらあむ or がいち さん
補足ありがとうございます。
self.imageView = nil;
そうですね。self.がないと、セッタメソッドが実行されない為、releaseされません。
その点、説明が抜けていました。
はい、その本を読んで勉強中です。
といっても一度では理解できませんから、その都度読み直していて
やっとretain/releaseを理解しようかという段階に差し掛かったかなという感じです。
assignやプロパティについてはまだちゃんと分かってないと思うので、さらに理解を深めたいと思います。
nilについて少し勘違い(読んだが頭から抜けてた)してました。
nilって空ポインタなんですね。つまり代入するとポインタ参照が消えてしまうということになる。
リファレンスカウンタが0でないのにポインタ参照消えちゃったら、アクセスできなくなるから、先にreleaseしとかないといけないよってことですよね。

もちろんretainしたものは自分でreleaseして管理するとして、assignのものなら

[imageView release];
if(imageView != nil){
imageView = nil;
}
だけれども、この場合 imageView自体がnilだったら無視されるだけなので

[imageView release];
imageView = nil;

と省略してかける。
そして、@synthesizeを使っていたら
self.imageView = nil;
とすることで、setterを呼び出して参照を消し、メモリ解放させるということですよね。
kimipooh さん

その理解で問題ないと思います。

「詳説ObjectiveC2.0」をお読まれているという事ですので、
05-03 インスタンスの自動解放
05-04 オーナーシップ・ポリシー
08-04 配列クラス ← これの「配列オブジェクトとオーナーシップ」が腑に落ちると、
いろいろ応用がしやすくなります。
>17:
なんとか理解できてよかったです。
そういえば新型iPod Touchが発表されたので、iPod Touch初代をもっている(iOS4に出来ない)私としては、そろそろ買い時か!?と思ってます。

実はNSDictionaryを知らないころに、
NSMutableArray *array = [NSMutableArray array];
を多用していたので、release問題は発生しなかったのでした(コンビニエンスコンストラクタってのを使ってたんですね)。

http://iphone-dev.g.hatena.ne.jp/tokorom/?word=pdf&.submit=%E6%A4%9C%E7%B4%A2

の「iPhoneプログラミング Objective-C 2.0 コーディング解説編」も分かりやすいなと思いました(まだ全部読んでませんが)。
>18:
autoReleaseとコンビニコンストラクタ(一時的オブジェクト)を良く理解しない時の事です。

配列クラスを一時的オブジェクトと知らず作ってしまい、それをretainしないで使っていて、突然、実行時エラーが出て、焦りました。

autoReleaseが実行されて、存在しなくなったオブジェクトにメッセージを送ったのが直接の原因ですが、一時的オブジェクトと普通のオブジェクトの違いを理解していなかったのが、大本でした。

「詳説ObjectiveC2.0」を読み直して、原因が理解できました。

ログインすると、残り4件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

iPhone/iPod touch/iPad:開発者 更新情報

iPhone/iPod touch/iPad:開発者のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。