Cocoaはさっぱり!version:2

このエントリーをはてなブックマークに追加
930名称未設定:03/09/01 22:13 ID:0GgUF9oI
>>929
えーと、Project BuilderがObj-Cに対応したコンパイルを
行なってくれるかどうかは、ソースファイルの拡張子で決まっていたはず。

問題のソースファイルの拡張子が".c"になってませんか?
".m"またはC++を併用するなら".mm"に変更してください。
931名称未設定:03/09/01 22:57 ID:IbMeVQWB
>>929
ライブラリって本来Carbonオンリーぽいのだが、、
何のソフトのプラグインなのか示せば話がはやいかも
932915:03/09/01 23:41 ID:mhCs1yO1
>>ライブラリって本来Carbonオンリーぽいのだが、、

僕もそんな気がします。
ソフトは・・秘密にしておきますw
すいません。

>>930

mmにしてます。
エラーが出るのは上記問題のような気がします。

しかし、OSXのプログラミングはおもしろいですね〜

933915:03/09/02 01:15 ID:kZybqWeV
みなさんどうもです。
結果報告。

コンパイルに成功し、読み込みもうまく行きました。
windowの表示はできませんでしたが・・w
(表示しようとはしているようです。読み込み時HOSTが重くなりました。)

どうもwindow描画のメソッドがおかしいようなので
荻原本見て勉強します。

あと一歩〜
934名称未設定:03/09/03 22:02 ID:9WBe4EZj
>>907
どーしても分からんかったら自前でピクセル触ったら?
そっちのほうが早そう
935名称未設定:03/09/04 16:24 ID:D/ixHjRk
スレッドセーフなキューを作ってるんですが、排他制御の方法で困ってます。
キューは
enum {
queueIsEmpty,
queueHasSpace,
queueIsFull,
};
という3つの状態を持ってます。
状態が2つなら、NSConditionLockを使えば簡単に排他制御が出来るのですが、
3つの状態を持つ場合にどうやれば排他制御が出来るのかが分かりません。

キューの容量を変化可能にすればqueueIsFull状態を無くすことは出来ますが、
動作が重くなってしまうので出来るだけ避けたいです。

よろしくお願いします。
936名称未設定:03/09/04 16:40 ID:Mi9Yibzr
>>935
Lockを増やす
937935:03/09/04 20:04 ID:U2TVQR+M
>936
ありがとうございます。ちょっと考えてみます。

>935 ちょっと条件が足りなかったので付け加えます。

Queue* queue;
id data = [queue dequeue]; // queueIsEmptyならデータが入るまでwaitをかける。
と、
[queue enqueue:data]; // queueIsFullなら空きができるまでwaitをかける。
です。

