>>929 えーと、Project BuilderがObj-Cに対応したコンパイルを
行なってくれるかどうかは、ソースファイルの拡張子で決まっていたはず。
問題のソースファイルの拡張子が".c"になってませんか?
".m"またはC++を併用するなら".mm"に変更してください。
>>929 ライブラリって本来Carbonオンリーぽいのだが、、
何のソフトのプラグインなのか示せば話がはやいかも
932 :
915:03/09/01 23:41 ID:mhCs1yO1
>>ライブラリって本来Carbonオンリーぽいのだが、、
僕もそんな気がします。
ソフトは・・秘密にしておきますw
すいません。
>>930 mmにしてます。
エラーが出るのは上記問題のような気がします。
しかし、OSXのプログラミングはおもしろいですね〜
933 :
915:03/09/02 01:15 ID:kZybqWeV
みなさんどうもです。
結果報告。
コンパイルに成功し、読み込みもうまく行きました。
windowの表示はできませんでしたが・・w
(表示しようとはしているようです。読み込み時HOSTが重くなりました。)
どうもwindow描画のメソッドがおかしいようなので
荻原本見て勉強します。
あと一歩〜
>>907 どーしても分からんかったら自前でピクセル触ったら?
そっちのほうが早そう
935 :
名称未設定:03/09/04 16:24 ID:D/ixHjRk
スレッドセーフなキューを作ってるんですが、排他制御の方法で困ってます。
キューは
enum {
queueIsEmpty,
queueHasSpace,
queueIsFull,
};
という3つの状態を持ってます。
状態が2つなら、NSConditionLockを使えば簡単に排他制御が出来るのですが、
3つの状態を持つ場合にどうやれば排他制御が出来るのかが分かりません。
キューの容量を変化可能にすればqueueIsFull状態を無くすことは出来ますが、
動作が重くなってしまうので出来るだけ避けたいです。
よろしくお願いします。
937 :
935:03/09/04 20:04 ID:U2TVQR+M
>936
ありがとうございます。ちょっと考えてみます。
>935 ちょっと条件が足りなかったので付け加えます。
Queue* queue;
id data = [queue dequeue]; // queueIsEmptyならデータが入るまでwaitをかける。
と、
[queue enqueue:data]; // queueIsFullなら空きができるまでwaitをかける。
です。
よろしくお願いします。
938 :
935:03/09/05 00:11 ID:d4S07o8T
>936
考えてみましたが、デッドロックが発生しない方法を思い付けませんでした。(泣
とりあえず、queueIsFull状態をなくして、キューがいっぱいのときは例外を投げてごまかすことにします。
このすれは毎日チェックしてますのでどなたか良い方法があれば教えて下さい。
個人的には、というか普通の人にとっては
「なんとかピーク版とかいうのはいいから、リリース版を出してほしいなぁ」
というのが、今望んでいることだったりする。
でもまだ開発調整中だったらごめんなさい。
開発版をsourceforgeではなく2chで議論することに疑問を感じるところではあるけど…
Cocomonarスレと間違えた。
t
IBでカーボンアプリも作成できる様ですが
それはクラシック環境でも動くのでしょうか?
よろしくお願いします。
追伸:
ココアでクラシックで動くアプリがいちから作れるか、ということです。
944 :
935:03/09/05 12:38 ID:BOUxdYER
>943
残念ながらCocoaはクラシック環境では動きません。
Carbonで作成したとしてもProject BuilderがCFMバイナリを生成できませんので、
やはりクラシック環境での動作は出来ません。
古いCodeWarrior等を使ってCFMバイナリを作れば
Nib+Carbonでかつクラシック環境で動作するアプリケーションが作成可能です。
(最新のCodeWarrioirはMach-Oバイナリしか生成できません)
>>944 丁寧なレスありがとうございます。
クラシック用アプリの開発環境は現行ではREALBasicぐらいということでしょうか。
947 :
び:03/09/06 02:31 ID:AT0Bahd7
ながーい計算を途中中断するのに、データを一時保存したいのだが
アプリケーション独自形式のデータをファイルに書き出す方法を
だれか教えて。
入門書だと、ドキュメントベースにしてテキストを出し入れする
例題ばっかで、document.nibが無い例が無い。
ググッてみても、さっぱりわからん。
デバッグのことを考えて、テキストコメントとデータで
セーブデータを作るつもりなんだけど
変にCocoaにコダワリすぎ?
NSDataにしてwriteToFile
949 :
び:03/09/06 03:48 ID:AT0Bahd7
NSArchiverでNSDataを生成すると書いてあるのを見たけどちんぷんかんぷん
たった今までNSDataはNSDocumentの継承だと勘違いしていた、、、
調べなおしてみます。
Cocoaはやっぱりワカンネー
951 :
944:03/09/06 09:20 ID:2vqBcRYB
cocoaで画像の変形をしたいのですが。良いサンプルコードは無いでしょうか。
サンプルコードさえあれば後は自学自習しますんで
画像の変形って?
フーリエ変換とかでいいの?
954 :
952:03/09/08 02:41 ID:oYdQ9pyG
追記
アフィン変換で、例えば台形をした画像を、正方形に変形する事はできるのでしょうか?
955 :
952:03/09/08 02:50 ID:oYdQ9pyG
>>953 フーリエ変換でということは、画像の周波数成分から特定の値をとるとか
フォトショップのフィルタみたいなってことですかね?
フォトショップの編集メニューにある自由変形みたいなことがしたいのです。
957 :
952:03/09/08 03:32 ID:oYdQ9pyG
>>956 ありがとうございます
ソース見てみます。
958 :
び:03/09/09 00:58 ID:+nwA3XPk
>948,950
Thanxすこしだけ進んだけど、やっぱり詰まってしまった。
たとえば、任意バイナリを読むときに
1:unsigned char Buffer[1024];
2:NSData* Data1 = [[[NSData alloc] autorelease] initWithContentsOfFile: [ openPanel filename ] ];
3:[Data1 getBytes:Buffer length:1024];
とか、いきなり読み込んで、
データをゴニョゴニョしてから書き戻そうとしてるんだけど。
4:NSData *Data2=[NSData alloc];
5:[Data2 initWithBytes:Buffer length:1024];
6:[Data2 writeToFile:[ @"~/xxx" stringByExpandingTildeInPath] atomically:YES]
で、書き込みがうまく行かない
6のところでBAD_ACCESSになってしまう???
あと、3の所でファイルサイズの分だけコピーするにはどうしたらよいのでしょ?
>>958 5でinit...の返り値を受け取ってないよ(NSDataはクラスクラスタ)。
>あと、3の所でファイルサイズの分だけコピーするにはどうしたらよいのでしょ?
- [NSData length]でバイト数がわかる。
てか、NSMutableDataで読み込んで、[NSMutableData mutableBytes]使えば?
画像ビューワを作ろうと思ったんですが、最大化ボタンを押した時に
・画像サイズに合わせたサイズになる
・画面サイズ以上に大きくはならない
という動作をさせようと思うんですけど、画像のサイズはともかく、
画面のサイズはどうやって入手したら良いんでしょうか?
[ @"〜/xxx" stringByExpandingTildeInPath]
文字列定数にメッセージ・・・んなら、いっそのことパスをまんま書いちゃえば
>>960 NSRect screenRect = [[NSScreen mainScreen] frame];
>958
>NSData* Data1 = [[[NSData alloc] autorelease] initWithContentsOfFile: [ openPanel filename ] ];
[[[hoge alloc] autorelease] init]ってありなの?
特別な理由が無ければ[[[hoge alloc] init] autorelease]が安全かと。
4,5もNSData *Data2=[[NSData alloc] initWithBytes:Buffer length:1024];
とするべき
>958
>963に関して。
前半はまあ、ありではあるよね。ただし、オートリリースされないけど。
でも後半は完全にダメだよね。
例えばこういう実装もありなのよ。
-(id)init
{
[self release]; // 自分自身を解放。
return [[MySubClass alloc] init]; // サブクラスのインスタンスを返す。
}
NSDataとかNSStringとかのクラスクラスタは上の様にinit...で
必ず自分のサブクラスのインスタンスを返します。
ですから、必ずinit...メッセージの返値を受け取らなくてはいけません。
2,の場合は、init...で解放される一時インスタンスに対してオートリリースをかけて、
実際に使用されるインスタンスにはオートリリースが掛かってませんから、リークします。
>>961 ~/xxxは実行時までどのように展開されるか決まりません。
だからパスをまんま書くことはできません。
966 :
び:03/09/09 12:41 ID:SN5jR2wm
ありがとうございます。
>963,964
2:NSData* Data1 = [[[[NSData alloc] init] autorelease] initWithContentsOfFile: [ openPanel filename ] ];
3:[Data1 getBytes:Buffer length:[Data1 length]];
4:NSData *Data2;
5:Data2 = [[NSData alloc] initWithBytes:Buffer length:[Data1 length]];
6:[Data2 writeToFile:[ @"~/xxx" stringByExpandingTildeInPath] atomically:YES]
こんな修正で、データを読んでから書き戻すのに成功しました。
正しいのかどうか自信無いです。
>961
とりあえず手持ちのiMacとPowerBookでアカウント名が違うのに対応したつもりだたのだです。
>959
> てか、NSMutableDataで読み込んで、[NSMutableData mutableBytes]使えば?
Buffer変数の型をMutableDataにするということでしょうか?
MutabaleDataにファイル読み込むときもNSData経由ですよね?
あと、プロジェクトがだんだn大きくなってくると、buildに異様に時間がかかるように
なってきました。今のMac(G3-400)には荷が重いようです。
ProjectBuilderにG4の効果はありますか?部屋が狭いんで、iBookG3-900くらいで
手をうちたいのですが。(H"が刺さらんか)
iBookだHDDが確かATA33なんでビルドが遅く感じるかも。
PowerBookにしる。
968 :
967:03/09/09 13:41 ID:at1cWoqC
×iBookだHDDが
○iBookだとHDDが
>966
> 2:NSData* Data1 = [[[[NSData alloc] init] autorelease] initWithContentsOfFile: [ openPanel ilename ] ];
こうじゃなくて
NSData* Data1 = [[[NSData alloc] initWithContentsOfFile: [ openPanel ilename ] ] autorelease];
こうだべ。理解できなかった?
> とりあえず手持ちのiMacとPowerBookでアカウント名が違うのに対応したつもりだたのだです。
NSString *NSHomeDirectory();
を使うように。
> MutabaleDataにファイル読み込むときもNSData経由ですよね?
NSMutableDataはNSDataのサブクラスじゃ!
つうことです。
今だ!970ゲットォォォォ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´
ヘ_ヘ ) (´⌒(´
ミ ・ ・ ミ ) (´⌒(´
( ° )〜≡≡≡(´⌒;;;≡≡≡
 ̄ ̄ (´⌒(´⌒;;
ズザーーーーーッ
971 :
名称未設定:03/09/09 23:45 ID:pN8SOKiO
>>971 「動的確保したメモリブロックはfreeで必ず解放せよ」って言いたいのかな?
/*
MLでこの話題が出ると果てしなく荒れ続けるよなw
メモリブロックからOSの実装まで発展して不毛極まりない論争になる。
これと双璧を成す起爆剤トピックが「fopen後は必ずfclose」
*/
>>971 AutoreleasePoolは{}による変数のスコープとは別のオブジェクトのライフタイムのスコープを導入する。メソッドの戻り値をautoreleaseすることによって、一時的なオブジェクトを気兼ねなく返すことができる。
- (id) method {
id result = [[[MyObj alloc] init] autorelease];
[result ...];
return result; //result変数はここで破棄されるが、オブジェクトは生きてることが保証される
}
id pool = [[NSAutoreleasePool alloc] init];
id result = [obj method];
[result ...];
[pool release]; //ここまでresultは生きてる
これに関連してObjective-Cでメソッドの戻り値のオーナーシップはcopyみたいに指示がない場合、どれもautoreleaseされてると考えるべき。
C++のスタック上のオブジェクトはポインタとして関数に渡すときに危険。
{
int x;
obj->setPtr(&x);
} //*xのポイント先が破棄される。このあとにobjがsetPtrで設定されたポインタを参照しようとすると不定
C++で楽にメモリ管理するなら↓みたいなのがいいと思う。
http://www.borland.co.jp/qanda/lang/l0003025.html ってこんな感じであってる?
975 :
974:03/09/10 02:49 ID:Ipd3Rmyd
って、ちょっとまて。
>966氏はよく見たらすごいことやってるな。
NSDataを確保して、初期化して、自動解放して、初期化したわけか。。。
ここまできたら、もう一回自動解放してみるのがいいかも。。。
>>971 自分が生成したオブジェクトは自分で削除する。
自分が生成したのでないオブジェクトをランループを超えて
保持し続けたいのであれば、retainする。
retain(かalloc)したオブジェクトのreleaseは忘れない。
retainしていない(かallocしていない)オブジェクトはreleaseしない。
自分でreleaseできない場合や他のオブジェクトなどへ渡す場合には
autoreleaseする。
つまり、他のオブジェクトメソッドの返り値で受け取ったオブジェクトは
factoryメソッドなどの明示されている場合を除き、autoreleaseされて
いると思ってつかう。
このサイトの作者はまだオーナー湿布ポリシーを理解していない。
ちょっと前にmacosx-dev-jpMLに出てたけど、
オブジェクトはかならず
myObj=[[[Obj alloc] init] autorelease];
で確保して、
欲しくなったら必ずretain、releaseするっていうのが
よく分かってない人(例えば>971氏)には分かりやすいんじゃないか?
分かればそんな難しいもんじゃないんだけどね。
問題の本質を理解しましょう。
JavaにはGCがあるし、C++ではスタックオブジェクトやスマート
ポインタを使えばオブジェクトの廃棄は自動的に行われる。
これに対しAutoreleasePoolを使った手動参照カウントはプログ
ラマが考えて参照カウントを調整しないといけない。
> 自分が生成したオブジェクトは自分で削除する。
> 分かればそんな難しいもんじゃないんだけどね。
はJava/C++の自動廃棄に比べてミスの危険が常に付きまとう。
AutoreleasePoolはお手軽だけど古くさい仕組みだということ
皆さん
>>978に対しては冷静な対応をお願いします。
(できれば反応しないのが安全かと)