2011年5月6日金曜日

Cocoa FileManager NSURLと日本語

昨夜ビルドしたプロジェクトをなんとなくいじっていて、頻繁にメモリエラーが出る症状を確認。
原因の1つは NSFileManagerのインスタンスを[[NSFileManager alloc]init];から[NSFileManager defaultManager];に変えていたのに、[fileManager release];していたこと。

このあたり、メモリ管理の理解が今イチ弱い。一生懸命
詳解 Objective-C 2.0 改訂版
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 15188
この本を読み込むしかないな。ざっとググって調べたところでは、

Cocoa倶楽部(仮称)
このサイトの「Cocoaのメモリ管理(3)」が参考になった。のちのちの自分のために引用しておく。

基本としてオブジェクトのオーナシップを意識する。すなわち、以下の鉄則を厳守する。

【鉄則1】自分で生成したオブジェクトは、自分で解放する
【鉄則2】他人が生成したオブジェクトは、気に留めない
【鉄則3】他人が生成したオブジェクトが必要なら、必ず保持(retain)して、必要にならなくなった時点で、必ず解除(release or autorelease)する

可能な限り alloc-init系の生成メソッドは使わない。【鉄則2からの派生】
なるほど。自分の作ったクラスでも「コンビニエンスメソッド」をつくりなさい、ということなので心がけるようにしよう。

もうひとつ、特定のディレクトリにアクセスしようとすると確実にアプリが落ちる現象があって、日本語ディレクトリがだめみたい。これも「NSURL 日本語」でググルとある程度の情報が手に入る。UTF8にしないといけない、みたい。ただ、現在のところ、
valid = [fileManager fileExistsAtPath:path isDirectory:&isDir];
    if (valid && isDir) {
        NSURL* url=[[NSURL alloc]initFileURLWithPath:path isDirectory:YES];

とやっておくと日本語でも全然OKであることが判明。むー、理由がよくわからないので明日以降研究しよう。[NSURL alloc]initFileURLWithPath:path isDirectory:YESならOKというのが・・・。

OutlineViewのほうはpath関係は全部NSStringでやっているので、これのNSURLへの書き換えもしたいので、ここはていねいに調べながらやっていきたいところ。いい加減な知識でプログラミングを進めていくと結局痛い目にあうのは自分なので、先をあせらず勉強。(と自分を戒める(^^;))

早いところ「Ese開発開始」といきたいところなんだけど。

0 件のコメント:

コメントを投稿