よろしくお願いします。
938935:03/09/05 00:11 ID:d4S07o8T
>936
考えてみましたが、デッドロックが発生しない方法を思い付けませんでした。(泣
とりあえず、queueIsFull状態をなくして、キューがいっぱいのときは例外を投げてごまかすことにします。
このすれは毎日チェックしてますのでどなたか良い方法があれば教えて下さい。
939名称未設定:03/09/05 00:56 ID:KCe4m5Xn
個人的には、というか普通の人にとっては
「なんとかピーク版とかいうのはいいから、リリース版を出してほしいなぁ」
というのが、今望んでいることだったりする。

でもまだ開発調整中だったらごめんなさい。
開発版をsourceforgeではなく2chで議論することに疑問を感じるところではあるけど…
940名称未設定:03/09/05 01:01 ID:KCe4m5Xn
Cocomonarスレと間違えた。
941名称未設定:03/09/05 01:40 ID:ezIjTJMK
t
942a beginner:03/09/05 09:50 ID:BA/i6WJ9
IBでカーボンアプリも作成できる様ですが
それはクラシック環境でも動くのでしょうか?

よろしくお願いします。
943a beginner:03/09/05 09:53 ID:BA/i6WJ9
追伸:
ココアでクラシックで動くアプリがいちから作れるか、ということです。
944935:03/09/05 12:38 ID:BOUxdYER
>943
残念ながらCocoaはクラシック環境では動きません。
Carbonで作成したとしてもProject BuilderがCFMバイナリを生成できませんので、
やはりクラシック環境での動作は出来ません。
古いCodeWarrior等を使ってCFMバイナリを作れば
Nib+Carbonでかつクラシック環境で動作するアプリケーションが作成可能です。
(最新のCodeWarrioirはMach-Oバイナリしか生成できません)
945a beginner:03/09/05 18:09 ID:BA/i6WJ9
>>944
丁寧なレスありがとうございます。
クラシック用アプリの開発環境は現行ではREALBasicぐらいということでしょうか。
946名称未設定:03/09/06 01:09 ID:VHHJOKZJ
>>944
> 最新のCodeWarrioirはMach-Oバイナリしか生成できません
間違い。
http://www.metrowerks.com/MW/Develop/Desktop/Macintosh/Professional/mac9
947:03/09/06 02:31 ID:AT0Bahd7
ながーい計算を途中中断するのに、データを一時保存したいのだが
アプリケーション独自形式のデータをファイルに書き出す方法を
だれか教えて。
入門書だと、ドキュメントベースにしてテキストを出し入れする
例題ばっかで、document.nibが無い例が無い。
ググッてみても、さっぱりわからん。

デバッグのことを考えて、テキストコメントとデータで
セーブデータを作るつもりなんだけど
変にCocoaにコダワリすぎ?
948名称未設定:03/09/06 02:54 ID:sLyZd4pI
NSDataにしてwriteToFile
949:03/09/06 03:48 ID:AT0Bahd7
NSArchiverでNSDataを生成すると書いてあるのを見たけどちんぷんかんぷん


たった今までNSDataはNSDocumentの継承だと勘違いしていた、、、
調べなおしてみます。
Cocoaはやっぱりワカンネー
950名称未設定:03/09/06 09:14 ID://38hyxl
>>949
セーブデータを格納するオブジェクトを作って、
それにNSCodingプロトコルを実装させる。

ここが参考になるかと。
ttp://www.stripe-net.jp/cocoa/cocoa/foundation3/foundation3-2.html
951944:03/09/06 09:20 ID:2vqBcRYB
>946
指摘ありがとう。
http://www.metrowerks.co.jp/Products/Desktop/MacXE.html
これが最新版だと思ってた。機能限定版だったのね。
952名称未設定:03/09/08 02:35 ID:oYdQ9pyG
cocoaで画像の変形をしたいのですが。良いサンプルコードは無いでしょうか。
サンプルコードさえあれば後は自学自習しますんで
953名称未設定:03/09/08 02:39 ID:CXbuqi0Z
画像の変形って?
フーリエ変換とかでいいの?
954952:03/09/08 02:41 ID:oYdQ9pyG
追記
アフィン変換で、例えば台形をした画像を、正方形に変形する事はできるのでしょうか?
955952:03/09/08 02:50 ID:oYdQ9pyG
>>953
フーリエ変換でということは、画像の周波数成分から特定の値をとるとか
フォトショップのフィルタみたいなってことですかね?

フォトショップの編集メニューにある自由変形みたいなことがしたいのです。
956名称未設定:03/09/08 02:51 ID:R+3AwMjP
>>952
むしろ、台形かどうかを判定する方が難しいような。
変形は簡単にできるけど。

http://developer.apple.com/samplecode/Sample_Code/Cocoa/Transformed_Image.htm
957952: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の所でファイルサイズの分だけコピーするにはどうしたらよいのでしょ?
959名称未設定:03/09/09 02:05 ID:pZuWLBw7
>>958
5でinit...の返り値を受け取ってないよ(NSDataはクラスクラスタ)。

>あと、3の所でファイルサイズの分だけコピーするにはどうしたらよいのでしょ?
- [NSData length]でバイト数がわかる。
てか、NSMutableDataで読み込んで、[NSMutableData mutableBytes]使えば?
960名称未設定:03/09/09 02:14 ID:HE6It75g
画像ビューワを作ろうと思ったんですが、最大化ボタンを押した時に

・画像サイズに合わせたサイズになる
・画面サイズ以上に大きくはならない

という動作をさせようと思うんですけど、画像のサイズはともかく、
画面のサイズはどうやって入手したら良いんでしょうか?
961名称未設定:03/09/09 03:22 ID:oKY8amQK
[ @"〜/xxx" stringByExpandingTildeInPath]

文字列定数にメッセージ・・・んなら、いっそのことパスをまんま書いちゃえば
962名称未設定:03/09/09 03:24 ID:oKY8amQK
>>960
NSRect screenRect = [[NSScreen mainScreen] frame];
963名称未設定:03/09/09 08:11 ID:iK3vNGeB
>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];
とするべき
964名称未設定:03/09/09 09:00 ID:KiEjpc+9
>958

>963に関して。
前半はまあ、ありではあるよね。ただし、オートリリースされないけど。
でも後半は完全にダメだよね。

例えばこういう実装もありなのよ。
-(id)init
{
[self release]; // 自分自身を解放。
return [[MySubClass alloc] init]; // サブクラスのインスタンスを返す。
}

NSDataとかNSStringとかのクラスクラスタは上の様にinit...で
必ず自分のサブクラスのインスタンスを返します。
ですから、必ずinit...メッセージの返値を受け取らなくてはいけません。

