アプリ版:「スタンプのみでお礼する」機能のリリースについて

Mac OS 10.5を使ってます。

stringWithContentsOfFile:encoding:error: は、どのサイトを読んでも、Mac OS 10.4以降は、使えないようなことを書いてありますが、代わりに推奨されるメソッドはありますか?

ちなみに、cocoaアプリでは動きますが、コマンドラインではこけてしまいます。

コマンドラインは、GUIなしで、main()から呼び出しています。

A 回答 (3件)

>当方で、コードを差し替えてみたのですが、warningがとれず調べてみました。



すみません、私もミスってました。
encodingに定数を渡していたので、名前が似ている「+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error」と取り違えてしまいました。
無駄な調べものをさせてしまいました。お詫びします。


気を取り直して^^;
改めて、ワーニングについて補足させて下さい。
xcode_15 さんもお気づきの通り、NSUTF8StringEncodingは(変数ではなく)定数です。
メソッドが要求しているのはポインタなので、変数のアドレスを渡す必要があります。

従って、以下の様にすれば動作すると思います。
NSStringEncoding encoding; // エンコーディングを返してもらうための変数を定義
lineData_ = [NSString stringWithContentsOfFile:fullPathStr
usedEncoding:&encoding // 変数のアドレスを渡す。変数にはエンコーディングの値が返ってくる
error:&error // こっちは、ポインタ変数のアドレスを渡す。変数にはポインタの値となるアドレスが返ってくる
];

今回もコンパイルチェックしてないので、ミスってるかもしれないですが、その前提でご容赦ください。


蛇足ですが、コードを見ていて気になったところがありました。
>NSArray *lines = [[NSString stringWithContentsOfFile:fullPathStr]
componentsSeparatedByString:@"\n"];
>NSLog(@"lines = %@\n", lines);

%@に対してNSArrayのインスタンスを渡していますが、意図通りですか?(その下のNSEnumeratorも)
    • good
    • 0
この回答へのお礼

ありがとうございました。
やっと、ファイルから文字列を取り出す事が出来ました。

引数に、値を渡してやる物だと思いこんでいたのですが、まさか、戻ってくるとはねぇ。意外でした。

C言語の関数でも、余りやらない手法をやってくれるなんて (*o*)

しかし、こうも似通った名前が並んでいると、チョイスするのに骨折りそうです。

ご指摘のあったNSLogの「%@」は、NSStringのインスタンスを渡さないといけないのですが、間違ってました。
有り難うございます。

お礼日時:2008/01/23 00:02

>lineData_ = [NSString stringWithContentsOfFile:fullPathStr usedEncoding:(NSStringEncoding *)NSUTF8StringEncoding error:(NSError **)error];



この行に問題があります。
error:の引数に渡すのはNSError** 型ですが、xcode_15さんが渡している変数errorは、上の方でNSError *error;と定義されています。
NSError*型の変数なのに、無理矢理NSError**型にキャストして渡しているために、不正メモリアクセスが発生して落ちているのでしょう。

また、その前の引数もキャストされていますが、メソッドが受け付けるのはポインタではないので、このキャストは必要ないです。というか、してはいけないです。
ただし、こちらのキャスト自体は今回の問題の原因にはなっていないと思います。

コンパイルエラーを黙らせるために闇雲にキャストすると、このような問題が発生しやすいです。やむを得ずキャストする場合は、変数の型の意味と、そこに何が入るのかを十分に理解して行う必要があります。
少なくとも今回のプログラムでキャストが必要なところは無いですよ。

エラーチェックはしてないですが、下ので試してみて下さい。
lineData_ = [NSString stringWithContentsOfFile:fullPathStr usedEncoding:NSUTF8StringEncoding error:&error];
    • good
    • 0
この回答へのお礼

重ねてご回答を戴きまして、誠に有り難うございます。

当方で、コードを差し替えてみたのですが、warningがとれず調べてみました。
warning: passing argument 2 of 'stringWithContentsOfFile:usedEncoding:error:' makes pointer from integer without a cast

「NSString Class Reference」より
+ (id)stringWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc error:(NSError **)error

このNSStringEncodingの中身は、eumでした。

結論からすると、当方の力不足で在りますが、コンパイルエラーを黙らせる事が出来ませんでした。
大変申し訳ありませんが、例文を書いて頂けないでしょうか? (-人-)

お礼日時:2008/01/22 00:33

http://developer.apple.com/documentation/Cocoa/R …
これによると、「stringWithContentsOfFile:encoding:error:」は10.4から使えることになっています。逆に10.3以前の環境では使えません。
10.4以降Deprecatedになっているのは、エンコーディング指定の出来ない「stringWithContentsOfFile:」の方ですね。
なので、xcode_15さんの使われているメソッドは、10.4以降を対象にする限りはそのまま使っていて大丈夫です。

>ちなみに、cocoaアプリでは動きますが、コマンドラインではこけてしまいます。

具体的にどのような現象になりますか?
ログやNSErrorの返す内容を出してもらえると何か分かるかもしれません。
また、コマンドラインで不都合が発生する場合、autorelease pool をつくってやるのを忘れている事が多いです。ここも確認してみてください。
    • good
    • 0
この回答へのお礼

ご回答を戴き、有り難うございます。

> 具体的にどのような現象になりますか?
デバッグモードでステップ実行をしていて、「stringWithContentsOfFile:」を実行した直後にアセンブルコードを表示して戻ってきません。

Cocoa初心者ですので、トンチンカンな質問をしているかもしれませんので、コードを書いておきます。

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *csvdata;
intans;

MyFiles *object = [[MyFiles alloc] init];
ans = [object readCsvData:@"~/src/data/test225.csv"];

NSLog(@"csvdata = %@", csvdata);
[object release];
[pool drain];
return 0;
}

@interface MyFiles : NSObject {
NSString*lineData_;
}
-(int)readCsvData:(NSString*)fileName;
@end

@implementation MyFiles
//ファイル名から、ファイルを読み込む
-(int)readCsvData:(NSString*)fileName {

NSError*error;
NSArray*dirArray;

//ディレクトリの中身を調べる
//---------------------------------
dirArray = [[NSFileManager defaultManager] directoryContentsAtPath:fileName];
NSLog([dirArray description]);
//---------------------------------

NSString* fullPathStr = [fileName stringByExpandingTildeInPath];//フルパスを、取得する。

lineData_ = [NSString stringWithContentsOfFile:fullPathStr
usedEncoding:(NSStringEncoding *)NSUTF8StringEncoding
error:(NSError **)error];
NSLog(@"_lineData = %@\n", _lineData);

NSArray *lines = [[NSString stringWithContentsOfFile:fullPathStr]
componentsSeparatedByString:@"\n"];
NSLog(@"lines = %@\n", lines);

NSEnumerator *nse = [lines objectEnumerator];

NSLog(@"nse = %@\n", nse);
return 0;
}
@end

お礼日時:2008/01/20 23:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!