2,の場合は、init...で解放される一時インスタンスに対してオートリリースをかけて、
実際に使用されるインスタンスにはオートリリースが掛かってませんから、リークします。
965名称未設定:03/09/09 12:34 ID:UgRW6Y9u
>>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"が刺さらんか)
967名称未設定:03/09/09 13:40 ID:at1cWoqC
iBookだHDDが確かATA33なんでビルドが遅く感じるかも。
PowerBookにしる。
968967:03/09/09 13:41 ID:at1cWoqC
×iBookだHDDが
○iBookだとHDDが
969名称未設定:03/09/09 14:22 ID:KiEjpc+9
>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のサブクラスじゃ!
つうことです。
970Kusakabe Youichi:03/09/09 23:01 ID:aGXZMgFL
今だ!970ゲットォォォォ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄    (´´
  ヘ_ヘ   )      (´⌒(´
ミ ・ ・ ミ   )   (´⌒(´
(  ° )〜≡≡≡(´⌒;;;≡≡≡
   ̄ ̄  (´⌒(´⌒;;
      ズザーーーーーッ
971名称未設定:03/09/09 23:45 ID:pN8SOKiO
Cocoa関連検索してたら出てきたんだが、この考え方って正しいの?
ttp://www.fastwave.gr.jp/diarysrv/trinity/200309a.html#20030909-2
972名称未設定:03/09/10 01:25 ID:Y8g7Iah+
>>971
「動的確保したメモリブロックはfreeで必ず解放せよ」って言いたいのかな?

/*
MLでこの話題が出ると果てしなく荒れ続けるよなw
メモリブロックからOSの実装まで発展して不毛極まりない論争になる。
これと双璧を成す起爆剤トピックが「fopen後は必ずfclose」
*/

973名称未設定:03/09/10 01:46 ID:3gJ2qtrW
>>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

ってこんな感じであってる?
974名称未設定:03/09/10 02:36 ID:Ipd3Rmyd
>971
導入部は別に間違ってないと思う。
オーナーシップに関する理解がなければ簡単にリークしちゃうと思う。

メソッドの戻り値のオーナに関して明記されてないとあるが実はキチンと明記されている。
ここ
http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/4objc_runtime_overview/chapter_4_section_2.html

#ここには>966氏が理解してない +alloc... と -init... が不可分であることもきちんと明記されている。

御覧の通りこれはObjective-Cのお勉強の資料です。
彼はObjective-Cのお勉強もしっかりやらずにうんちく垂れてるわけですね。
975974:03/09/10 02:49 ID:Ipd3Rmyd
って、ちょっとまて。
>966氏はよく見たらすごいことやってるな。
NSDataを確保して、初期化して、自動解放して、初期化したわけか。。。
ここまできたら、もう一回自動解放してみるのがいいかも。。。
976名称未設定:03/09/10 14:31 ID:HRQvxoap
>>971

自分が生成したオブジェクトは自分で削除する。

自分が生成したのでないオブジェクトをランループを超えて
保持し続けたいのであれば、retainする。

retain(かalloc)したオブジェクトのreleaseは忘れない。
retainしていない(かallocしていない)オブジェクトはreleaseしない。

自分でreleaseできない場合や他のオブジェクトなどへ渡す場合には
autoreleaseする。

つまり、他のオブジェクトメソッドの返り値で受け取ったオブジェクトは
factoryメソッドなどの明示されている場合を除き、autoreleaseされて
いると思ってつかう。

このサイトの作者はまだオーナー湿布ポリシーを理解していない。
977名称未設定:03/09/10 16:48 ID:neWZY+QA
ちょっと前にmacosx-dev-jpMLに出てたけど、
オブジェクトはかならず
myObj=[[[Obj alloc] init] autorelease];
で確保して、
欲しくなったら必ずretain、releaseするっていうのが
よく分かってない人(例えば>971氏)には分かりやすいんじゃないか?

分かればそんな難しいもんじゃないんだけどね。
978名称未設定:03/09/10 18:05 ID:IcsQ4bO0
問題の本質を理解しましょう。
JavaにはGCがあるし、C++ではスタックオブジェクトやスマート
ポインタを使えばオブジェクトの廃棄は自動的に行われる。
これに対しAutoreleasePoolを使った手動参照カウントはプログ
ラマが考えて参照カウントを調整しないといけない。
> 自分が生成したオブジェクトは自分で削除する。
> 分かればそんな難しいもんじゃないんだけどね。
はJava/C++の自動廃棄に比べてミスの危険が常に付きまとう。
AutoreleasePoolはお手軽だけど古くさい仕組みだということ
979名称未設定
皆さん>>978に対しては冷静な対応をお願いします。
(できれば反応しないのが安全かと)