- Cocoaはやっぱり!を見て真似してソフトを作ったは良いが、
オリジナルを作ろうと思ったら、全然その先に進めない人集まれ!
親切なプログラマーさんが暇なときだけ教えてくれる(かも?)
前スレ
http://pc.2ch.net/test/read.cgi/mac/1007632025/l50
関連スレは>>2-20までには
- あぼーん
- >>2
氏ね
- ていうか、関連スレを人任せな1にも問題があるかと…
- あぼーん
- >>1
お疲れ~
でも、前スレにリンクが貼れなかったのが残念
- とりあえず貼っときます。
不備があったら誰か補って下さい。
関連スレ
Macでプログラミング{2}
http://pc.2ch.net/test/read.cgi/mac/1025998843
◆◆◆◆◆◆MacでJava◆◆◆◆◆◆
http://pc.2ch.net/test/read.cgi/mac/991194610
前スレ発
Cocoaでメーラー作るよ
http://pc.2ch.net/test/read.cgi/mac/1035386838
関連サイト
Cocoaはやっぱり!
http://www.big.or.jp/%7Ecrane/cocoa/
HAPPY Macintosh Developing TIME!
http://homepage.mac.com/mkino2/
Cocoa Developer Documentation
http://developer.apple.com/techpubs/macosx/Cocoa/CocoaTopics.html
(開発ツールをインストールすれば、/Developer/Documentation/Cocoa/CocoaTopics.html に同様の資料がある)
- >>1
乙
- ドキュメントベースアプリでウィンドウにNSTextView張り付けて
『フリーのテキストエディタです、使って下さい』
っていうのはもういいよ。
↑たまに見かけるんだよね。
SimpleTextにも満たないエディタは必要ないよ。
練習のためならいいと思うけど。。。
>>1
御吊
- すみません、いま練習用に簡単な画像ビュアーと画像形式変換アプリをCocoaで作っているんですけど
疑問点が2つ出てきましたので質問させて下さい。
(1) ファイルからinitWithContentsOfFileでNSImageに貼付けた画像の元データの画像形式を知る方法は
あるのでしょうか?PNGやJPEGなどはNSImageに貼付けるとぜんぶBitmapImageRepとして保ってる
ようなのでrepresentationの種類で区別はできなそうですが他になにかありますか?
NSDataで取り込んでから自前の判定ルーチン作るか、拡張子やファイルタイプで見分ければいけるとは
思いますができればCocoaに任せたいのです。
(2) 画像形式を変換して保存する際、「Cocoaはさっぱり!」に書かれているようにBitmapImageRepを
作ってrepresentationUsingType: properties :で変換しようとしたのですが、NSBMPFileTypeの時だけ
何を入れてもnilが帰ってきます。PNG等は問題なく生成されます。
alphaを除いたりpropertiesにnilや適当なNSDictionaryを入れたのですが全然ダメです。
なにか他に必要な前処理か、必須のキーがあるのでしょうか。
googleなどで検索しましたが参考になる記述が見つかりませんでした。
もしなにか分かる人がいましたら教えて下さい。
開発環境はOS10.2.1とそれに付属のProjectBuilderです。
- >>9
NSTextViewだけでSimpleTextを軽く超えている罠。
- >>11
俺が言いたかったのはテキストエディットのことらしい。。。
全然気付かなかった。。。
撃つ堕し膿。
- 書籍版「Cocoaはやっぱり!」の第4章「カウントダウンタイマーを作成」に挑戦中です。
NSTimerの項のソースを作成し、ビルドすると
?Compiling TimerController.m (2 個の警告)
TimerController.m:25: warning: cannot find class (factory) method
TimerController.m:25: warning: return type for `scheduledTimerWithTimeInterval:target:selector:userinfo:repeats:' defaults to id
というワーニングが出ますが、アプリケーションは作成されます。
しかし、作成されたTimerアプリケーションを起動し、Startボタンをクリックすると
Project Builderの実行ウィンドウに
2002-11-16 12:31:50.218 Timer[582] *** +[NSTimer scheduledTimerWithTimeInterval:target:selector:userinfo:repeats:]: selector not recognized
というメッセージが出ます。
次に、ソース中のタイマー作成部分を
?timer = [self doAlerm];
と、メソッドを呼ぶだけに変更してビルドするとワーニングは出なくなったのですが、
前回と同じくStartボタンをクリックすると、
2002-11-16 12:28:47.750 Timer[554] *** -[TimerController doAlerm]: selector not recognized
というメッセージが出ます。
doAlermメソッドがうまく認識されていないような気もしますが、何が悪いのかさっぱり
分かりません。とほほ。
アドバイスをお願いします。
- >>13
× scheduledTimerWithTimeInterval:target:selector:userinfo:repeats
○ scheduledTimerWithTimeInterval:target:selector:userInfo:repeats
user"I"nfo
Iが大文字です。
メソッドはヘッダからコピペしたほうが安全。
あと、警告を信じる。
- 今cocoa/Javaの勉強を兼ねてFTPのクライアントを作成しているのですが、
二つほど謎のエラーがおきます。
『***はシグナル 10(SIGBUS)により終了しました。』
『abstractMethodError』
というエラーなんですけど(二つ目はめったに出てこないので記憶が曖昧で
す)どちらも特定の場面で出てくるわけではなく、たまに(恐らく処理が重いとき)出てきます。
処理が重いといっても全然たいしたことないはずですし、どうしていいのかわかりません。
だれか原因について思い付く方はいらっしゃいませんか?
- >>15
推測だけど、最初のがメモリ関係、次がそのまま、インプリメント
されてないメソッド、抽象クラスなどのメソッドを呼び出した、
ってことでないの? Javaは詳しくないけど。
ところで、まさか、そのプログラムで他人のサーバに
つないでないだろうね(w
- Web上でObjective-Cの解説サイトってわかりやすくて、
いいところないですかね。
普通のC言語なら掃いて捨てるほど出てきますが。
- >>15
AbstractMethodErrorは、抽象メソッドを呼び出したっていう
意味で、普通はコンパイル段階でエラーになるはず。
一度クラスファイルを全部削除して再コンパイルをかけた方が
いいんじゃないかな。
めったに出ないなら、すでに問題が解消されているような気もするけど。
上のエラーの方は、それだけじゃちっともわかんないので、
まずは地道にデバッグして落ちている箇所を特定しましょう。
- >>14
あ、全然気が付きませんでした。
実は去年からずっとここで悩んで止まってたんです。
目、悪すぎ>俺
やっと次に進めます。本当にありがとう!
- file://localhost/Developer/Documentation/Cocoa/ObjCTutorial/index.html
- おまえら英語を母国語のごとく使えるんですか。そうですか
うらやますいです。
- お返事ありがとさんです。
>>16
やっぱり一つ目のエラーはメモリ関連ですよね。
まさかjavaやっててメモリ関連のエラーを受けるとは・・・、とほほ。
>>18
いまから目を凝らして落ちてる場所を探します。
そういえばテーブルの描画周りが怪しい、ドキュメントにも
『このメソッドは気をつけろ』ってのがあったしなぁ。
ちょっとやっつけちゃいますね。
- たびたびすいません。
今気付いたことなんですけど、どんなにクラスファイルを全削除 -> リコンパイル
してもコンパイルエラーが出ません。なのにjava.lang.AbstractMethodErrorは
しっかりでます。
具体的にはテーブルやボタン等をひたすら連続でクリックすると出てきます。
しかも[Abstract ~~~~]が出た後にシグナル10で落ちます。
シグナル10はメモリ関連ということで俺が悪いのでしょうけど、[Abstract ~~ ]は
どうもよくわかりません。
同じようなことに出くわしたことある人っていませんか、いませんよね。
がんばってみます。
delegate関係なのかなぁ??
- >>21
そんな貴方にMSDN!
殆ど日本語になっている。
Windowsはいいぞ・・
でも最新情報を見る際はアチラ語が必要罠。
Cocoaは例え日本語でも楽でない気がする。
資料多すぎ。
今は皆そうか・・
- アフォな質問でもうしわけないんですけど
一行もコードを書いていないdocument-based applicationで
ウインドウを閉じたり出したりしてるだけで
どんどん常駐メモリサイズ増えていくんですけど
どうすればいいですか?
- 決してアフォな質問ではないぞ>>25
たぶんcacheだと思うが・・
OSXでは掴んだら他が苦しみだす迄離さないのが多い噂。
余裕がある限り浪費しまくるらしい。
詳細は知らんので後は何方か頼む。
- >>25
それすげー気になる。
だれか分かる人はいませんか?
Cocoaの神よ、降りてきて下され!
- ttp://www.nt.sakura.ne.jp/~stglide/
は>>10さん?
- 胸、でか!
- >>28
あ、どうもです。
リンク先見てみたけどどうもそこはCocoa-javaの話みたいでjavaはさっぱりなわたしには
ちょとよくわからないけど、どうやら画像の判別はしていないようでした。
もうちょっと勉強してみます。どうもありがとうございました。
- >>15
Javaは良く分らんが、クラスクラスタが抽象クラスのオブジェクトを返してるんじゃないのか?
hoge = new NSArray();
hoge,count();
とか。
>>25
- setReleasedWhenClosed:(BOOL)flag;
- (BOOL) isReleasedWhenClosed;
この辺じゃねーの?
- >>26
はは、思わず笑っちゃったよ。
DevツールのObjectAllocを使えば、自分のコードに問題が
あるのか、それともフレームワークのキャッシュなのか分かるよ。
- え~とよくわからないけど気にすんなってことか。
- ホッシュ ホッシュ
- NSUserDefaultsなんですけど、本によって#defineを使ってるのとNSString *〜ってやる方法がありますよね。これって、どっちが良いんでしょう? なんか違いとかあるんでしょうか?
あと、Cocoaはやっぱり!のP110〜の「環境設定の読み込みと保存」とか読んでTextFieldにデフォルト値から文字列を読み込む方法は分かったんですけど、チェックボックスのデフォルト値を保存したりする方法ってどうすればいいんでしょう?
- >>35
個人的にはどっちでもいいような気がします。
自信はありませんけど・・・
>チェックボックスのデフォルト値を保存したりする方法ってどうすればいいんでしょう?
- setBool:forKey: や
- boolForKey:
を使いましょう。
あと少しでもいいですからAppleのリファレンス読んでみて下さい。
英語ですが大体のことはここで分かります。
- 最近Amazonが古本の個人売買の仲介始めましたよ。
Mac関連のプログラミング本も安くゲットできるチャンスかも。
- >>36
どうも、ありがとうございます。
早速試していますが、デフォルト値を定義して上手く.plistに書き込むところまで
は成功しましたが、変更が保存されません。。
例えばデフォルトではチェックボックスをONにしてあるものをOFFにしても
その変更が繁栄されない、という感じです。
保存は(Cocoaはやっぱりの例を拝借して)こんな感じ↓でやってます。
[ defaults setBool : obj1 forKey : @"obj1" ];
>あと少しでもいいですからAppleのリファレンス読んでみて下さい。
リファレンス、苦労してます。あれ読んでも具体的にどう書けば良いのかが掴めず。。
- >>38
>例えばデフォルトではチェックボックスをONにしてあるものをOFFにしても
>その変更が繁栄されない
これは、通常プログラマの仕事であって、フレームワークの仕事ではない。
>Cocoaはやっぱり!のP110(略)
多分この本には、サンプルコードだけではなく、
サンプルコードのこの部分はこう言うことをしている、という説明がついてるはずだ。
説明には、自動的に設定が反映されると書いてあったのか?
日本語も読めないのか?
- こうしてCocoaプログラマは減っていく…
- NSTableViewに表示されるテキストの色を、行ごとに変えたいのですが、
これは可能なのでしょうか。
- 10.2から実装されたSpinタイプのプログレスバーだけど、サイズの変更、コーディングで細かく設定出来ないすかねぇ?
- Finderの「情報をみる」パネルみたいな、
黒い三角のボタンを押すと隠れていた項目がにょきっと出てくる
インターフェースを作りたいんと思っているのですが、
これって、Cocoaだと、どうやってやればいいのでしょうか。
調べてもどうしても分からないので、
ご存知の方がいらっしゃったら教えてください。
- >>43
> 黒い三角のボタンを押すと隠れていた項目がにょきっと出てくる
> インターフェースを作りたいんと思っているのですが、
これをやるには自分で作るしかないと思われ
調べてもどうしても分からないんだったら諦めたほうが吉
- >>38
あくまでもNSUserDefaultsがやることはデフォルト値を保存するということだけで
チェックボックスのON,OFFを自動的に感知して保存するわけではありません。
もしそれをしたいのならばチェックボックスのActionを他のインスタンスに設定して、
その都度BOOL値を保存する必要があります。
あとは、もう少し予算があれば本を買うことをお勧めします。
荻原本やヒレガス本あたりが基礎を高めるのにはいいと思います。
- >>45
ありがとうございます。Actionまわりを設定したら上手く保存出来たようです。
>荻原本やヒレガス本あたり
分かりました、良いと評判のヒレガス本を買ってみます。
- >>41
できるよ。
データソースの
tableView:objectValueForTableColumn:row:
このへん。
>>43
Carbon in Cocoaになると思う。
http://developer.apple.com/techpubs/macosx/Essentials/AquaHIGuidelines/AHIGControls/Disclosure_Triangles.html
このへんと
http://developer.apple.com/techpubs/mac/HIGOS8Guide/thig-24.html
このへんと、
http://developer.apple.com/techpubs/macosx/Carbon/HumanInterfaceToolbox/AppManager/appearancemanager.html
http://developer.apple.com/techpubs/macos8/HumanInterfaceToolbox/ControlManager/controlmanager.html
このへん。
GrafPtrはNSQuickDrawViewから、
WindowRefはNSWindowから持ってこれる。
- >>47
レスありがとう。
Formatterを使ってNSAttributedStringのインスタンスを作ってやれば
いいのかな。
- よく平然と英語解説ページを提示したりしてる人達は
英語ペラペラなの?
やっぱ英語勉強した方がいいのかな・・
- >>49
英語解説ページ読むのに英語ペラペラは関係なし。
必要なのは、
中卒程度の英語力+コンピュータ用語語彙+英和辞書
- 正直、プログラマー的な慣用につまづく。
- >>44
ありがとうございました。
おかげであきらめる決心が付きました・・・
別のやり方でやりたいと思います。
- >>49
私の英語力は、話せません、聞き取れません、書けません、辞書があれば何とか読める程度です。
リア厨、リア工時代は何とか及第点を取れる、もしくは頭を下げて及第点をもらう程度でした。今思うとめちゃ悔やまれる。
こう言うのを読むときは、gooかexciteの辞書ページ開いてます。
専門分野の解説での長文翻訳は意味不明な日本語にしてくれるので逆効果です。
これでも専門用語を知っていれば何とかなります。
意味が分らない専門用語は英単語のままでもgoogleの日本語限定の検索で結構引っかかりますし、
それでも分らなかったら、無理やりカタカナにして検索すると言う手もあります。
私の場合、専門用語を覚えるのはもちろん日本語の解説書でです。
正直MacOSXPBあたりの時のCocoaは五里霧中状態でした。
NeXTSTEP,openstep関連のページを検索したり、MacTech Magagineを掘り出してきてラプソディー関連を読んでみたり...
やっと何とか使えるようになってからドドドと日本語の解説書が出てきた時は泣きました。
まあ、何とかなるもんなんで、一度読んでみて下さい。
- - drawRect: に渡される rect の値が時々正しくなくなり、表示が乱れて
しまいます。どんな原因が考えられるでしょうか。
ウィンドウを切り替えたときに、背面にまわったウィンドウの表示がおか
しくなります。調べてみると、rectの値がアップデートするべきviewのもの
と違ってしまっています。こんなことってあるのでしょうか。
- >>54
>調べてみると、rectの値がアップデートするべきviewのもの
>と違ってしまっています。
これが、Viewのframeの値と違ってると言うのなら、そういうものです。
アップデート対象部分だけがrectに入ってきます。
もし違うのであれば、
http://developer.apple.com/bugreporter/
これかなあ。でも英語だしねえ。
- >>55
どうもありがとうございます。勘違いしてました。
[self bounds]を使って正常になりました。
正しくないのは私の頭の方でした。
- 初心者な質問で申し訳ないんだけど、教えてください。
CStringに入ってる文字列をStringにして、んでTextViewとかに表示させたいんだけど、
日本語が入ってる場合文字化けしちゃうんだけどどうすればいいのかな。
[ textView ?setString:[ NSString stringWithCString: CStr ]];
例えばこんな感じでtextViewに表示させても日本語だけ文字化けしちゃうのよね。
で、エンコードする必要があるとは思うんだけど、どうすれば良いのでしょうか。
誰かお助けを。
説明が下手でごめんなさい。
- ↑すまそ、わけわかになってた。なんでもないっす。忘れてください。
- >>57
NSDataを介します。
NSData* shift_jis_Str = [NSData dataWithBytes:CStr length:strlen(CStr)];
NSString* string = [[NSString alloc] initWithData:shift_jis_Str encoding:NSShiftJISStringEncoding];
- あれー?
charCString[] = "てすと";
[ textView setString: [NSString stringWithCString:CString] ];
で問題なく日本語いけたけどなあ。(OS10.2.2)
- shift_jisなら大丈夫なんだよね。
- CocoaからCarbonを経由しないで、AppleEventを送信することはできますか?
NSAppleScriptでもいいんだけど、やっぱりローレベルの方がいいなと。
(かといってCarbonはわからない…)
- >62
素直に NSAppleScript 使えばいいのに。なんで駄目なの?
つーかローレベルってCarbonのことじゃない、この場合。
それともMachのメッセージ通信のこと?
- cocoaって情報少な過ぎ・・やっぱ止めようかな・・
- >>64
情報少な過ぎなんて思うのはリファレンス読まないだけじゃないのか?
中学生レベルの英語でもメソッド名見れば大体分かるし。
- リファレンスに簡単なサンプルコードがついていればねぇ…
- いや、ほんとにリファレンス読んで、ネット上にある数少ない情報を汲み取って
やればいろんなことが出来るよ。
俺も最初は『情報少なっ!』って思ったけどやってるうちに普通のことが普通に
出来るようになってた。(どんな言語や環境でもそんなもんだろ)
最初にちょっと苦労しておけば後が楽ですよ。
(って言っても読まないやつは読まないんだろうなぁ <- リファレンスのこと)
- How do I change window to fullscreen?
I set menu invisible and tried to change window mask.
But window mask cannot change except for initialization.
- どうやれば窓を全画面にできまつか?
メニューを不可視に設定して窓の覆いを変えてみますた。
しかし、初期化せずに窓の覆いを変更することはできませんでつ。
- >>68
ADC reference より
An NSWindow's style is set when the object is initialized. Once set, it can't be changed.
ここまで
- >>66
あー、サンプルコードついてるといいね。ADC行って適当なサンプルないか
探してくるより楽でいいや。Tell Usしてみる?
- いやー、英語で書かれてる云々よりも、解説の仕方というか、
書き方というか、その辺かと。
リファレンスとか読んでも、何が出来る、ってのは分かるんだけど、
あとは「書式」と「返り値」とか書かれてるだけで、
具体的にどういう感じに書けば良いのかがさっぱり掴めないんだよね。
リファレンスだけじゃなくて、「Cocoaはやっぱり!」も書き方同じだし。
「で? どう書けばいいのよ?」みたいな。
分かってる人には分かるかもしれないけど、あれって、いわゆる
プログラマー的慣用表現なの?
初心者にはやっぱり分かりづらいと思うけどなぁ。
- 自分で試すしかない。
テンプレートプロジェクトに少しずつ書き加える。
又はサンプルコードを少しずつ書き換える。
8bitBASIC時代からこの点は変わらないと思う。
- >>72
Referenceだけじゃなくて下のほうのProgramming Topicsも読んでそれをいってる?
サンプルコードもProgramming TopicsのTasksにあると思うが。
- なんにしろ母国語じゃないテキストだと
文章の意味を考えるところでいったん思考がとぎれる感じでやりにくいわな。
- なんかここの所心地よい程に今迄出てこなかった本懐が吹き出てますな。
- >>73
俺も思う。
>>72
いまから勉強をはじめる初心者には分かりづらくても仕方がないでしょ。
だって何も知らないんだから。
>>73の言う通り一つずつ試して納得していくしかないよ。
なんでもいいからアプリケーションって呼べるものを作ってみるといいよ。
その過程で必要なことを学ぶしかない。
- リーナスもビルゲイツもみんな最初は初心者だったんだ
- >>78
(´_ゝ`)フーン
- >>69
NSWindowのサブクラスを作って、- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag
で初期化する。
InterfaceBuilder上では、このサブクラスを指定する。
- 誰か前スレ保存してる人いない?
- >>81
俺も読みたい。だれか,たのむ。
- >>81
>>82
1-985までならあるけど。
うpロダは?
- April 2002 Developer Tools BetaにupしたらProjectBuilderのメニューが
英語になった。
- NSDictionaryについて質問です.よろしくお願いいたします.
下記のようなproperty listをNSDictionaryとしてメモリに
展開するところまではできました.しかし,
allKeysを使用して全てのkeyを取りたいのですが,KeyString-1
しかとれません.他のキー(例えばKeyString-2)を取るには
どのようにしたらよいでのしょうか.ご教示お願いいたします.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeyString-1</key>
<array>
<dict>
<key>KeyString-2</key>
<string>hoge</string>
<key>KesyString-3</key>
<integer>1</integer>
<key>KeyString-3</key>
<string>hoge</string>
<key>KeyString-4</key>
<true/>
<key>KeyString-5</key>
<true/>
</dict>
</array>
</dict>
</plist>
- KeyString-1
├KeyString-2─hoge
├KesyString-3─1
├KeyString-3─hoge
├KeyString-4─true
└KeyString-5─true
となっているようだがツッコミを入れといた方がいいのか?
- cocoaでプログラミングしてる人って普段何してるんですか?
macのプログラマー?
- 漁師ですが
- 日曜大工
- >>72
分かる気がする。
やりたいことを実現するメソッドは見つかった。そいつの引数も分かった。
しかし、その引数のオブジェクトはどこから調達してくるの?
おれが用意しているオブジェクトからどうやってとってくるの?
みたいな堂々回り。
またやりたいことと用意されているメソッドの機能レベルが違うと
探すこと自体がたいへんだしね。
もっとも、これはクラスライブラリの全容を知らないからだけど(^^;;
- そのへんはメソッド名をぐぐるで検索すればたいていどこかの誰かがサンプル書いていると思うが。
英語サイト行かないとわからないときもあるけど。
- >>86
そうなんです.そのようにネストされている場合の
Keyの取り方が分からないのです.
KeyString-1のvalueを取ってきて,valueを再び
NSDictionaryにして,allKeysでKeyを取る.
といったことしか思い付かないのですが,それしか
ないのでしょうか?
- AppKitとFoundationのFrameworkリファレンスを見る!
PDF版ならAcrobatで栞を目次代わりに使えるので便利。
- Cocoaで、こういう感じの日本語ドキュメントのサイトはありませんか?
http://www.microsoft.com/japan/msdn/library/
http://developer.apple.com/
の下を探したのですけど日本語のが見当たりません。
- >>94
オライリーがイイ仕事してる。本をかいな。
アップルジャパンは昔からその手の情報の翻訳はほとんどダメだ。やってない。
- 日本語DOQはMSが一番!
・・いやマジで。
>>95
AdobeやRealやNewTekなどもSDK資料は英語。
OracleはDBの付属資料は流石に翻訳されているが
ApplicationServerSDKは未翻訳だった;今はどうか?
資料ローカライズでMSに張り合えるのはIBM位か・・
- >>94
公式で翻訳されている文献はあんまりない
http://developer.apple.com/ja/techpubs/
Cocoaのリファレンスの翻訳ならばここ
http://www.oomori.com/cocoafw/index.html
- 結論:MS > IBM >>>>>{超えられない壁}>>>>> Apple
つか、そもそもMSと違って、売りっぱなしが基本姿勢だから、
活用の為の資料提供なんかする会社じゃないっての(藁
釣った魚に餌は与えないっつーか…。
- >>92
Foundationのみですませるなら、そうなりますね。
Core FoundationのXML Serviceを使えば、Tree構造として
展開、アクセスできるから、複雑な構造のXMLを処理するの
なら、こちらをどうぞ。
- XMLServiceってDOMだけなの?
- 念入りすぎるほど
保守。
- そしてさらに保守。
- 解除。
危機は去った。スレ違いスマソ
- >>100
ちょうどHMDTにその情報載ったよ。
DOMでもSAXでも無いけど両方に似たようなのがあるらしい。
- HMDTって・・・・なに?
- >105
ttp://homepage.mac.com/mkino2/
- DOMでもSAXでもないXMLパーサ…そんなアフォなシロモノが実在するとは…。
- Cocoa-Javaでホットキーの登録方法を教えて下さい。
HMDT(>>105,106参照)でやり方が書いてあるんだけど全くObj-Cが
分からないので理解が追い付きません。
それでも必死で読み続けてみて分かったことはCarbon Eventを使うということのみ。。
そもそもJavaからCarbonって使えるんですか?
一応スレ違いでは無いと思うのでここに書かせてもらいました。
- >>107
全てのXMLパーサがDOMかSAXかじゃないと駄目だと思っているのかよ。
>>108
Core FoundationはObjective-Cじゃない。
C++でもない。ただのCだ。
つーか、Cocoaじゃない。
JavaでXMLを扱いたければJAXP使え。
HDMTにも書いてあるけど今のCFXMLは
XMLパーサとしては原始的すぎて不完全。
システムに標準で付いてくるから
CarbonやObjective-Cで即使えるってのが利点。
- 結論:MSXML >>>>>>>>>>>>>>>>>>>>>(越えられない壁)>>>>>>>>>>>>>>>>>> CFXML
流行のXMLでこの体たらくは、まさにMicrosoftとAppleの技術力格差を象徴してるな。
- ↑ expat の位置はどのへん?
- >>109
反応さんくす。
>Core FoundationはObjective-Cじゃない。
>C++でもない。ただのCだ。
っていうのはつまり
『自分でCとJavaの橋渡しをしなさい』
ってこと?
了解です。
- がんがれ。
- >>112
了解したんなら余計なお世話かもしれが…
Javaでプログラム書くんなら、素直にJavaで書かれたXMLパーザを
使えばいいじゃん、と >>109 は言ってる。
- Javaでプログラム書くなら、Windowsの方が何かと便利。
- JavaにはSolaris。コレ、最強。
- 風呂釜。これ。
- VisualC++で書いてデバッグしてMacでコンパイル&リリース
これ最強(SDLを使う時)
- ココハココアスレ
- CocoaGesturesってどう言う仕組みで動いているんですか?
- >>120
分からないからせめて・・・・
保守!
- 消えて欲しくないから保守!
かといって今ここで聞きたいことも無いし。。
だれか話題提供プリーズ。
まぁ、まったりしてていいけどネ。∞
- >>122
CW最新版の割れ物は何処にありますか?
- 分からない・・・・。ゴメンヨ
- >>123
CWlite
- デベロッパツールが新しくなったので皆さん気合い入れて落としましょうw
- を、ほんとだ。
自動インデントを有効にするとぼろぼろおちるの
なおってるかなぁ
- 300メガでかい
- 新しいのって日本語ローカライズ対応してる?
- アクセス拒否られるなぁ。落とせないよー。
- >>130
パスワードの期限が切れてるんじゃない?
#定期的に新しくするのって面倒。
- >>129の疑問が自分も気になる。誰か教えて。
- PBは以前から日本語化していた訳だが、他のローカライズは
http://developer.apple.com/tools/macosxtools.html#breadcrumb
を見る限りは無いみたいだな。
個人的にはスクリプトエディタの新バージョンβに興味あり。
- 本当にAppleは日本語開発者に冷たいな。
つか、やる気ないだろ?
- 雑誌の画面写真でしか見た事ないけど、NEXTSTEP時代のPBには
クラスやメソッドの解説が日本語になってたよね?
- あれはキヤノンががんばってたんでは?
- 最近ようやくtech notesのCocoa物が翻訳されてるのみて、を~やっときたか~って感じでしたが。Cocoaで翻訳されてるのは2個しかない罠(藁。
てか日本人の開発者ってCarbonとかしかやっとらんと思われてるんだろーか?
tech notesもQ&AもCarbon絡みとかQT絡みばっかだよねぇ。
CocoaのDiscoverOPENSTEPは今のCocoa入門のPDFより出来がいいからあのままでいいけど(をい。
AppKitとFoundationKitのReferenceとっとと翻訳しろ~~~(><)
- リファレンスの翻訳よりむしろ、逆引き系のドキュメントが欲しい。
InsideMacにあって、Cocoaのドキュメントにないのはそこだよ。と
りあえず英語のままでかまわんから‥
- Windowsとのソフトの量の差の原因はこれか…。
- ユーザ数の差だろう...
- シェアの差は開発者の人数の差でもあるからなあ
- ただのユーザだったけど、プログラミングに興味が出た、って人物が
英語の壁で玉砕のケースが多いモヨリ。
Windowsには、酷評されつつも安易で使いやすいVBがあるし。
- プロジェクトビルダーとか付ける位なら教科書位出してくれてもいいのに。
中途半端。
- 各国版の、って事ね。せめて主要国の。
- 新しいデベツールで
フルスクリーンになるアプリを実行して終了すると
メニューバーの表示がおかしくのは折れだけですか?
- >>143
ProjectBuilderないと魅力半減。
教科書がほしいなら本で買ってもいいのでは。
- さいきんcocoa本が増え始めたようだよ 日本語の
- 1,2冊たまたま同時期に出ただけだろ。
- つうか、増えてもどれも基本的な事に付いて説明してて、
内容が結構重複してんだよな。
- 初心者向けのばっかりだよね。
リファレンスとか、Tips集とか、はまりどころ集とかほしい。
- Cocoa を始めてから自分で調べる力がつきました。
個人的には本がすぐに出ないことが幸いしたような気がする。
そろそろまとまった内容のCocoa本が見たいけどね。
- >>151が「調べる力」なるものを身に付けている間に、
ドザはMFCアプリを完成させてる罠
- ハア?
- >>152-153 ドザはMFCの底なし沼にはまっている罠
- 底なし沼とは具体的に何を指しているん?
- 調べる力が力尽きるほど調べても調べても調べ尽くせない調べのことでは?
- MFCとくらべたら、Cocoaのほうが洗練されてるよね。
でも、.NETと比べたらあやしいところかなぁ。
- .NETよりJavaのほうがイイって本当?
- >>158
価値観による
- やっぱCちゃんと勉強してからじゃないとObjective-Cはキツイかな
- C自体はさほど難しい言語じゃないんだけど、
Obj-Cの解説書ってプログラマーならアタリマエに知ってるんだろう的
用語が連発するんでちょっと難しくないですか。
- Objective-Cがはじめてのプログラミング言語という人向けの
本が無いのですな。だれかかきましょう:-)
そういえば、阪大は(むかしは?)1年のときにObjective-Cを
ならったとかどうとか。そのときの教科書の流出とかないのかな。
- うん。
こないだC解説してるページ見て(void)とかすらやっと理解した。
載ってないんだもん。
と言う訳で今日アマゾンにC(C言語プログラミング" ハーベイ・M. ダイテル )と萩原本を注文しました。
- 萩原本は良いよ。初学者向けかどうかちょっとわからないけど、
Objective-CでCocoaプログラム書くつもりなら、いずれは参考にな
るときがくるでしょう。
といいつつ、本心では、メモリ管理をほとんど気にしなくていい言
語の方が初学者には向いてるんじゃないかと思う。どのくらい本気
なのかとか、目的にもよるが・・・
- >>164
萩原本はいいですな。うんうん。
わたしもメモリ管理気にしない言語のほうがいいかな~と思ったのですが、
最初は不便な環境でいろいろ考える習慣をつけたほうがいいので、
ちょうど Objective-C くらいがいいのかも。
#うちの学校では B1 前期で scheme やって、後期に C をやるのですが、
#なにもわかってないくせに C ってつかえね~とか言う厨が....
- メモリ管理しなくていい言語なんてあるんすか。
参考になります押忍。
スレ中前述の様にObje本はせいぜい中級者向け(萩原本)迄しか無いのがつらい。
- >>166
押忍!
なんつーか「富豪的プログラミングで構わないならば」メモリ管理
を気にしなくてよい言語ってことです。いっぱいあるよ、
Java Ruby Python Perl Scheme lisp ...。
Java, Ruby, Python, Perlあたりは、その気があればCocoa
のプログラミングに使えるみたい。
Cocoaプログラミングに使えそうな言語へのリンク
ttp://www.fscript.org/links.htm
富豪的プログラミング
ttp://www.csl.sony.co.jp/person/masui/fugo.html
- え!!
PerlがCocoaに使えるんですか?ていってもどういう意味なのかわからない程度の素人なんですが。
普段Perlはテキスト処理用のスクリプトとして使ってます。
- 富豪的、っていうより
RubyやJavaみたいにメモリ管理の面倒(ガベージコレクションとか)
みてくれる言語のほうが初学者には楽、ていう意味だと思ったんだけど。
- >>168
CamelBone (perl)
ttp://camelbone.sourceforge.net/
RubyCocoa (ruby)
ttp://rubycocoa.sourceforge.net/
PyObjc (python)
ttp://pyobjc.sourceforge.net/
- スマソ、まちがえた
CamelBones (perl)
ttp://camelbones.sourceforge.net/
- まだこない。発送は当日にされたらしいが、
ペリカンって正月休みだっけ?
と、発送スパンをメモしとく。
- サービスを提供するアプリを作りたいんですが、
例えば
サービスメニューから呼び出す
↓
提供側のアプリでユーザーが何か操作をして、
「終了」ボタンが押される
↓
呼び出した側で結果が挿入される
みたいな事をやりたい時はどうすればいいのでしょうか?
- age
- >>173
すいません、いってることがよく分からないのですが。。。
サービスメニューっていうのはアプリケーションメニュー(アプリケーション名
がついたメニュー)の中の『サービス』の項のことでいいの?
なにか具体的な例が欲しいな。
- 昨日朝9時頃C本到着。
と止めようかと思ったけどそれでもスレ汚しメモ。
- >>175
具体的もなにも、そのまんまなんですが……
例えば
TextEdit側でテキストを選択して、
サービスメニューから「キーワードに色付け」を呼び出す
↓
色付けサービスを提供するアプリで、
キーワードを指定して行くと同じ文字列に色がついていく。
キーワード全部に色が付いたらユーザーが「色付けを終了」を押す
↓
TextEditに色付けの終わったリッチテキストが挿入される
て感じですが。
色んなCocoaの入門書を読んでみても、
サービスの提供にユーザーが介入しないサンプルばっかりで困ってます。
- 一つ聞きたいことがあるんですけど、MacOSXのインストーラみたいに
一つのウィンドウの中でビューをころころ変える時ってあるじゃないですか。
例えば10個のNSViewがある時にそれをプログラム側で
NSWindow.setContentView(view1)みたいにやりますよね。
その時に各ビューにいろいろなコントローラ(ボタンとか)があるとアクション
を受け取るクラスが必要になります。みなさんだったらこの受け取り側のクラス
を一つにしますか?それとも複数(例えば各ビューごと)に分けますか?
もちろん時と場合によるんでしょうけど、いままで自分は一つのクラスで
やってたんですけどビューが多くなるとあらゆる処理が混ざっちゃって。。
分けるのもありかなぁって思ったんですよ。
オブジェクト指向的には分けるのが当たり前な気もするのですが・・・。
どうでしょうか?
- >>178
Objective-C的にはCategoryでわけておくのもいいでしょうか。
結局、Viewの相互依存度によって柔軟に対応することに
なるのでしょうな。
- >>179
レスありがとうございます。
なるほど確かにそうですね。
プログラムは常に柔軟にってことですね。
依存度は低め(決して0ではないですが)なので分けてやってみます。
今紙にオブジェクトの依存関係を書いてみたんですがうまくやれば
きれいにまとまりそうです。
がんばってみますね。
それにしても『プログラムを書く』ということと『アプリケーションを作る』
っていうのは二つの間に壁がありますね。必死で勉強します。
- 少なくともsafariのソースを読んで意味が理解出来る位になりたい・・
- >>156
その説明では、何も判りません。
- ある文字列をEUCに変換したいのですが、
NSString *str = @"あいうえお";
NSData *dat = [str dataUsingEncoding:NSJapaneseEUCStringEncoding];
これでEUCのNSData型にして、そのあとNSStringに戻す方法は
どうしたらいいのでしょうか?
また、エンコードの方法はこの方法であっているでしょうか?
- >>183
そこまで分かっているなら、
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding
を使えばいいことも推測できそうなものですが。
- 直接Cocoaでなくてあれなんですが。
みなさんプロジェクトのバックアップとかってどうしてるんですか?
今んとこソーズいじる前に必ずtar.gzで丸ごと保存してるんですが、
何かいい方法あります?
- >>185
CVSを使うのがおすすめ。
http://www.a2zsd.co.jp/~a2zsd217/book/cvs/book1.html
コマンドラインからレポジトリを用意して、プロジェクトをIMPORTしておけば、
あとはProjcet Builderから差分を確認したり元に戻したりすることが簡単にできます。
- >>186
早速試してみました。
ちとこむずかしくて手こずりましたがなんとか導入できました。
んでも実際のプログラム以前にCVSに手こずる罠。。。
ちなみに教えていただいたページ以外にもCVSで検索してみたんですが
ttp://www.linkclub.or.jp/~tumibito/soft-an/cvs/cvs-man/cvs-ja_toc.html
(これって、DevelopToolsでインストールされるCVSのドキュメントの翻訳?)
ここもとても参考になりました。
とにかく186さん、ありがとうございます!
- >>185, 186
いままで何となくCVSに手を出しそびれていた俺に踏み出す勇気をくれた
お二人さん『アリガトウ』
俺も今夢中でttp://kahori.com/j-cvsbook/j-cvsbook.htmlを読んでた。
まだまだ実用的なことはできないけどがんばるよ。
- ちと疑問に思ったんですが、一つのリポジトリにたいして
複数のプロジェクトをIMPORTしてもいいんですか?
それともプロジェクトごとにリポジトリを作るの?
間抜けすぎる質問らしく解答を見つけられない...
- >>189
別に問題ないのではないか。
#なにが問題なのかわからん・・・。
- >>190
即レスありがとう。
疑問氷解。
>#なにが問題なのかわからん・・・。
反省。
- >>189
俺も全く同じことでつまずいた。
>>188にあるサイトにそこらへんのことが少し書いてありますよ。
- >>188
重ね重ねありがとうございます。
読んでて分からんところは今に分かるだろうと、
思いっきり飛ばし読みしてます。
ついでにCVSググってて、こんなん見つけました。
ttp://www.sente.ch/software/cvl/
CVL is a graphical user interface to CVS most often used commands.
以上、Cocoaちっくな話題でなくすんませんでした。
- terminalでCVSROOT(とCVS_RSH)を設定してから、
cvs loginして
openでPBを蹴ってやればリモートCVSも使えるよ。
ssh使ってる場合はパスフレーズ無しにしないとだめだけど。
- ProjectBuilderって'\'(円記号)の表示できなくない?
C言語の勉強をしてみよう!と思って教本買ってきたんだけど
いきなりつまづいてしまった。
#include<stdio.h>
int main()
{
printf("\\");
return 0;
}
だと、\←バックスラッシュがぽつんと表示される。
- >>196
\と¥の関係について
もうちょっと勉強しよう!
というかなんで\でなくて¥でないと
ダメなんですか?
- プロジェクトビルダーでコード入れてるだけでやたらと落ちまくる
人ってどれくらいいるのか? オレは作業できんくらい落ちまくる。
一文字入れて落ち、一行入れたと思ったら落ち、改行できたと思ったら
落ちる。騙し騙しやってるけど、みなさんもそんな感じですか?
- >>197
>プロジェクトビルダーでコード入れてるだけでやたらと落ちまくる
>人ってどれくらいいるのか?
>>127をよく読もう。
- >>198は
小春日和のような人
- 200げっちゅ
- Project BuilderからできるCVS操作って限られてるなぁ。
( ひ と り ご と だ す )
- おいっ!
いまフジテレビでcocoa特集やってるぞ!見れ見れ!
- 2の煽りが消されてんじゃん。ワラタのに。
- >>202
分かってはいてもちょっと見ちゃったよ。(w
- 鶴薗さんフレーム使うの止めて下さい。
- 『Cocoaはさっぱり!』よ永遠に。
age
そういえばCocoa/JavaでFrameworkを作りたいんですけど
headerとかが必要らしいけどどうすればいいのかなぁ?
自分用にカスタムビューをいっぱい作ってフレームワークにしたら
便利だと思ったんですけど…。
- テキストエディタを半透明にすることができない。
黒背景&半透明のターミナルが気に入っているので同じようなものを作ろうと思ったんだが、
NSTextViewのAtributesからBackgroundのopacityをいじっても透過するようにならない。
下地のNSeWindowにはカラーをいじる項目はないし、どうしたらいいのだろう・・・
- >>207
とりあえずNSWIndowを透明にするなら
window.setBackground( NSColor.clearColor() );
window.setOpeque( false );
setHasShadow( true );
でいける。(Javaでごめん、何となく分かるでしょう
ちょっと時間がなくて半透明まで書けない。
ごめんよ、でももし参考になれば。。。
- あれ?2重書き込み?
重ね重ね、ごめん。
- >>208
ありが㌧。
具体的にはNSwindowのクラスをインスタンス化して
アウトレットをNSWindowに接続、
で、呪文を唱えると言うことなのだろうか。。
昼間はもう時間がないので今夜試してみます。
- >>210
NSWindowをサブクラス化。
setBackground、setOpequeをオーバーライド。
IB
クラスのヘッダファイルを読み込み。
ウインドウのカスタムクラスを変える。
- (^^)
- >>210
がんばって!
>>211が言うようにサブクラス化した方が吉!
- とりあえずこんな感じで書いてみた。(JavaはサパーリなのでObj-C)
#import "MyWindow.h"
@implementation MyWindow
- setBackgroundColor
{
[self setBackgroundColor:[NSColor clearColor]];
return self;
}
- setOpaque
{
[self setOpaque:FALSE];
return self;
}
@end
MyWindowはNSWindowのサブクラス。MyWindow.hは何も変更なし。
で、とりあえずコンパイルは通るがもちろん透明にはならない。
どこかでwindowを初期化しないといけないとは思うのだが
initWithContentRect:styleMask:backing:defer: はドキュメント読んでみてもよく分からない・・・
-
∧||∧
( ⌒ ヽ
∪ ノ
U U
- やっとできた。awakeFromNibを使った。
#import "MyWindow.h"
@implementation MyWindow
-(void)awakeFromNib
{
[self setBackgroundColor:[NSColor clearColor]];
[self setOpaque:FALSE];
}
@end
こんな感じ。いろいろ教えてくれてどうもありがとう。
ようやく眠れる・・・
- 定期あげ
- NSStringに格納された
/Users/hoge/Desktop/
というUNIX式のパスを
Maciintosh HD:Users:hoge:Desktop:
というMac式のパスに変換する方法は無いものでしょうか。
ざっと調べた限りでは該当する機能がCocoaのクラスに見つからなかったので、
何か良い方法をご存じの方はご教示願えませんでしょうか。
- ふつうに一文字ずつ調べてコロンに変換すればいいだけでは?
- >>219
その方法も考えたのですが、
起動しているディスクの名前を調べる方法が分からないので
断念してしまいました。
- あ、NSStringに格納されているのは
/Users/hoge/Desktop/というパスの決め打ちではなく、
実際にはどんなパスなのか不確定な場合です。
- 起動ディスクの名前を調べる方法?
AppleScriptで「StartupDisk」を使って名前を調べるってのはダメかな。
そこだけAppleScriptでテキストファイルに書き出すように組んで
起動時にいったん呼び出すとか、できないかな。
- その後色々と自分で考えてみた結果、
-(NSString*)getColonDelimitedPath:(NSString*)filename{
FSRef fRef;
FSRef pRef;
OSErr err;
HFSUniStr255 name;
NSMutableArray *nameArray=[NSMutableArray array];
BOOL isDirectory;
if (![[NSFileManager defaultManager] fileExistsAtPath:filename isDirectory:&isDirectory]) return @"";
err=FSPathMakeRef([filename UTF8String],&fRef,NULL);
if (err == noErr) {
while (1) {
err=FSGetCatalogInfo(&fRef,kFSCatInfoNone,NULL,&name,NULL,&pRef);
if (err != noErr) break;
[nameArray insertObject:[NSString stringWithCharacters:(name.unicode) length:(name.length)] atIndex:0];
fRef = pRef;
}
}
if ([nameArray count] > 1) [nameArray removeObjectAtIndex:0];
if (isDirectory) [nameArray addObject:@""];
return [nameArray componentsJoinedByString:@":"];
}
というメソッドを組んでUNIX流のパスMac流のパスに変換することができました。
Carbonは全く触ったことがないので、もっとスマートな方法があるかもしれませんが、
とりあえず解決した方法を報告しておきます。
長文申し訳ありません。
- そういえばUNIX流パスからFSSpecへ変換するコードを
QuickTimeのサンプルの一部としてどこかで見た記憶がある
Cocoaで取得したパスをFSSpecしか受付けないQuickTimeに
渡す方法として紹介されていた気がする
FSSpecが得られたらFSMakeFSSpecを繰り返せばいいんだけど
スマートじゃないやり方だなあ
それに長いファイル名だと名前の末尾がおかしくなっちゃうかもね
- HTMLの読み込み方を説明してるページって無いでしょうか。
- #include <stdio.h>
main() { FILE *fp = fopen("index.html", "r"); }
- >>225
質問の意味が若干曖昧なのですが、
「サーバに接続してデータをダウンロードしたい」という意味であれば、
NSURL *url=[NSURL URLWithString:@"http://www.apple.co.jp/index.html"];
NSData *data=[url resourceDataUsingCache:NO];
といった感じで実現できます。
- HTMLの読み込み方って言ってるんだから
ttp://www.midi.co.jp/objc0.html
こんなんじゃないのか?
これだと読み込めないけど
- ttp://www.omnigroup.com/developer/sourcecode/
OmniHTMLはどうよ。
- NSTextView で OR 検索はできないでしょうか?
文中に wordA か wordB があったら
そこだけ別の処理をしたいです。
- >>230
ちょっと調べてないから分からないけど多分
自分で組むしか無いんじゃない。
perlで組めば難しくはないよね。
- >>230
Cocoaの標準ではできないっぽいけど、
>>229のURLにあるOmniFoundation フレームワークには
正規表現ライブラリがあるみたいだから、
それを試してみるというのはどうでしょう。
- 過去ログを参考に、テーブルビューの項目をdeleteキーで削除できるようにしようと考えています。
前に、NSResponderのサブクラスを作って、tableViewに
[tableView setNextResponder:myResponder]
を送ってmyResponderでキーイベントを処理すればいい、っていう事が書いてあったんでこの通りにしました。
(ついでに[MyResponder setNextResponder:[tableView superview]も入れました。不要ですか?)
その結果、キーイベントを拾えるようにはなったのですが、このサブクラス中では[tableView selectedRow]の結果はいつも0しか返ってきません。おかしいなーと思い、試験的に
[tableView selectRow:3]
した直後に-selectedRowを送ってもやはり0が返ってきます。
何かやり忘れていることがあるのでしょうか。知恵をお貸し下さい..。
- >>233
tableViewがnilなんじゃない?
- >>233
tableViewがnilなんじゃない?
- >>233
メニューにDeleteっていれてEquivを\Dにするのはダメ?
簡単だけど。。
- >>234
ありがとうございます!確かにtableViewがnil(0x0)になってました。
さて・・なんでnilになってるんだろう・・。
tableViewからIBでMyResponderにつないでるのになー・・・なんかすごい初歩的な所で間違ってそうだな・・。
>>236
なるほど、そういうのもアリですね。確かに簡単!
できればdelキーだけで消去できた方が自然な操作かなーと思いますが、どうしても無理だった時に使わせていただきます。
- Cocoaといえば
ケントデリカット
- 二重カキコスマヌ
>>233
tableViewがスペルミスってるか、
IBでMyResponderインスタンスを作ってるのに自分でallocしてるとか。
ぬるぽExceptionがでないことの弊害か。
- >>233氏
別にメニューにこだわってるわけじゃないけど、メニューにキー登録すれば
delキーでもメニューでも同じ動作が出来るから俺は好き。
いや、アプリの特性にもよるし、今求められてる答えじゃないから気に
しないでおくんなまし。
- これからcocoaをやろうかと思います。
参考書を買おうと思うんですが、中村本とアーロンヒレガスとではどっちがいいですか?
- >>241
個人的にヒレガス本を勧めます。こっちのほうがきちんと解説していると思います。
ただこれを読むには最低限のC言語とオブジェクト指向の知識が必要です。ご注意を。
- >>231,232
どうもありがとう!
Omni のライブラリを調べてみます。
- >>242
ありがとうございました。
C言語なら分かりますがオブジェクト指向ってのは分かりませんが、ヒレガスにします。
- >>239
ありがとう、答えは後者でした。
実はオブジェクト指向なるものが分かってない可能性が高いようで・・・(汗)
ばっちり動作しました。Cocoaって面白いですね~。
後に続く人のために、今回やった方法を書いときます。
(1)メインのコントローラーオブジェクト(mainController)のアウトレットにIBでインスタンス化したmyResponderを接続
(2)mainControllerの - awakeFromNibで
[tableView setNextResponder:myResponder]と
[myResponder setNextResponder:[tableView superview]]
を送る。
(3)myResponderの - keyDownメソッドで、押されたキーのキーコードを調べて、Delキーだったら[mainController deleteItemOfTableView(メソッド名は適当)]を送る。
(4) ( ゚Д゚)ウマー
かなり洗練されてなさそうだけど、とりあえず動いてるのでOKかな。
- >>245
おめでと!
- Cocoaと直接関係ないかもしれないけど,MacOS Xってコマンドラインツールって
結構あるじゃないですか.UNIXの.で,その中の対話形式になっているツールを
CocoaのGUIで制御したいのですが,(フロントエンドですね)入力待ち状態になっ
ているコマンドラインツールに,どうやってGUIからコマンドを入力するんですか?
例えばrm -iってやると,yesかnoを聞いてきますよね.その時yesなりnoなりを
どうやってrmに渡したら良いのか...
(rm -fしろというのはなしでおねがいします.あくまで例なので.)
- >>247
パイプを使って標準入力に流し込みます。
CocoaはやっぱりのPerlスクリプトを実行するが参考になると思います。
waitUntilExitを使わず、performSelector:afterDelay:;なんかをつかって
標準出力をパイプを使って読み込んで、
必要であればパイプを使って標準入力に書き込む
という手順でしょう。
- >>247
> (rm -fしろというのはなしでおねがいします.あくまで例なので.)
rm -i hoge | yes :)
- >>248
????????????.??????????????,Perl?????
???????????????.???????????????
???????,????????rm -i????,???ftp??????
??,??????????????????,????????.
fp = popen("rm -i hoge.txt", "w" );
fwrite( fp, "yes" );
?????C???????,???????????????????.
>>249
????????????.
???,???yes?rm -i??????????????????,
??????????...(???????????)
- すいません.Safariバケです.
>>248
レスありがとうございます.紹介していただいたサンプルは,Perlスクリプト
が常に標準入力待ち状態ですよね.それだとたしかにうまくパイプで
いけそうですが,先にしめしましたrm -iだったり,例えばftpだったりする
場合,いつもいつも入力待ち状態ではないので,うまくいきません.
fp = popen("rm -i hoge.txt", "w" );
fwrite( fp, "yes" );
ベタベタなCですみませんが,このようなかんじのコードを書いています.
>>249
レスありがとうございます.
えーと,それはyesにrm -iの標準出力を流し込もうとしているので,
ちがうと思うのですが...(実際できませんでしたし)
- >>251
fwrite( fp, "yes" );
これはまちがいですね.
fprintf( fp, "yes" );
でした.すみません
- ほっしゅ
- >>251
-(void)test:(id)sender {
NSTask*task = [[NSTask alloc] init];
NSPipe*output = [NSPipe pipe];
NSPipe*input = [NSPipe pipe];
NSString*rmPath = @"/bin/rm";
NSString*arg1 = @"-ir";
NSString*arg2 = @"/Users/hoge/hoge";
[task setStandardError:input];
[task setStandardInput:output];
[task setLaunchPath:rmPath];
[task setArguments:[NSArray arrayWithObjects:arg1, arg2, nil]];
[task launch];
while(YES){
NSData*inData = [[input fileHandleForReading] availableData];
if( inData && [inData length] ) {
NSData*outData = [NSData dataWithBytes:"yes\n" length:4];
[[output fileHandleForWriting] writeData:outData];
} else {
break;
}
}
}
????
% pwd
/Users/hoge
% mkdir hoge;touch hoge/hoge;touch hoge/foo;touch hoge/bar; ls hoge
bar foo hoge
%???????
% ls hoge
ls: hoge: No such file or directory
- 化けたが伝えたいことは分かるだろう。。。
- 質問です。
NSArrayのリファレンスを読んでいたのですが、- indexOfObject:メソッドは
配列中の要素にisEqual:を送る事で「引き数の物と一致しているか」を判断する、とありました。
また、- indexOfObjectIdenticalTo:メソッドは、id値を頼りに一致しているかどうかの判定を行う、
とありました。
ところで、荻原本によるとisEqual:は「同じポインタを持つ物は等しいと見なす」とあります。
となると、結局上記の2つのメソッド- indexOfObject:と- indexOfObjectIdenticalTo:は、両方とも
オブジェクトへのポインタを頼りに「一致しているかどうかの判定」を行っているように見えます。
両者のメソッドは、一体何が違うのでしょうか?
- Obj-Cはわからないから詳しくは分からないけど
>isEqual:は「同じポインタを持つ物は等しいと見なす」
っていうのがなんか違う気がする。
isEqualってメソッドなんだよね(それさえもわからない。。)。
だからじぶんでisEqualを実装すれば実際には違うオブジェクト
(ポインタの異なるオブジェクト)でも同じとみなすことが出来る。
って事じゃない?
ごめん、説明下手で。
- オブジェクトが同じ値であることと同じ物であることは違う。
オブジェクト指向プログラミングの本には必ず書かれている
基本概念なので調べてみましょう。
- 「原則として」と書いてあるじゃん
- みなさんのレスを参考にいろいろ考えてみて、以下のようなコードで実験してみました。
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSNumber *testNumber;
NSMutableArray *testArray = [NSMutableArray arrayWithCapacity:1];
[testArray addObject:[NSNumber numberWithInt:3] ];
testNumber = [NSNumber numberWithInt:3];
NSLog(@"indexOfObject: result...%d\n",[testArray indexOfObject:testNumber]);
NSLog(@"indexOfObjectIdenticalTo: result...%x\n",[testArray indexOfObjectIdenticalTo:testNumber]);
[pool release];
return 0;
}
実行結果は以下のようになりました。
2003-02-08 06:12:55.958 arraytest[885] indexOfObject: result...0
2003-02-08 06:12:55.960 arraytest[885] indexOfObjectIdenticalTo: result...7fffffff
isEqual:を使ったindexOfObjext:では0番目の要素がマッチしているにも関わらず、
ポインタを参照しているindexOfObjectIdenticalTo:ではNSNotFoundが返りました。
みなさんのおっしゃる通り、isEqual:は単にポインタを参照しているだけでは無い事が解りました。
ヒントを下さって、どうもありがとうございました。
- ところで、手元にあるヒレガス本を読み返してみると、isEqual:は
やっぱり「ポインタが同じである場合」と書いてありました。
が、「例えばNSStringは(中略)このメソッドをオーバーライドしている」とありました。
上記の実験で使ったNSNumberも、どうやら同じようにオーバーライドしていたようです。
当初私もisEqual:に変更を加えているのでは、と思ったのですが、ところが、
NSStringやNSNumber(NSValue)のヘッダを見てみても、オーバーライドしたとは
明示されていませんでした。これが私が混乱した元になってしまったようです。
お騒がせしてすみませんでした。
- isEqual は、Cocoaのオブジェクト指向プログラミングの世界観を
理解する上で重要なので、おざなりな理解で済ませない方がいいよ。
素直にNSObjectのリファレンスを読みなさい。
- (BOOL)isEqual:(id)anObject
Returns YES if the receiver and anObject are equal, NO
otherwise. This method defines what it means for an instance
to be equal. For example, a container object might define
two containers as equal if their corresponding objects all
respond YES to an isEqual: request. See the NSData,
NSDictionary, NSArray, and NSString class specifications for
examples of the use of this method.
If two objects are equal, they must have the same hash
value. This last point is particularly important if you
define isEqual: in a subclass and intend to put instances of
that subclass into a collection. Make sure you also define
hash in your subclass.
- >>254
コードまで書いていただいてありがとうございます.
そうか,パイプを入出力用に2つ作らないといけないわけですね.
そして入力を検知するまでループで待ち(ここがポイントかな?),
それから出力用のパイプにデータを流し込む.
ちょっと今は試せないのですが,分かりました.
しかし,世の中のコマンドラインツールのフロントエンドって,
みんなこういうことしてるんですかね.結構大変そう.
- オンラインのURLをそのままHTML表示したりはできますかね?
- >>263
このループはただ削除対象ファイルがなくなるまで回してるだけです。
実際にこのような処理をして、コマンドラインツールからの出力が遅れると
GUIの処理が全くされないので虹が回りはじめます。
で、performSelector:afterDelay:;とかを使えばどうですかということです。
-(void)hoge {
if( タスクからの出力がある ) {
出力にあわせて処理
}
if( まだ処理が残っている) {
[self performSelector:_cmd afterDelay:0.0];
}
}
みたいなことをやればGUIに処理が回りますので虹は回りません。
もちろんスレッドを使ってもいいですけど。
- F1 キーを押したときに、
コンテキストメニューを表示させるにはどうしたらいいですか?
sendEvent で F1 キーを捕まえるところまではできています。
でも、メニューの生成・表示方法がわかりません。
- [view menu];
ってやるとか?
なるかどうかは知らん。
- >>266
ttp://infoatmackers.jp/cocoa/programming/programming19.html
でコンテキストメニューについて書かれてるみたいだね
- >>268
それっぽいのができるかも! ありがとー。
- >>262
確かにその通りです。が、今まで訳に自信が無く、敬遠していました。
英和辞典と格闘しながら読んでみて、自分なりに実験を繰り返していましたが、
"isEqual:は単にプロトコルとして提供されているだけで、判定方法は各クラスが自由に設定できる"
と結論するに至りました。
int型変数testValueを持つ自前クラスTestClassを用意し、
[testArray addObject:[[TestClass alloc] initWithValue:3]];
obj = [[TestClass alloc] initWithValue:3];
[testArray addObject:obj];
NSLog(@"indexOfObject: result...%d\n",[testArray indexOfObject:obj]);
NSLog(@"indexOfObjectIdenticalTo: result...%d\n",[testArray indexOfObjectIdenticalTo:obj]);
とした所、結果は
indexOfObject: result...1
indexOfObjectIdenticalTo: result...1
でした(NSNumerを使った>>260では0番目がヒットしたのに!)。ここで、isEqual:を次のように定義した所、
-(BOOL)isEqual:(id)anObject
{
if([anObject isMemberOfClass:[self class]])
if([self testValue] == [anObject testValue])
return YES;
return NO;
}
結果は以下のようになりました。
indexOfObject: result...0
indexOfObjectIdenticalTo: result...1
>>260で使ったNSNumberも、おそらくこのような拡張を行っていたんですね。
勉強になりました
- >>270
なんとなく、微妙な理解の仕方のような気がする・・・
"isEqual:は単にプロトコルとして提供されているだけで、判定方法は各クラスが自由に設定できる"
という文章を読むと、単に実装の仕組みを理解しただけで、意味を理解できていないような気がします。
なので、一応説明しておきます。既に理解してたらスマソ。
isEqualは、実装上の仕組みうんぬんではなくて、
もう少し論理的なレベルで考えないと、きちんと理解することができません。
Objective-Cに限らず、Javaでもなんでもオブジェクト指向言語では、
「オブジェクトが同一」ということと、「オブジェクトの値が同一」ということを
はっきりと区別しています。
Objective-Cの場合、前者は、ポインタの比較で判定します。
後者は、isEqualを使って判定します。
例えば、同じ"abc"という文字列を表す別々のNSStringのインスタンスA,Bがあった場合、
前者で比較した場合はNOですが、後者はYESです。NSNumberもしかり。
しかし、クラスによっては、「オブジェクトが同一」の場合に「オブジェクトの値が同一」と
みなすのが適当なものもあります。
例えば、NSObjectなんかはそう。NSObjectは比較すべき値をもっていないから、
NSObjectのインスタンスa,bが同じ値である、というためには、
aとbが同一のオブジェクトかどうかを判定するしかないのです。
つまり、この場合は「オブジェクトが同一」の判定と「オブジェクトの値が同一」の判定は、
*たまたま*同じ結果になるのです。
実装だけをみれば同じことをしていても、この2つの意味はきっちり分けて
考えなければいけません。
NSArrayのindexOfObjectIdenticalToは引数と「オブジェクトが同一」のもののindexを取得し、
indexOfObjectは、引数と「オブジェクトの値が同一」のもののindexを取得します。
- 関係ないけど、(NSObjectみたいな)ベースクラスのオブジェクト比較メソッドは
「常に真を返す」という実装である方が論理的に整合性が取れる、つう話が
JavaHouseで出ていたな。
- >>272
その話、理由を聞かないとなんとも言えないが、わけのわかってない
人が言っただけのこと?
それともJavaHouseで複数の識者に支持されるような説得力のある話?
URLキボン
- 271ニハゲドウ
世界観を知った上で、現象を見て理解を確認するのはいいけど、
現象から理解しようとしすぎない方がいい。
とくに基本哲学的なところは。。。
- >>272
それ、俺も気になる。
もしその話なかで根拠になるものが書いてあったら教えてほしいです。。
もしくはURLが。。
- >>270
ああ、おかげでやっとisEqual:のリファレンスにあった
"This method defines what it means for an instance to be equal."の現す真意が理解できました。
確かにおっしゃる通りで、各クラスとも「同一と判定してほしい条件」は異なるはずで、時にはそれが
ポインタであったり(同じメモリ空間に格納された『同じもの』)、時にはNSStringやNSNumberに
代表されるような「表現している値」(あくまで『たまたま値が等しいだけ』)の場合がありますものね。
(しかも、状況によってはその都度判定条件を変える必要に迫られる可能性もあるでしょうし)。
それに「ポインタの比較 == 値の比較」としか表現できない状況も確かにありそうです。
//メソッドしか持たないオブジェクトの場合、こうするしかありませんよね。
で、isEqual:というのは「このクラスではこういう条件や状況で『同じ』と判定して欲しいなあ」を
定義するメソッドである、という訳なのですね。御丁寧にどうもありがとうございました。
- >>273
ひろみちゅが言ったんだよ。おれは納得した。
http://java-house.jp/ml/archive/j-h-b/046630.html#body
http://java-house.jp/ml/archive/j-h-b/047452.html#body
- java bridgeがうまく動きません。(obj-cからjavaを使いたい。)
http://developer.apple.com/techpubs/macosx/Cocoa/Legacy/JavaBridge/JavaBridge.3.html
HelloWorld.javaに
class HelloWorld {
int i ;
void HelloWorld(int e){ this.i = i ; }
int hoge(){ return this.i ; }
}
として、main.mに
#import <Cocoa/Cocoa.h>
#import <stdio.h>
int main(int argc, const char *argv[])
{
id e = [[NSClassFromString(@"java.util.HelloWorld") alloc] init : 5] ;
printf("%d",[e hoge]) ;
return 0 ;
}
としたんですがうまくいきません。ご教授お願いいたします。
- void HelloWorld(int e){ this.i = i ; }
↓
void HelloWorld(int e){ this.i = e ; }
でした。すみません。
- Obj-Cはわからんけど
>id e = [[NSClassFromString(@"java.util.HelloWorld") alloc] init : 5] ;
この行はおかしくない?
HelloWorldはjava.utilパッケージに入ってなよね。
予想だと[ java.util.HelloWorld >> HelloWorld ]じゃないかな?
試してみてよ。
- HelloWorldにかえてみたんですがやっぱりうまくいきません。
#import <Cocoa/Cocoa.h>
#import <stdio.h>
#import <Foundation/Foundation.h>
int main(int argc, const char *argv[])
{
Class javaClass;
NSString* javaClassName;
id e ;
javaClassName = @"HelloWorld";
if (!(javaClass = NSClassFromString(javaClassName))) {
[NSException raise:NSGenericException format:@"Failed to load class'%@'", javaClassName]; }
e = [[javaClass alloc] init : 5] ;
printf("%d",[e hoge]) ;
return 0;
}
として実行すると
<NSGenericException> Failed to load class'HelloWorld'
HelloWorld はシグナル 5(SIGTRAP)により終了しました。
となり例外処理されてしまいます。
- 使ったことないからよく知らんけど、Java Setup の関数を使うんじゃねーの?
- 協力してあげたいけど前述通りObj-Cは分からない…(ゴメソ
>>282が言う通りJava Setupってのがポイントじゃないかな?
ドキュメントをちょろっと読んでみたんだけど NSJavaClassesFromString てのが
あった。
役に立つかもしれないからJava Setupのドキュメントを読んでごらん。
わかったらやりかた公開してね。
ちなみにそれらしきドキュメントがある。Obj-C使いにとっては当たり前かもしれないが一応手助け代わりに場所だけ教えてあげる
/System/Library/Frameworks/Foundation.framework/Versions/C/Resources/English.lproj/Documentation/Reference/ObjC_classic/Functions/FoundationFunctions.html
ずいぶん奥深くにあるなぁ。
- 日本語は無いのか?
- ところでJavaBridgeって積極的に使って良いの?
TopicsのとこにはLegacyってなってるけど。
かわりにJNIを使うことになると思うんだけど。
どっかにJavaBridgeよりJNIを使えって書いてあったかな?
JNIのほうがめんどくさそうだが。
- >>284
分からない。
パッと見はなさそう。
あったら俺も見たい。
- java bridge (obj-c -> java & java -> obj-c) のサンプルコードを発見しました。
tp://members.blackbox.net/a/programs/
のJava/ObjC-example for Cocoaにあります。
- 必要に応じてJavaReactor.javaの冒頭を変更してださい。
import com.apple.cocoa.foundation.*;
import com.apple.cocoa.application.*;
- 守君参上
- こそ〜り保守中
- 堂々と保守!
- あの・・10.2になってから(もしくはQT6になってからだったかも)NSMovieViewでのMPEG2再生がうまくいかないことないですか?
自作のアプリでNSMovieViewを使ってMpeg2再生してたら1分ほど再生した所で止まる(内部的には再生されているみたいだけど、音声も映像も止まる)ようになっちゃって、解決できません・・・。
ためしにWindowにMovieViewを貼っただけのテストアプリを作ったり、Cocoaはやっぱり!のサンプルアプリを見てみたりしたんですが、やっぱりこれも止まる。
解決できてるよ!という人がいたらご助言願いますー。
- ああ、よく考えたらMPEG2再生できるようになったのはQT6からか。
としたら、止まるようになったのは10.2にしてからだなぁ、きっと。
今さっき、システムの再インストして確認したけどやっぱり止まりました。うちだけじゃないですよね?
- >>292
確かに止まりますねえ。(Cocoaはやっぱり!のMoviePlay2で確認)
- >>292
本当だ、、止まる。
なんでだろ?
- QTPlayerで止まらないのは当然として、RBで作ったらしいカーボンアプリ
「MacMovieTV」
http://www.vector.co.jp/soft/mac/art/se197681.html
でも止まりませんでした。Cocoaだけの不具合なのかな・・。
- >>292
ああ、10.2で止まるのって私だけじゃなかったんだ…。
うちではMP3を再生していても止まってしまいます。
私はしょうがないので「Cocoaはやっぱり! 出張版」を
参考にしてQuickTimeを直接呼び出して対処したんですが、
これだとモーダルダイアログの表示中に再生が一時停止して
しまうんですよね…。
- 細くとも長く生きてほしいから保守に一票
- >>297
QuickTimeを直接呼び出すって言うのは、何をすれば良いんですか?
再生をstartするところだけQuickTimeを使えば良いのでしょうか。
- >再生をstartするところだけQuickTimeを使えば良いのでしょうか。
そういうことです。
実際のコードはこんな感じです。
#import <QuickTime/QuickTime.h>
NSMovie *movie;
Movie qtmovie;
EnterMovies();
movie = [ [ NSMovie alloc ] initWithURL:aURL byReference:YES ];
qtmovie = [ movie QTMovie ];
StartMovie(qtmovie);
- うむむー、StartMovie()で再生開始してみたんですけど、やっぱし止まります・・。
別の問題があるのかなぁ?
- >>301
あ、私は音さえ鳴れば良かったのでNSMovieViewには
MovieをセットせずにStartMovie()を実行してます。
なので、映像も表示させたい場合は他にも処理を
付け加える必要があると思います。
- このスレッド見て2週間前からcocoa勉強始めました
中村本List4-3で出てくる
NSSavePanel *savePanel = [ NSSavePanel savePanel ];
の意味するところですが、右辺(?)のNSSavePanelクラスに
クラスメソッド+savePanelを送った結果、戻り値の
インスタンスが左辺のNSSavePanelクラスのインスタンスである
savePanelとされる、という解釈するんですかね?
- >>303
たぶんそゆこと。
俺、ObjC知らないけど…。
あれ、アスタリスクがつくのってポインタなんだっけ(Cではそうだよね)?
ってか、Cocoa-Javaって制約大きいよなぁ。
勉強しようかなぁ。
時間ないなぁ。
独り言です…
- >>303
NSSavaPanelについては良く知らんけど、
左辺のsavePanelはただの変数名。で、変数名の前のNSSavePanel *ってのは、
「この変数はNSSavePanelクラスのインスタンスを格納するための変数ですよ」という事を
『コンパイラに明示する』ために書いてあるものなんだ。だから、べつに:
id savePanel = [ NSSavePanel savePanel ];
としても特に問題は無いよ。
/*正確には『NSSavaPanelのオブジェクトのポインタを格納するための変数だと明示する』事。*/
/*試しに"NSString *savePanel"としてみよう。コンパイラが文句言うと思う*/
という訳でNSSavePanel *savePanel = [ NSSavePanel savePanel ]; という行は、
「NSSavePanelクラスのインスタンスを格納する予定である変数savePanelを宣言し、
そこに [ NSSavePanel savePanel ] の結果(返り値)を代入して変数を初期化する」って意味になるよ。
結果として、変数savePanelにNSSavePanelのインスタンスが代入されるみたいだね。
- >>304
Javaが解るならObjective-Cなんて楽勝でしょう。
ヒレガス本あたり買ってみては?
- >>306
ん~、やってみようかな?
マックでソフト作るならこれからObj-Cが必須な気もするし。。
ちょっと今はWebアプリの勉強をしなくちゃいけないからその次かな?
とりあえずObj-cを読めるようにはならないとなぁ。
AppleのサンプルもほとんどObj-Cだし。
ちょっとしたら初めて見ますわ。
- >>305
あ、なるほど。「id savePanel =」と考えると見慣れた構文ですね
バッチシ理解できました。Thxです。
クラスからインスタンスの生成、というと
[ MyClass alloc ] init ];
と初期化とセットで考えてしまうのですが、
この場合[ NSSavePanel savePanel ]で生成された
インスタンス(右辺のsavePanel)は生成後自動的に初期化されているですか?
「cocoaはやっぱり」のキッチンタイマーでも
tmKitchen = [ NSTimer scheduledTimerWithTimeInterval: ...... ];
と alloc している部分は見当たらず・・・
ここもしかしてクラス固有の特性を理解していないのかもしれませんが
- ちと今頭の中混乱中なので妙な事書いてたら突っ込んでください(涙
- >>308
インスタンスを生成するクラスメソッドは原則として
初期化とAutoreleaseまでやってくれることになってます。
なので、
[ NSSavePanel savePanel ];
というのは
[ [ [ NSSavePanel alloc ] init ] autorelease ];
と読みかえることが出きます。
- 突然もうしわけないが・・・
前スレが985という半端な数字でおわっているのは?
- >>311
気付いたら落ちちゃったんですよ( ´Д⊂
- >>312
ご説明ありがとう。私超厨房で、dat落ちとか知らなかった。
とてもいいスレです。いま前スレを読んでまして、参加できる
日を楽しみにしてます。
- >>313
既に参加してるじゃないですか?
とてものんびり進行してるのでたまに顔出して下さいな。
- >>310
おお、先の件と2点分かっただけで目の前で霞んでいたものが
晴れてきた気分。多謝、多謝です。
- >>308
同じインスタンスを使い回してたりとか。
>tmKitchen = [ NSTimer scheduledTimerWithTimeInterval: ...... ];
この場合はちょっとちがうかな。
NSTimerはNSRunLoopに登録しないと機能しないんです。
で、上のメソッドを呼ぶとインスタンスを生成させた後、カレントランループに
そのインスタンスを登録して、それを返してくれる。
単純なビルダーパターンみたいなもんですね。
- >インスタンスを生成するクラスメソッドは原則として
>初期化とAutoreleaseまでやってくれることになってます。
というパターンもあれば、ずっと常駐する、あるいは解放する必要がない
ものを返す場合もあります。(たとえば[NSColor redColor]とか)
- あ、こんにちは守護霊です。
今日は保守に参りますた。
- >>317
その辺はsingletonパターンを使っているのでAutoreleaseしているか
常駐しているか意識しなくてもいいようになっているんだろうね
- みんな職業なにさー。プログラマ?
- 大工
- 学生…、そろそろクビだけどね…。
- >>321
マジっすか。凄い家を建てそうですね。
>>322
クビってw。勉強しろよw。
- 初歩的なことだと思うんですが、さっぱりわからないのでおまいら誰か教えてください。
htmlソースからリンクを抜き出そうとした時、
例えば <a HREF="xxx.html"> の部分を探して xxx.html の部分を抜き出したい時、
<a HREF=" や "> を検索しようとすると、@"<a HREF=""、@"">" となってしまってうまくいきませぬ。
" を含む文字列を記述するにはどうしたらいいのでしょうか?
- ?バックスラッシュ+"でできると思う。
- >>325
激しく感謝!!
やっと先に進めます。ありがとう!
- NSOutlineView で、Safari のブックマークみたいに Column に
色をつけたいのだが、どうしたら良いのでしょう?
やはり NSTableView を継承するのが良いのでしょうか?
- "Safari のブックマークみたいに Column に色をつけたい"というのが良く分からないが、
NSOutlineViewの
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item;
あたりがヒントになるかもしれない。
- IrDAを使いたいんですが資料のあるところ知りませんか?
- それらしい情報を見つけたんですけど、ちとよくわからんです。
/dev/cu.IrDA-IrCOMMch-b を読んだり書いたりすればいいのかな?
http://www.omnigroup.com/mailman/archive/macosx-dev/2001-November/020999.html
- ていうかOSXでIrDAてつかえるんか?
- Object-Cでフォルダを作るのってどうしたらいいのですか。
NSFileManagerあたりがクサイと探していますがさっぱり見つかりません。
- http://developer.apple.com/techpubs/macosx/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSFileManager.html#CHDBAFJD
- いや、ごめんなさい。NSFileManagerそのものを探してるわけではなくて。
フォルダの作り方がさっぱり。
- >>334
>>333見れ
- あ、createDirectoryAtPathか。サンクスサンクス。読み逃してた。
http://www.oomori.com/cocoafw/Foundation/NSFileManager/createDirectoryAtPath.html
- あのー、intをNSStringに変換するのってどうすればいいんでしょう?
思いっきり初心者質問で申し訳ナイス
- >>337
[[NSNumber numberWithInt:int]stringValue]
- >>338
即レスありがとう!
- 隠れ保守神
- Object-Cなんですが、
ある作業がちゃんと完了するのを待ってから先へ進ませる、ということはできますか?
たとえば何かの動作中に、作業状況をTextFieldに逐一表示したい場合とか...
- 保守
- すみません、つい最近Cocoaプログラミングに手を出したんですが
FileMergerの使い方がよく分かりません。
◆やったこと
・クラスを作成していくつかアウトレットやアクションを作成
・生成したソースファイルにコードを書いてコンパイル
・その後クラスにアウトレットを追加したのでもう一度関連ファイルを生成
・ここでFileMergerが立ち上がるけどよく分からないのでセーブして終了
・ソースがまっちろに!うわーん
クラスを変更した結果増えた行に関しては(ヘッダファイル)、
問題なく追加されているんですが、新しいほうのファイルにない
行があるファイルは全部消えて置き換わってるんです。
正しいマージの仕方を教えてください。
- >>343
・その後クラスにアウトレットを追加したのでもう一度関連ファイルを生成
・ここでFileMergerが立ち上がるけどよく分からないのでセーブして終了
ここが問題。
一旦生成した Hoge というクラスに Outlet や Action を追加するには、
クラスの Hoge.h と Hoge.m ファイルに IBOutlet や IBAction のコードを書くだけでOK。
そして、その Outlet や Action とコントロール部品を接続するには、
Hoge.h ファイルを Interface Builder の
Classes > Read Hoge.h メニューで読み込んでから接続する。
- 要はインターフェースビルダーから書き出し(クリエイト)すると
まっさらなひな形がプロジェクトビルダーで上書きされるんです
だから今まで書いたコードがまっさらに。
だから逆にプロジェクトビルダーのほうでアウトレット等書き込んでやって
それをインターフェースビルダーに読み込ませてコントロール等と
結線する、と。
どんなコードを追加したらいいかは最初にクリエイトしたひな形で
だいたい想像つくでしょ?
- OS.Xになったことに伴ってCocoaに触りはじめています。
Toolbox の GetKeys のように、キー入力の状態を取得したいのですが、
他にフレームワークを追加するみたいで、行き詰まっています。
どなたかご存じの方がいらっしゃいましたら、ぜひ教えて下さい。
- あぁ、すいません。書き込んだ後すぐにCarbon.frameworkが見つかりました。
- >>344,345
助かりました! それが正しい(?)方法なんですね。
ところでもう一つ凄く初歩的な質問があるんですが…
"nil"ってなんですか? NULLのこと?
Cocoaはやっぱりのwebの例に
NSTimer *tmKitchen= nil;
ってありますけど、意味も分からずにそのまま書いてます。
- >>348
http://www.google.co.jp/search?hl=ja&inlang=ja&ie=Shift_JIS&q=%22nil%22+c%8C%BE%8C%EA&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
- しばらく見ない間にずいぶん初心者にやさしいスレになったな。
- もともとさっぱりな人たちが助け合うスレだから。
- 初心者排除したらこのスレはすぐに落ちちゃいます。
- スレッドについてわかりやすく解説してるところはないですか?
NSThreadは読みましたが、実際どういうものなのかがわかりませぬ。
- javaのスレッド解説サイトとかで感じをつかむとか...
- 自分は荻原 剛志氏の著書で理解できました。<NSThread
- もしかして、javaでDeterminateなNSProgressIndicator
は動かないのだろうか...
- >>354-355
サンクスコ。あちきは中村本の弟子なもんで...
プログラムがはじめてでもわかりやすい本だったけど、
やっぱりその分踏み込みは浅めですね。
荻原本とかもう一冊買おうかなあ(それとも立ち読みか)
- >>357
技術書の立ち読みは個人的には好かんな。
まぁ、知りたいことがすでに絞り込んであるなら立ち読みもありだけど
できるだけ全体を通して理解した方が力にはなるよな。
本はいくら読んでも損はしないぞ。
特に入門本を買った時は間違いなく踏み込んだ本が必要。
説教じみてきたな。。。
スレッドに関しては>>354氏が言うようにjava系の解説を読むと
理解しやすいかも?
ガンバレ
- >>358
いやあ、何かと春は物入りなもんで高い本にはなかなか手が出ないザンスよ。
Cocoaから始めたので未だにJAVAは機械語にしか見えないし...
とりあえずいろいろ実際動かして試してみよかな。
- そう?
Javaも独自の部分を除けばCに似てると思うけど。
- >>359
>いやあ、何かと春は物入りなもんで高い本にはなかなか手が出ないザンスよ。
うんうん、わかるよ。
スレッドに関しては言語に依存しない解説も結構あるから探してみるといいかも。
- 年度末ってソフトのバージョンアップとかがガーッと来ますよね。
スキャナとプリンタ欲しいけどもう金ねえ。
>>360
>>353が現状で何を勉強しているかわからないけど、Cocoaからプログラミングの勉強をはじめたので
どの言語もわけわからんものに見えるのだと思われ。
- 保持しておきたいデータオブジェクトlogData、
その後に追加するnewDataがあるとして
@interface MyController
NSData *logData;
@implementation MyController
- (void)appendLog: (NSData *)newData
{
if (logData)
{
NSMutableData *tempData;
[tempData mutableCopy:logData];
[tempData appendData: newData];
logData = [tempData copy]; //.........(1)
} else {
logData = newData;//..................(2)
}
}
(1)と(2)の部分でその前に
[logData autorelease];
しておかないとメモリリークしますか?
それと(2)は
logData = [newData copy];
としておかないとlogDataの値って保持されないですかね?
- あら、でも自分でallocしているわけじゃないのでreleaseする必要は
ないのかな....?
(1)と(2)、それぞれ前と後じゃ同じlogDataでも別物ですよね?
このメソッド繰り返すとワサワサメモリ使っていっちゃうんでしょうか?
- >>363
logDataが有効なオブジェクトである場合:
まず[tempData mutableCopy:logData];はtempData = [logData mutableCopy];だと思うんだが。
mutableCopyとかcopyはautoreleaseされてないはず。よってtempData変数が破棄される前に参照するオブジェクトを解放するか、保持(ownerを設定)しなければならない。
次のlogData = [tempData copy];では今まで指していたlogDataをtempDataのコピーに変更するので、元のオブジェクトがリークする。よって(1)のまえにlogDataをreleaseかautoreleaseする。
あとtempDataはすでに元のlogDataとは別のオブジェクトなのでわざわざcopyするのは無駄だと思うが。
logDataがnilだった場合:
if (logData)により、(2)が実行される。
メソッド実行後、newDataのオブジェクトをlogDataが指すが、newDataが他でreleaseされたらlogDataの指すオブジェクトは無効になるのでretainが必要。
変数とオブジェクトのインスタンスを分けて考えることと、
オブジェクトオーナーシップを理解することなどが必要かと。
- 速レスありがとうございます
仰る通り今オブジェクトオーナーシップの項でつまづいてまして。
レス見ながら3時間考えてしまいますた
>まず[tempData mutableCopy:logData];は
>tempData = [logData mutableCopy];だと思うんだが
すません、単純にミステイクです。
>mutableCopyとかcopyはautoreleaseされてないはず。よってtempData変数が破棄される
>前に参照するオブジェクトを解放するか、保持(ownerを設定)しなければならない
この部分がちょとわからないす...でも調べているうちに別の疑問も解決したりしてちと前進。
もう少し考えてみます。
あとリークの話ですが、例えば
NSString* str = @"abc";
str = [ str stringByAppendingString : @"def"];
この場合は最初の文字列定数に対するstrといった場合は
相手が定数、ってことでリリースする必要はないですか?
>あとtempDataはすでに元のlogDataとは別のオブジェクトなので
>わざわざcopyするのは無駄だと思うが。
tempDataを得た時点で処理が終わらず、次々得られたnewDataを末尾に結合し
常にlogData変数に溜め込んで最後に「連続したデータとして」吐き出す、という考えです。
- 本家 Cocoaはやっぱり が404...
本買って読めって事?
- site-aroも調整中?みたいだけど。
http://www.big.or.jp/~crane/
- >>366
オーナーシップの話題はさんざん既出なので資料はたくさんあると思う。
>NSString* str = @"abc";
>str = [ str stringByAppendingString : @"def"];
strは定数なのでリリースしない。
リリースする必要がある(=インスタンスのオーナーである)のは基本的にalloc,copyした場合とか、retainした場合。
>tempDataを得た時点で処理が終わらず、次々得られたnewDataを末尾に結合し
>常にlogData変数に溜め込んで最後に「連続したデータとして」吐き出す、という考えです。
よくわかないっす。並列に実行するの?
っつーかlogDataをNSMutableDataにして、
-(id)init {
[super init];
logData = [[NSMutableData alloc] init];
return self;
}
- (void)appendLog:(NSData *)newData {
[logData appendData:newData];
}
とかでいいんじゃないかな?
- >>369
>リリースする必要がある(=インスタンスのオーナーである)のは
>基本的にalloc,copyした場合とか、retainした場合。
allocやretainと憶えていたのでこれまた前進です。
なんか断片的にジグソーバズルが埋まっていくような。
>よくわかないっす。並列に実行するの?
あ、今回はアルゴリズム的な話ではなく、Cocoaの作法として
考えて下さって結構でし。
ども、ありがとうございました。
- ちょっと分かりにくい質問なんですけど、例えばDockの大きさは
システム環境設定のDockの設定のところで動的にリアルタイムで変化させれますよね?
あれってどうやってるんでしょうか?
Apple Eventでもなさそうだし、ああいう風に他のアプリを自分のアプリから
コントロールする場合、どういう手法を採るんでしょうか?
- 米Appleは、12月1日(現地時間)に現在のSwitchキャンペーンの後続と
なる「Real Switch」キャンペーンを開始した。「Switch」キャンペーンとは、
他OSからMacintoshへの変更を促すもの。転向したユーザーを「Switcher」
と呼ぶが、どうも、「偽Switcher」が多く含まれていた模様。このため、
Appleは、Switcherの中から本当のSuitcherを見つけるキャンペーンに
切り替えたようだ。
ttp://pc.watch.impress.co.jp/docs/2003/0401/uocchi/rs.htm
- PithってSafariと完璧に連動してるけど、あれってどうやってるんだろ。
どこの何を読んでるの?
- AppleScriptでアイドルハンドラで数秒ごとにウインドウ監視してればできそう。
- この気違いドザにCocoaを見せつけてやりたい
http://www.geocities.co.jp/Milkyway-Lynx/4133/article/art_7.html
- >>375
いきなり
> 世界で最も美しいGUI、"Motif"
とは驚きだ。
…つーかそいつ、犬糞erじゃないの?
- >行数にして僅かに66行(空行含む)。
>Windowsで同じ事をすると倍近くのコードを書かねばなりません。
>MacintoshでCarbonやToolBoxを使った日にはさらに倍以上のコードを書くハメになります。
ナニモ シラナイノニ エラソウナコトイウナ!
- Cocoaだったら20行でいけるわな。
- いや、あれだけならInterface builderで(ry
というか行数どうのこうのより、CocoaのCの字も知らないのに
バカにしているのが許せん。
- >>375
Mac批判してるだけでドザって思い込むのはやめたほうがいいぞ。
どう見てもドザじゃないし・・・。
OSXも使っててそれでもMotifがいいって言ってるんだから
価値観の合わない人とは関わらないのが吉。
- ま、知らない方が彼にとっては幸せだよ。
微笑しながら見守ってあげましょう。
- て、いうか、例としてあげているCのコード、ダサ過ぎ。
BeOSのアプリケーションのソースを見せてやりたい。(←をいっ!
- Cocoaはやっぱり
ttp://www.big.or.jp/~crane/cocoa/
落ちてますか?404 Not Found なんだけど…
- マッカーに過ぎたる物は余りないが、敢えて言うなら
Interface Builderだな。これはいい。
- >>375
ワラタ
かなり電波入ってるなぁw
でも、彼の頁のファイルダイアログ批評には激しく同意。
- しかし、 Interface Builderみたいなものって、CUIの世界からGUIの世界に移ったとき、
開発環境としていちばんはじめに用意されるべき物だったような気がするんだが。
- >>385
電波にしてはまだまだ弱い気がするけど、ただ若いだけというか。
ていうかファイルダイアログってリサイズできたのか。
- >>385
電波っていうか、たんに自分の好きなものをマンセーしてるだけだな・・・
モーオタのファンサイトと同レベルかな。
cocoaの保存ダイアログのカラム表示は好きだけどなあ、
でもイマイチ整頓しきれていない感はあるな
- 最近使った項目とかを全部一つのプルダウンに押し込んだのはどうだろう?
それと、上の階層のフォルダに上がりにくくなった。
スレ違いだけど。
- プルダウンは、ブラウザのブックマークを意識してるのかも。
ブラウザのブックマークは一つのプルダウンの中に入ってるからね。
慣れてないと、わかりにくい。
上の階層に上がるのは、カラム表示なら下のハンドルを掴んでうごかすだけのような。
- いつになく盛り上がってますな。
- Cocoaから大分離れてきたが……
たしかにOS.9からXに移行した時
一番使いにくかったのがファイルダイアログかな。(iBookだったし)
最近はPowerBook買って1280*854までスクリーンが広くなったから
そんなに苦じゃなくなったけど。
- >>383
ttp://www.big.or.jp/~crane/
によると、しばらくblogします、だってさ。
- IEじゃないと見れないな。
- インラインフレーム使ってる
- >>394
気付かずCaminoでみて何もないのかと思った。
- Cocoaなひとなのに、SafariやCaminoで見られないサイトを作るのは何かの嫌がらせ?
- tp://ch.kitaguni.tv/u/120/
あんま Cocoa と Blog は関係無さげ。
MovableType 流行ってるね。tDiary とかWiki も。
- Blogがじゃなくて、デベロッパな人がIE以外で自分のページを確認してないってのはどうなのよと。
- >>399
Webデザイナーだったら激しく問い詰めてやるところだが
デベロッパだったら別にかまわないんじゃないの?
といいつつ400ゲット
- 別にWindowsのデベロッパだったらわからなくもないが、Cocoaの書籍を書いているのにSafariやCaminoで読めないサイトを作るのは不思議だなぁーと。
なんか嫌な事でも有ったのか?
- Safariは未完成かつバグ持ちだから、
Safariに合わせて作るわけにもいかんでしょ。
- いや。Safariにあわせてじゃなくて、IEだろうがNetscapeだろうがOperaだろうがw3mだろうがって意味。
SafariとCaminoだと、blogの存在すらわかんないじゃん。
- だからそんなこと知らんってばよ。
ちゃんとHTMLにさえ準拠してないブラウザが悪い。
- >>404
君はstrictじゃないね。
- ソースを見たところ、HTMLの方が不完全だったけど…
実験段階のblogらしいし、あんまり拘ってないのかな。
たぶんiframeのurl属性を""でくくってないから、
一部のブラウザで表示されないんじゃないんかなぁ?
- と思ったけど、表示されない原因はまた違うみたい。
なんで表示されないんだろう。
- 表示されない理由
ttp://openlab.ring.gr.jp/k16/htmllint/htmllint.cgi?ViewSource=on;URL=http://www.big.or.jp/~crane/close.html
- tableの中のiframeの高さ(height=95%)が極端に小さいものと認識されているようだ。
- 「作者がSafariでテストしていない」が論点です。それもCocoaのプログラム識者なのに。という意味。
- >>409
さあD2j+hYgMさん。その箇所なおして再アップロードしといてください。
- PBで\nとしても改行されないのは
なんとかならないんでしょうか。
バックスラッシュいちいちコピペしてるんですが。
- プログラミング自体初めてな俺、
いままさに
- >412
スクリプトを米国にして、Option+\でバックスラッシュが入力できます。
- >>414
できました。
ありがとうございました。
- よくわからんけど
CocoaとSafariとどう関係するんだ?
CocoaフレームワークにSafariに関するクラスとかメソッドでもあるの?
- Interface Builderで作成したアプリケーションの
パッケージ内のファイル、特に画像ファイルを見れなく
する方法てないですか?
ゲームなんかだと簡単に見られたく無い画像とかあるので。
- >>416
CocoaフレームワークとSafariは直接関係ないだろう
一部ではWebKitフレームワークがアツいようだが
>>417
独自フォーマットに汁
PNGでプライベートチャンク使うとか
ビットマップをシーザー暗号でエンコードするとか
- TableViewのデータソースで悩んでます。
中村本だとデータソースにはNSMutableArrayを使うんですが、
NSCellを使ったりする方法もあるようで、
テーブルの項目の中に画像を使おうとするとそのほうがいいのかなあ。
なんだか根本的なことがわかってないような気もしますが、どなたかアドバイスキボンヌ!
- >>419
要はアイコン付きリストを表示させたいのか?
NSTableViewじゃなくてNSOutlineViewの場合だけど……
俺はNSBrowserCellを使った
NSCellを継承してオリジナルのクラスを実装した場合に比べて
何もしないでもAQUAのアピアランスに沿ってくれるので楽
NSOutlineViewのExampleを改造したので
データそのものはNSObjectを継承したFileSystemItemクラスに持たせた
それとデータを保持するクラスとデータソースは別だぞ
- うーん、よくわからないのはテーブルのひとつひとつのセルの中には何を表示できるのか?ってことナンス。
普通だとNSStringやらNSNumberやらでつが、ここにNSCellを返せばいいのか、
はたまたNSImageを直接ぶちこんでもいいのだろうか、とか。
>それとデータを保持するクラスとデータソースは別だぞ
あっ、そうですた。
- 分からなければ実際にコードを書いて実験したみたらどうだろうか?
その方が理解も進むぞ。
- NSImageは既に失敗しますた。NSCellはどうにもうまくいかず。
- >>421
データソースの-tableView:objectValueForTableColumn:row:で
返すオブジェクトはそのセルに表示する文字列(すなわちNSString)
NSCellはNSTableColumnに対してアプリ起動時にsetDataCellしてやる
NSTavleViewを継承してawakeFromNibをオーバーライドしてもいいし
デリゲートでアプリ起動を受け取ってアウトレットを使ってもいい
データセルは上記データソースメソッドの中で
cell = [tableColumn dataCell]; するとインスタンスへの参照を取り出せるので
そいつにsetImageしてやる(どこにも返す必要はない)
つまりテキストとイメージは渡す先が別だということ
NSCellは継承して改造しないとうまくいかないんじゃないかな
でもNSBrowserCellを使う方が簡単だと思う
ちなみにアイコン「だけ」表示させればいいという時は
NSTextAttachmentCellだけのNSAttributeStringを返してやればいい
言葉で説明してもよくわからないと思うので
NSOutlineViewでアイコン付きリストを表示させるソースをウプしようか?
NSTableView用に書き直すのは簡単だと思う
NSImageやNSCellで失敗してハマっちゃってるみたいだし(w
- アイコン付きリストを表示、ってこんな感じのソースですか?いじってみたけどよくわからず...
http://homepage.mac.com/mkino2/cocoaProg/AppKit/NSCell/NSCell.html#iconedCell
目指しているのはMailのリストのような、アイコンで項目の状況を表示する(未開封アイコンとか)ものなんす。
わからないのは最初にカラムにsetDataCellしてしまって、そのあと「何番目の項目にこのアイコンを」とかってことはどうやってやるんだろう、と。
- >>425
その例はアイコンとテキストを同じ cell に表示させるためのもの。
アイコンのみ表示させたい場合は、もっと簡単。
NSTableView の delegate に
-(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(int)row;
を実装して、引数として渡される cell の-(void)setImage:(NSImage *)image; を呼んで、
その引数として row に応じたNSImage クラスのオブジェクトを渡すだけでOKだと思う。
NSTableColumn の -(void)setDataCell:(NSCell *)cell; は、
その列の dataCell の型を指定するためのものにすぎない。
- >>426
おお、なんとなく理解できる!w
とりあえず試してみます(・∀・)
- どうもちゃんとsetDataCellしとかないと
-tableView:WillDisplayCell:forTableColumn:rowで
cellにsetImageする時にエラーで落ちるような???
つーわけでNSTextAttachmentCell使って30分でデッチ上げてみますた
http://ruffnex.oc.to/ipusiron/upload/6758.lzh
要はこういうことがやりたいの?
#画像はCocoMonarからの流用...
- >>428
そう!そうなんでつ!まさにこれ!
しばらくこのコードを研究します!サンクスコ!
- >>427
ごめん。
実際に試してみたら426では動かなかった。
NSCell に -(void)setImage:(NSImage *)image; があるので直に通るかと思ったら、
やはり setDataCell をしないとダメらしい。
http://www.geocities.co.jp/SiliconValley-Bay/5171/tableviewsample.dmg.gz
とりあえず単純すぎるサンプル作ってみた。
- なるほど。どちらもCellに画像をセットして返すのは同じで、そのタイミングが違うわけですねー。
なんだが別の部分でうまく動かなくなってまだうちでは成功してないわけですが(;´Д`)
- よく考えたら、
NSTableColumn の -(void)setDataCell:(NSCell *)cell; で NSImageCell をセットしていたら
-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row;
で NSImage を返せばOKで、無理に
-(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(int)row;
で cell に NSImage をセットしなくても良いんだな。
cell の修飾は後者の方法という先入観があったので、
今まで気付かなかった。
何のために返り値が id なのかと小一時間(ry
- >432
丁度テーブルで簡単にイメージを表示する方法をさがしてました。
参考にさせていただきました。ありがとうございます。
あー。快適です。
よいスレなのに人がいなくて寂しいのでage。
すいません。
- 自分の作ったソフトを公開する場合に、
そのソフトに付けるアイコンはどうやって調達されてますか?
デフォルトのままだと気が抜けたような感じだし、
自分でアイコンを作るのは絵心が無いので無理だしで、
どうも困ったものです。
- >>434
確かに Mac OS X になってアイコンの解像度が上がってから
というもの、自作アプリのアイコンを自作するのが極端に難しく
なった気がするなー(絵心のない人は特に)
「描く」という発想を捨て、デジカメで撮った写真を素材に
それを加工するという方針でいってはどうでしょう?
- 結構人の作ったアイコンを使ってるソフトってあるけど、
あれはちゃんと了解をとってるのかな?結構みんなパクリ?
- >>436
たとえば?
- デジカメで撮った写真を元にするのはアリかもしれませんが、
何のソフトのアイコンか分からないとダメなので、
最終的には絵心というかセンスの問題ですねぇ。
それを考えると絵心のある他の人に作ってもらうというのが無難かもしれません。
ただ、他の人に作ってもらうのも難しいのですが。
- 写真をそのまま使ったJeditは激しくかっこわるかったぞ。
- (^^)
- ググっても駄目だったので、お聞きしたいんですが,
アプリがクラッシュした時のCrash reportってどうやってみるんですか?
自作アプリが、ふとした拍子に落ちるんですが,原因が分かりません。
再現性もなし。
とりあえずCrash reportでもよめば何か分かるのかな,と思いまして。
- >>441
~/Library/Logs/CrashReporter/アプリ名.crash.log をダブルクリックしる!
- あ、すんません。書き方が悪かった。
そのログの見方がわからないんです。。。
Thread 0 Crashed:
#0 0x9068ba50 in objc_msgSend
#1 0x9310e518 in -[NSMenuItem setImage:]
#2 0x00006d4c in -[AppController currentAppMenu]
#3 0x00004f9c in -[AppController addMenu]
みたいなのが続いてくんですが、
このThread 0 Crashed:の所は何となく下から上に向かって処理が流れていって、
この例で言うと
#1 0x9310e518 in -[NSMenuItem setImage:]
あたりでクラッシュしてるんかいな、と見当を付けてるんですが。
違いますかねぇ...
- >443
まさにそういう事かと。
その辺りのオブジェクトのメモリ確保とかに問題あるんじゃない?
というか自作アプリならProjectBuilderからデバッグモードで起動させた方が手っ取り早いと思う。
- >443
ごく単純に考えればsetImage:に渡しているオブジェクトが解放されているせいかと。
- >>445
どんぴしゃです。
おはずかしい。。。
思いっきりsetimage:にわたすオブジェクトを他のところで解放してました。
NSDictionaryにパスと一緒にsetObject:forKeyしてたんですが、
その後ですぐ[image release];してました。
はぁー。。。
ありがとうございました。
- Objective-Cでゲーム作ろうとしているのですが、
ゲームの画面を表示するView,GameViewを用意し
Thread走らせて、その中で画像のオフスクリーンへの描画
そしてそれが終わったらGameView対してdisplayを渡すという風にしたのですが、
(GameViewはオフスクリーンをView内に表示するだけ)
どうも動作が重く、画面更新もちゃんと行われません。
しかし、Timerを使うとちゃんと快適に動いてくれます。
やっぱりTimerを使ったほうがいいのかな。そうするとゲーム自体のコードが複雑になってしまう;
誰か助けて。
- ∧_∧
( ^^ )< ぬるぽ(^^)
- ?自己解決しました。
ウェイトをかけなかったために、動作に負担がかかってしまったみたいです。
?TickCountを使って30FPS程度に抑えたらスムーズに動きました。
- 空age(゚д゚)ウマー
- Prefix headerって何の為にあるのでしょうか?消しても大丈夫っぽいけど・・・
- コンパイルが速くなるんじゃないかな。たぶん。
- >>452
ありがとー
- 良スレ
- main( )からの戻り値が得られないんですが、どうすればいいの?
通常、こうなってますよね。
int main (...)
{
return NSApplicationMain(...);
}
でもNSApplicationMain( )は返ってこないんです。
どうやら、[NSApplication terminate:] 内部で exit(0) が呼ばれてます。
こうした処理はできますか?
int main (...)
{
int ret = NSApplicationMain(...);
// <-- 処理を入れたい
return ret;
}
- ステータス返す値としてmainの戻り値を使わなければいいという話じゃなくって?
- >>456
>ステータス返す値としてmainの戻り値を使わなければいい
それも不思議なんです。
Cocoaにそれらしい関数がないようですが、どこからでも exit(number);
で終わらしていいということでしょうか。
- exitで返さなくても、戻り値を返すための変数を呼び出し側で用意しておいて、
そこに値を放り込んで勝手に終了するとかいろいろ方法はあるでそ
- >>458
意味がわからない。
本題はNSApplicationMain( )から戻ってこないということなんですが。。。
フックとか、戻り値をセットする関数とか、mainのreturnに返ってくる
関数あります?
NextStepもそうなのかな。
これは、もしかして、バグ?
- NSTextFieldとかに文字入力してる最中にも,
キーイベントとりたいんですけどどうしたらいいですか?
自力で調べたところ,
NSTextFieldがFirstResponderを奪ってしまっているために,
-keyDownが使えない見たいなんだけど...
なにかいい方法ないですかね?
- >>459
NSApplicationのリファレンスは読んだ?
terminate:の解説に、
>Don't put final cleanup code in your application's main() function-it will never be executed. If cleanup is necessary, have the delegate respond to applicationWillTerminate: and perform cleanup in that method.
とあるので、戻り値を自分でかえるのはダメなんでは?
どうしてもやるならカテゴリでterminate:を上書きとかになるけど、よくないよなー。
- >>459
憶測だけど、NSApplicationMain()はフレームワーク内部からのみ
値を返せる仕様になってるんじゃないかな。
一応、
[ NSApp stop ];
でmain関数に戻ってくることは可能なようです。
戻り値は指定できないようなので、グローバル変数で
受け渡す等の方法を使う必要がありそうですが。
- >>461
mainには戻らないとありますね。
ただ、戻らない(戻り値を返さない)理由になっていません。
「mainに戻らないから、後始末は delegateのapplicationWillTerminate:でやれ」
ということだけです。
terminate: では、delegateのコールと、内部Handlerの後始末して、exitが呼ばれる
ようでなので、サブクラスでする処理ことは、ほとんど意味ないですね。
>>462
modal loopだけで、main evevt loopは駄目なようです
本当はこうすべきでしょうね
int main(..)
{
NSApplicationMain(..);
return 0; // ここには戻ってこないぞ
}
戻り値を返す時、applicationWillTerminate:内部でexit(..);
説明がNSApplicationMainにないのが悪いんだが。
あるいは、途中で仕様が変わったのかも。
いやもう、おかしいって。
- >463
そういう仕様です。
異常終了は、適当な場所でexitしてください。
どうしても気に食わないのであれば、NSApplicationのrunをオーバーライドして、
メインのNSRunLoopが終了可能にしてください。
- -(viod)run
{
NSAutoreleasePool *pool;
while( ! isEndLoop ) {
//
pool = [[NSAutoreleasePool alloc] init];
[[NSRunLoop currentRunLoop] runMode:NSEventTrackingRunLoopMode beforeDate:
[NSDate dateWithTimeIntervalSinceNow:0.01]];
[pool release];
}
}
-(void)exit:(int)inState;
{
/**** NOT thread safe *****/
isEndLoop = TRUE;
state = inState;
}
-(int)exitState { return state; }
int main(...)
{
int ret;
NSApp = [[YourApplicationClass alloc] init];
NSApplicationMain(...);
//
return [NSApp exitState];
}
- ごめん、sage忘れた。
- >>460
NSTextFieldのDelegateに
-(BOOL)control:(NSControl *)control textView:(NSTextView *)textView
doCommandBySelector:(SEL)command
てのを実装すれば似たようなことはできる。この中で
if(command==@selector(moveUp:)){
}else if(command==@selector(insertTab:)){
}else if(command==@selector(performKeyEquivalent:)){
}...
といった感じに処理する。keyDownは@selector(keyDown:)で取れるかな? 試してないけど。
で、横取りしたらYESを返し、スルーするならNOを返す。
- >>464
>そういう仕様です。
そうですか。
サンプルありがとう、でも動かなかった。
これでは Eventを受け付けないようで。
検索したら、[NSApp run]で何をやっているのか質問した人が
いて、回答にApple Sample Codeのglutに例があると。
それらを参考にしてterminate:処理も考慮してながら、
いろいろ試しても戻ってこないから、おかしいと思い(gdb)disas
したら、なんと!runを抜けたあとのNSApplicationMainの最後で
exitが呼ばれてた。
もう、笑ってしまいました。
- >>468
>なんと!runを抜けたあとのNSApplicationMainの最後で
>exitが呼ばれてた。
ぐはっ!
NSApplicationのリファレンスのあのコードは嘘だったのか。
やられた。
- 固定値のNSRangeを定数として扱いたくって、次のようにしたのですが
"initializer element is not constant"
というコンパイルエラーが出てしまってうまくいきません。
こういうことを実現したい時ってどうすればいいのでしょうか。
const NSRange range = NSMakeRange(1, 100);
@implementation Test
...
@end
- NSRangeは構造体です。
構造体を初期化するコードは以下のようになります。
const NSRange range = {1 , 100};
- >470
const NSRange range = {1,100};
あなたがお持ちの書籍の構造体の初期化に関する部分と
NSGeometry.hを見てください。
ただし、この書き方はAppleにより NSRange の定義が変えられたとき
コンパイル不能になる、もしくは意図しない動作をするようになるでしょう。
まあ、定義が変わることは、まずないでしょうけど。
- >>467
教えてくれてありがとう.
でも,私,Delegateあんまり詳しくないので,
もう少し,詳しく教えてくれませんか?
Delegateの作成とかがよくわかんないです.
で,作成したあとで,
-setDelegate:すればいいんですよね?
あと,横取りしたらYESとかスルーならNOとかも
ちょっとわかんないです.
よろしくおねがいします
- >>471,472
ありがとうございました。おかげさまでうまくいきました。
C言語の勉強しなおしてきまつ・・・
- Carbonから乗り移ろうとしています。
従来のToolBoxを用いたプログラミングだと
RunApplicationEventLoopやWaitNextEventを用いて自分でイベントループをまわしていましたが
Cocoaだとイベントループの部分はCocoaに任せる事になりますよね。
自分の場合、主にゲームを作るとき
main()→ゲーム画面の描画→イベントループ→描画→イベント...
というようにやっていたのですが
Cocoaだと自分でイベントループをまわせなくて困っています。
参考書を読んでも「イベントはCocoaが管理してくれるよーん」としか書いてない。
やはりスレッドを用意するべきなのか、Cocoaはゲームに向かないのか……
何か方法がありましたらお教えください。
- >>475
NSTimerを使うんでは。
- >>475
あといい忘れたけど、自分でイベントループをまわすこともできるよ。
NSApplicationのnextEventMatchingMask:untilDate:inMode:dequeue:とか。
でもこれでループするとNotificationとかが動かなくなったりするので、
currentRunLoopも自分で実行する必要があったような気が。
- フリー開発環境あるとかいうのに、ちょっとさっぱりじゃない?
小サーイ世界でアプリつくっては(以下略)
- 自前のイベントループはNSRunLoop使えってことになってた気が
使ったことないけど
- >>476
nextEventMatchingMaskでぐぐったら数件ヒットしました。
一応
? NSEvent *event;
while(1) {
event = [NSApp nextEventMatchingMask:NSAnyEventMask
untilDate:[NSDate dateWithTimeIntervalSinceNow:1/60]
inMode:NSDefaultRunLoopMode
dequeue:YES];
if (event) [NSApp sendEvent:event];
}
で無事にイベントループが行われました。
画像処理とあわせた時にどう動作するかわかりませんが。
ありがとうございました。
- Cocoaはやっぱり がずっと死んでますね。
復活しないんでしょうか。
興味のあるサンプルコード落とし損ねたままだった…。
- 本買え、本。
- >>479
NSRunLoopはNSApplicationMain()を実行すると自動的に起動する。
んで、NSThreadで別スレッドを作ると起動してないNSRunLoopができる。
別スレッドでイベントハンドリングするなら自前で起動する必要あり。
NSRunLoop自体はtimerとかの入力ソースを管理、実行するメソッドしかない。
>>480
基本はNSTimerじゃないかな?
NSTimer *drawTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/60.0 target:view selector:@selector(display) userInfo:nil repeats:YES];
で描画とかを行って、
NSResponderの-keyDown:, -keyUp:をオーバライドするとか。
しかしゲームだったらnextEventMatchMask:...がよいか?
描画とかはwhileループ内で[view display]とかすれば良いだろう。
- >>481
死んでるっていうか、消したんでしょ。サイト自体はやってますよ。
Topにインラインフレームで貼ってあったblogツールの日記が別サイトになって
通常のに戻った。
今はiTunesで再生中の曲を自分のサイトに表示するツールを更新中。
- >>482
本買ったけど、さっぱり...
- >やはりスレッドを用意するべきなのか、Cocoaはゲームに向かないのか……
と書いてありますが、スレッドってあまり使わない方が良いのですか?
- 自分がそう書いたのは今までスレッドにあまり関して試したことがなかったからで。
できるだけ、いままでのスタイルを変えずにプログラムしたかったんです。
誤解招いてスマソ
- >>487
あ、そういうことだったのかサンクス。
僕はまだいろいろとよくわかってない素人なんですが、
ループ回したら虹色のカーソルも回っちゃって
困ったなー、あーそうかなるほどスレッドかー、っていう感じだったので。
とりあえず動いてるみたいなので良かった良かった。
- >>486
デュアルプロセッサを視野に入れないのならスレッド処理はあまりメリットがない
スレッド管理のオーバーヘッドもあるし排他処理とか同期の問題もある
デュアルプロセッサ搭載マシンならマルチスレッドにした方が処理が速くなるみたいだけど
そうでないならタイマーでメッセージを送った方が楽にコーディングできるよね
ディスクアクセスとかアイドル時間の長い処理をそこかしこに入れてるなら
マルチスレッド処理も有効かもしれないけど
- 外国語勉強のための聞き取りソフトを作成し、数秒のMP3ファイルを再生しているのですが、途中でとまることがよくあります。止まる場所などは一定しません。書き方がわるいのでしょうか。
Window には NSMovieView を貼り付け、Outlet名は sound にしています。
なお、10.2にバージョンアップする前は、問題なく再生できました。
- (void) openMovie : (NSString*) asFilePath
{
NSURL *urlMovie = [[[ NSURL alloc ] initFileURLWithPath : asFilePath ] autorelease ] ;
NSMovie *movie = [[[ NSMovie alloc ] initWithURL: urlMovie byReference : YES ] autorelease ] ;
[ sound setMovie : movie ];
}
- >>490
10.2におけるNSMovieViewのバグです。
音声ファイルを再生するだけなら、QuickTimeの
APIを直接叩くか、NSSoundを利用してください。
(10.2のNSSoundはMP3も再生できるようになってます)
- >>491
ありがとうございました。おかげさまで、ちゃんと再生できるようになりました。
- NSMenu の-(void)setSubmenu: forItem:で設定すると
-(void)submenuAction:(id)senderが呼ばれるんだよね。
@interface MyMenu : NSMenu {}... 略
@interface MyMenuItem : NSMenuItem {}...
MyMenu* m_menu = [[MyMenu alloc] initWithTitle: @"MenuTest"];
MyMenu* menu1 = [[MyMenu alloc] initWithTitle: @"SubTest"];
MyMenuItem* subItem= [[MyMenuItem alloc] init];
[m_menu setSubmenu: menu1 forItem: subItem];
@implemention MyMenu
-(void)submenuAction:(id)sender {}
@end
submenuAction:が呼ばれない。
SUBメニューがオープンされるときにコールバックされると思うのだが違う?
- x implemention
o implementation
- NSViewのインスタンスを動的に生成したいんですが、
上に乗っけたいコントロールの類はいちいちコード内で配置していかないとダメなんですかね?
ビューを複製することができればIBで作ったビューを複製してやればOKだと思うんですが、ビューはNSCopyingに準拠してないし。
なんか方法知りませんか?
- >>495
IBで新規にnibファイルを作り、Viewとコントロールを配置しておいて、
+loadNibNamed:owner:でロードすれば良いのでは?
- すいません、したいことをもっと明確に示すべきでした。
Tabの数が増えたり減ったりするTabViewで全てのTabに同じコントロールを乗せようと考えてたんです。
Tabの内容をコードでガリガリ書いてると分かりづらいなぁと思って、IBで書けたらいいなぁと思ってたところです。
View複製さえできれば、コントロール配置したNSViewをOutletで保持しといて、
NSView* newView = [templateView clone];
[tabitem setView: newView];
ってできると思うんですが。。。
やべ、もう寝ないと...
- OmniWebの環境設定のプラグインで
インストールされているプラグインのリストが見られますが
(なんかCocoaGesturesまで見えているけど)
ああ言うロードされているバンドルのリストみたいなものは
どうやって所得するんでしょう?
- >>497
496の言う通りにやればできるんじゃない?
IBでウインドウの上にコントロールを配置しておき
+loadNibNamed:owner:でロードして
ビューのインスタンスを取得してタブビューにセットする
一緒にロードされたウインドウを解放するのを忘れないようにね
マルチドキュメント・アプリケーションの作り方を参考にするといい
あれはひとつの.nibから複数のウインドウを作って管理するアプリなんだから
.nibをロード→viewのインスタンスを取得→viewをretain→
windowをrelease→viewをタブにセット→( ゚Д゚)ウマー
という手順でいいと思う
>>498
動的にロードされたバンドルも静的にロードされたバンドルも
Objective-Cでは区別されていないじゃなかったか
どうしても取得したいならロード時に記録しておくか
objc_getClassListで全てのクラスのリストを取得してから
既知のクラスを取り除くってのはどうよ?
プラグインパスを取得してその都度数えるという方法もある
NSBundleでロードされたクラスはNSArrayに記録しておくのが普通だから
それを利用するのが一般的だけどね
- >>499
ちょっと補足させていただくと、
IBでビューを作成するのにウインドウは必要ないですよ。
"CustomView"をパレットからドキュメントウインドウにDnDすれば
インスタンス化出来ますから。
- できました!
ありがとうございました。
IBの"File's Owner"の意味がやっと正確に理解できました。
てっきり"File's Owner"==NSApplicationのインスタンスなのかと思ってました。
Viewが複製できないと思って、ちょっと「Cocoaの嫌なとこを見たな。。。」とか思ってたら、
もっとcoolな方法で解決していたとはさすが...
- 画像ビューワをつくったんですけど
Finderでこのアプリで開くのデフォルトにできないんですけど
どうすればいいのれすか?
- 実物が無いから何とも言えないけど。
Project Builderでファイルタイプを指定している?
- >>503
ファイルタイプってMIMEタイプかOSタイプのことですか?
info.plistのエントリの書類のタイプで
拡張子は指定していますけど
MIMEタイプとOSタイプは指定していません。
- LaunchServiceのキャッシュが壊れているカモ。
- 厨です。
cocoa-javaでjava.awtやjava.swingは使えますか?
やってみてるんですが、Build failedしてしまいます。
- >>505
う~ん…それらしいファイルを消してもダメですね。
とりあえずソースおさらししてみます。
http://www2.plala.or.jp/doidoi/macosx/PeeDeeeF.tar.gz
画像ビューワとか言いましたけどホントはPDFビューワです。
- >>506
しょうだつやの
の本に書いて有る
- >>508 ありがとうございます
ちょうど手元にあったので見てみました。ら、少し書いてありました。
とにかくできることが分かり希望が持てました。
ところでご本人ですか?
- >>509
その本持ってるから。
- >>509
呼び捨てやったけん思ったんかな。。
掌田先生のサイトにもいろいろ書いてあるよ。
- ところで>>511さんは佐賀の人ですか?
- 佐賀ん人じゃなかばい。
- >>507
なんとか自己解決。
アプリケーションシグネチャをつけるとうまくいくようです。
むぅ~登録せねば。
- ━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
- http://www.ntt.com/shop/service/cocoa/index.html
なんとNTTの新サービスはcocoa対応らしい・・・NTTすげえぜ。技術力。
- ~● ~● ~●◎ 受精
http://homepage3.nifty.com/coco-nut/
- あぼーん
- OSX10.2.6が動いているWebサーバー機があるんですけど、
cocoaアプリでPerlスクリプトみたいなことは出来ますか?
ユーザのリクエストに応えてHTMLファイルを動的に生成して出力するとか。
WebObjectなんかがそれっぽいかと思うんですけど、何せ高いしねー。
- >>519
普通にUNIX用CGIアプリを書いて使えばいいんじゃない?
もしどうしてもCocoaフレームワークを使う必要があるなら
ターミナルアプリからCocoaフレームワークを使う方法もあったと思う
- >>519
「Perlスクリプトみたいなこと」って、CGIのことか?
CocoaアプリじゃなくてFoundationToolじゃだめなん?
- >>520,521
端的に言えば、
1、ProjectBuilderが使えて
2、Objective-cが使えて
3、Cocoaフレームワークが使えると便利かもしれない
という条件を備えた、CGIとして使えるアプリ(?)を作りたかったんです。
FoundationToolって、UNIXのコマンドラインですよね。
使ったことはないけど、もう少し調べてみるかな。サンクスでした。
- ×という条件を備えた、CGIとして使えるアプリ(?)を作りたかった
○という条件で、CGIとして使えるアプリが作れるかを調べたかった
- >523
AppKitを使わない。
CocoaFrameworkはAppKitを含むので、FoundationFramework単体でリンク。
どうしてもWeb上でGUI部品もFrameworkとして使いたければWebObjectを買いなさい。
以上。
- >>522
cgiはhtmlをテキストで返すコマンドラインアプリであればいいので、
Objective-Cでもまったく問題なく作れますよ。
新規プロジェクトからTool->Foundation Toolを選べばいけまふ。
- Foundation Toolを選んで出来た作ったコマンドラインアプリに「.cgi」の拡張子
をつけてSitesフォルダなどに入れ、それをブラウザから読み込めば実行できるんですか?
cocoaで初めてプログラミングを始めたので、標準出力とかイマイチ良く分かりませんが
がんばりまつ。ありがとう。
- >>526
とりあえずコマンドラインで動くものから作ってみたら
- 例えば @"1*(2+3)" といった NSString 文字列がある場合に、
この計算式の解を得る良い方法は無いでしょうか?
- >528
http://www.tech-arts.co.jp/macosx/macosx-dev-jp/htdocs/2900/2923.html
へのレスを参照してみて下さい。
なんかいろいろと方法があってどれが一番良いかはよく分からんけど
- >>529
ありがとうございます。
あまり簡単な方法は無いようですが、
スタックを使う方法を試してみて、
難しくてダメなら諦めて bc を使うことにします。
- Cocoa+Javaしたいと思っている全くの初学者です。C関連の書籍は定番と言えるような本があがっていますが、Cocoa+Java方面でよい本があったらお教え頂けませんでしょうか。
Think Cでウインドウ出すのに挫折して幾星霜、web見ながらやってみたらウインドウがあっさりと出て。。。感動しました。
DevTools、昔は60万したって本当なんですか?
- >>513
いい本ないんだよね~。とりあえず、この辺はいかが?
http://www.h5.dion.ne.jp/~tuyano/X-Java-Tutor/
http://underwater.lab.nig.ac.jp/~takaho/computer/osx/
おいらもCocoa-Javaでやってたんだけど、Objective-Cやったら
おもったより簡単だったので、OCで書き直すか思案中。
ちなみに昔60万はWebObjectsのことでは?
- >>532のは>>513へのレス。失礼。
- どうも俺は513が好きなようだ。ショボーン
- >>532
> いい本ないんだよね~。とりあえず、この辺はいかが?
> http://www.h5.dion.ne.jp/~tuyano/X-Java-Tutor/
> http://underwater.lab.nig.ac.jp/~takaho/computer/osx/
>
いいところ教えて頂きました、ありがとうございます。
#本買ってみようかな~
> おいらもCocoa-Javaでやってたんだけど、Objective-Cやったら
> おもったより簡単だったので、OCで書き直すか思案中。
>
すごいですね、なんとかJavaを少しでも分かりたいです。
> ちなみに昔60万はWebObjectsのことでは?
そうなんですか、ありがとうです。
- 機械の体がほしくて999で初心者スレからやってきました。
mac2年目の初心者です。
cocoaでソフトを作りたいのですが、参考になるお勧め本教えて下さい。
どんなソフトかというと、運転免許場とか医局の番号表示システムみたいな
感じです。フルスクリーンにできて、番号打って一度に何人分も表示できて、
その番号の人がブツを受け取ったら簡単に消せタリする、
そんなソフトを作りたいんですけど・・・・難しいっすかね?
いろんな言語とか精通しないとかけないっすか?
- 自分はCocoaをはじめたときはamazonで
中村氏のMac OS X Cocoa プログラミングと
荻原氏のObjective-Cの本を購入。
入門はその2冊で、今はネット上の資料で開発しています。
あとそれぞれの言語に得意・不得意はありますが
実際に独自のソフトを作るとなると、関係するのは言語じゃなくて自分の技術とセンスだと自分は考えてます。
- >536,537
>中村氏のMac OS X Cocoa プログラミングと
>荻原氏のObjective-Cの本を購入。
俺もその二冊かな。
はじめは「Cocoaはヤッパリ」だったんだけどね。
ただしどれも基礎的なCおよびプログラムの知識(文法とかプログラムの制御とか)が必要なので注意。
そこらへんを知らずにいきなり買ってもわからんと思うよ。
>mac2年目の初心者です。
っていうことなんで一応。
ちなみにCのお勉強は・・・
http://homepage1.nifty.com/toshio-k/prog/c/
こんなのはどうかな?
ちゃんと読んでないけど結構丁寧に書いてるっぽい。
そんなの知っとるわ、というのであれば余計なお世話スマソ。
- >536
ちなみにその程度のソフトなら慣れれば二日もあれば作れる
と思う
- Cocoa の流儀を学ぶならヒレガス本も欠かせないと思うが。
- 中村本や萩原本の前に
「はじめてのC」とか「やさしいC」とか「かんたんなC」みたいなC言語の入門書を一冊よんどけよ。
- 結城本がいいよ。
- 何が良いんだかさっぱりですが、とりあえずCの言語が
分かんないといけないんでつね。。。cからはじまる恋物語でも
読んで勉強してきます。
初心者の俺でもこのソフトならかなり簡単な部類だよなぁッと思ってました。
頑張ってみます。
- 以前までREALbasicを触っていました。
Rbの時、インターネットへの接続はSocketクラスを用意して、
PortとAddressを設定して、Writeメソッドで文字列のデータを送る。
とやっていました。
ドキュメント等見てCocoaではNSSocketPortを使うんだなぐらいまではわかりましたが、
NSSocketPortを見ても何がなんだかよくわからない状況です。
RbのSocketクラスのように行いたいのですが、ご説明願えますでしょうか。
- 質問です。
NSTaskを使ってtarの自分用フロントエンドを作っていまして、
tarの場所を
[aTask setLaunchPath:@"/usr/bin/tar"]
みたいな感じで指定しているのですが、
例えば、cocoaWgetのようにtarをアプリケーション内にバンドルするにはどうしたらよいのでしょうか。
御存じの方いましたらよろしくお願いします。
- /usr/bin/tar から引っこ抜いてきてファイルを追加すればいいんでないの?
- >>544
わたしもRbからの転向者です。初心者ですので、詳しいことはわかりませんが、
NSURLとNSURLHandle を使ってインターネットへ接続しています。
- >>544
HTTPを介したデータの受信を行なうだけなら、
>>546の通りNSURLとNSURLHandleをクラスを
利用すれば出来ます。
その他のプロトコルを利用したい場合や、データの送信を行いたい場合は
C言語の領域に降りてSocketを作成する必要があります。
なお、作成したSocketはNSFileHandleクラスで扱うようにすると便利です。
NSSocketPortはちょっと特殊な用途に使うクラスなので、
とりあえず忘れてください。
- 久しぶりにProjectBulderを立ち上げたのに、何も使えなくなってた。
「新規プロジェクト」→「CocoaApplication」を選んだだけのプロジェクトさえも
ビルド完了しません。こんなエラーで・・。
Compiling /Users/ユーザ/プロジェクト/プロジェクト_Prefix.h(5個のエラー)
"/User/ユーザ/プロジェクト/プロジェクト_.Prefix.h:6"からインクルードされているファイル内
"Foundation/Foundation.h : No such file or directory
他「No such file or directory」がいろいろ・・・。
システムも再インストール(アーカイブインストールですが)したし、デべツールも
再インストールしたし、PB,IBの初期設定も捨てたし・・・万策尽きました。
システムをクリーンインストールしたら解決するんですかねぇ。
- >>544
HTTPやFTPを使うのならNSURLとNSURLHandle。
それ以外ならsmallsockets使えば出来る。多分。
http://smallsockets.sourceforge.net/
- 解決しました。
デベツールのディスクイメージのチェックサム検証をスキップしてたのがいけなかった
みたいで、スキップしないでいるとDiskCopyが不正終了しました。
仕方ないのでDevToolをADCからもう一度ダウンロードしてインストールしたら復活!
インストール終了できても中身が壊れてるなんてこともあるんですね。意外だ。
- >545
wgetと違ってtarを内蔵する意味はないと思うが・・・
単に方法を知りたいということであれば>546の通り
アイコンと同じようにプロジェクトにファイルを追加すれば良し
- >>544
きっとJavaのほうが楽な予感。。
- >>547,548
ありがとうございます。NSSocketPortは違ったのですね。
NSURLとNSURLHandleについて調べてみます。
>>553
やっとObjective-Cに慣れてきたところなので、これ以上増えると頭がパンクしてしまいます
Javaの方もいつかさわってみたいです。
- AppleMailのような、虫眼鏡アイコンの検索オプションがついた検索フィールドを作り
たいと思い(NSTextFieldと一緒に)NSPopUpButtonを-setPullsDownして配置したの
ですが、このPopupButtonについてくるMenuItemに-setState:NSOnStateを送っても
チェックがついてくれません。
InterfaceBuilderでも、このMenuItemのインスペクタでは「State」がグレーアウト
してるし、やっぱりチェックマークをつけることはできないんでしょうか。
- 遅レスすいません。
>546,552
ありがとうございます。NSBundleを使ってpathを指定してやればうまくいきそうです。
- >555
本当にNSPopUpButtonなのかな?
Mailでは普通のNSButtonにメニューをくっつけてるのかも。
Mailのnibファイルはのぞいてみた?
(ちょっと見てみたんだけどnibファイルが多すぎてどこに入ってるのか分からんかった。
ちなみにSafariのバックボタンはNSButtonのサブクラスになってる)
ところでMailは英語以外のnibファイルを開けないのはなぜだろう?
- まあ、関係ないけどさ
Obj-Cに限らず、オブジェクト指向言語はひとつ理解(言語仕様じゃなくてオブジェクト指向そのものを)
すると、他の言語もほとんど問題なく学習できるよ。
JavaはベースがCだから特に楽なんじゃないかな。
- Cの入門書は一通り読みました。いまは中村氏のcocoa本を読んでいますが、
いまいち「オブジェクト」が解りません。
OCのオブジェクトはJAVAのそれとよく似ていると聞いたことがありますが、
JAVAの本も読んだ方がいいのでしょうか?
またオブジェクト初心者にも解るOCのオブジェクト解説のある書籍、
またはサイトがありましたら教えていたていただけないでしょうか?
よろしくお願いします。
- >>559
558も言ってるように、ひとつの言語でもやってる内にわかります。
ぱーっと世界が開けるように、わかります。
- >>557
恥ずかしながら、Mailみたいな機能を再現したいと思っていただけでNibは調べてませんでした。
NSButtonにメニューをくっつけると言うのもアリですか。
でも、Safariのボタンにはチェックを入れる必要がないのでNSPopUpButtonでもいけそ
うですけどねぇ。
もう少し、試行錯誤してみます。ありがとう。
- 中村本の次に読むとすれば荻原本かなぁ。
だんだん知識を塗り重ねて行くうちに
オブジェクト指向も分かるようになる気がする。
- 自分はHyperCard、REALbasicから始めたからオブジェクト指向ってのはおぼろげながらわかってた。
言葉で理解するよりも、経験を積み重ねていったほうがおのずとわかってくるとおもうよ
荻原氏のはなかなか重宝しています。中村氏のは一度読んで実践して終わりだったけど、
こっちだと何度も開くことになる。
- >561
Safariのボタンは「ボタン長押しでメニュー表示」のためにNSButtonのサブクラスにしてるんじゃないかな?
>559
俺はC++の本でオブジェクト指向を勉強したな。
C++自体は一通り本を読んだだけで実際には一度もプログラムを書かなかったけど、
オブジェクト指向という概念そのものは役に立った。
>562,563のいう通り最終的には経験が一番重要だけど、
最初はなんかしらの読み物で概念を知っておいた方が良いと思うよ。
それで全てを理解できるわけはないけど、これからどんなことをしようとしているのかくらいは分かってないと
いくら勉強しても身に付かないと思う。
- NSPipeについて御存知の方いませんか。
gzip -dc hoge.tar.gz | tar xf -
のようにコマンド間をパイプで繋ぎたいのですが、Appleのドキュメントを読んでもよく分かりません。。。
(tar xzf hogeをつかうのはなしで)
[task_Gzip setStandardOutput:aPipe];
として
[task_Tar setStandardInput:aPipe];
としてもダメでした。
NSFileHandleを使って標準入力をバッファから読み込めばうまく行くような気がするのですが、
うまくコードにする事が出来ませんでした。
/*この辺はやっぱりM$の方が(ry
ももう少しなんとか(ry */
- レスありがとうございます。
どうせならOCでオブジェクト指向が学べたら、と思ったのですが。
JAVAやC++なみに人口が増えないと書籍層が充実しないというところでしょうか。
Javaでオブジェクト指向入門をしたいと思います。
- いや、だからさ
オブジェクト指向は「何々で学ぶ」ってもんじゃないんだって。
分からないうちはJavaだろうが何だろうが分からない。
- >567
いやObj-Cの本(というかCocoa本)には「オブジェクトとは何か」という基本を説明している本がない現状では、
その部分をJAVAなりC++なりの本で学ぶのは大事だと思うよ。
>566
別にJAVAそのものを勉強する必要はないのでご注意を(もちろん勉強したって無駄じゃないけど)。
http://www5c.biglobe.ne.jp/~ecb/java/java00.html
例えばここで4,6,7,8あたりをざっと目を通して終わりで良いんじゃないかな?
(このページを推称するわけじゃないよ、ぐぐったらそれらしいのが出てきただけ)
具体的なことはCocoaでソフトを作っているうちにだんだん分かってくるから心配はいらないと思う。
本当は0の0から(変数とはとか、オブジェクトとは、から)Cocoaを勉強できる本があるとベストなんだけどね
- >>565
どうも NSPipe は少しでも大きいデータを流そうとすると極端に重くなるので、
中間ファイルを作ることを勧めます。
- >569
レスどうもです。
>どうも NSPipe は少しでも大きいデータを流そうとすると極端に重くなるので、
もしよければどのようにデータの受け渡しをするのか教えていただけませんか。
- >>570
中間ファイルを用いる方法は面倒なことに気付いたので、
「自分ならこうする」という別の方法を書いてみます。
まず、以下の内容のシェルスクリプトを hoge.sh という名前で保存し、
それをプロジェクトに取り込む。
#!/bin/sh
gzip -dc $1 | tar xf -
exit 0
次に、以下の内容のメソッドを書く。
-(void)something:(NSString*)filename{
NSString *script=[[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"sh"];
NSString *archive=[filename stringByExpandingTildeInPath];
NSTask *task=[[[NSTask alloc] init] autorelease];
[task setCurrentDirectoryPath:[archive stringByDeletingLastPathComponent]];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:[NSArray arrayWithObjects:script,archive,nil]];
[task launch];
[task waitUntilExit];
}
それで、このメソッドを呼んで引数として解凍したいファイルのパスを渡せばOK。
- >>568
良いサイトを紹介いただきありがとうございます、早速読んでいます。
>具体的なことはCocoaでソフトを作っているうちにだんだん分かってくるから心配はいらないと思う。
そう願います。なーんちゃって感覚でCocoa及びObjective-Cに慣れていきたいです。
>本当は0の0から(変数とはとか、オブジェクトとは、から)Cocoaを勉強できる本があるとベストなんだけどね
まさにそう思います。
- >571
とても詳しいレス有り難うございます。
早速ProjectoBuilderで作成してみたところうまく動作しました!
ただ、シェルスクリプトは引数に半角スペースや[、](中カッコ?)が入ると認識しない事に気が付きました(涙
ho(半角スペース)ge.tgzというファイルを用意して
ターミナルから
gzip -dc ho\ ge.tgz | tar xzf -
これは動作するんですが
上記hoge.shを利用してターミナルから
hoge.sh ho\ ge.tgzとすると
tar: Failed open to read on ho <No such file or directory>
gzip: compressed data not read from a terminal. Use -f to force decompression.
For help, type: gzip -h
となります。シェルスクリプトにエスケープシーケンスを認識させるにはどうしたらよいのでしょうか…
- >>566
俺はOCの萩原本でオブジェクト思考理解したよ
要は内容を受継いで変更や拡張できる部品を集める形でつくる
よって変更、拡張、他のプロジェクトの再利用が用意
ってこと(違う?
-
- >574
本当だ
荻原本にもオブジェクト指向の説明があったね。
>いやObj-Cの本(というかCocoa本)には「オブジェクトとは何か」という基本を説明している本がない現状では、
というのは俺の勘違い
スマソ
- >>573
hoge.sh を gzip -dc "$1" | tar xf - としてみては
- 今さらかもしれんが、
>>565
NSTask *gzipTask = [[NSTask alloc] init];
NSTask *tarTask = [[NSTask alloc] init];
NSPipe *pipe = [NSPipe pipe];
[gzipTask setStandardOutput:pipe];
[gzipTask setLaunchPath:@"/usr/bin/gzip"];
[gzipTask setArguments:[NSArray arrayWithObjects:@"-dc", @"hoge.tar.gz", nil]];
[tarTask setStandardInput:pipe];
[tarTask setLaunchPath:@"/usr/bin/tar"];
[tarTask setArguments:[NSArray arrayWithObjects:@"-xf", @"-", nil]];
[gzipTask launch];
[tarTask launch];
これでうまくいくと思うが。gzipTaskをlauchし忘れたとか。
終了を判定したい場合は、NSTaskDidTerminateNotificationが使える。
tarTaskの出力を利用したい場合はfileHandleから読むことになる。
>/*この辺はやっぱりM$の方が(ry
>ももう少しなんとか(ry */
具体的に聞きたい。ドキュメントのことか。
>>569
重くなるというのはどういうこと?
上記のコードでもそんなに差はなかったが(18MBくらいのファイルでターミナルと2、3秒の差)
[task waitUntilExit]で待つと他のイベントがハンドリングされないから?
- Cocoaについて教えて下さい。
#import <Cocoa/Cocoa.h>
#import "MyClass1.h"
@interface AppContoller : NSObject
{
MyClass1 *anInstance;
}
このように自作クラスのオブジェクトを他のクラスのインスタンス変数にしようとすると
parse error before "MyClass1"
とコンパイラにおこられるんですが、
NS~というクラスのおぶじぇくとでないとインスタンス変数にはできないのでしょうか。
- >>579
#import <Cocoa/Cocoa.h>
#import "MyClass1.h"
@class MyClass1;
@interface AppContoller : NSObject
{
MyClass1 *anInstance;
}
としたらどうですか?
- >580
@interface AppContoller : NSObject
{
id anInstance;
}
このようにid型で宣言したらうまくいきました。
- >>581
id型にしてしまうと、MyClass1が持っていないメソッドを
anInstanceに送ってしまった際の警告が抑止されてしまうので、
おすすめできる方法ではありません。
#import <Cocoa/Cocoa.h>
@class MyClass1;
@interface AppContoller : NSObject
{
MyClass1 *anInstance;
}
とするのが良いと思います。>>580に似ていますが、
#import "MyClass1.h"の宣言を削除しています。
ヘッダから削除したこの宣言は、かわりにAppContoller.mファイル
の方に書いておいてください。
- ・ヘッダファイルでは自分のスーパークラスだけ#importする
・その他のクラスは@classディレクティブで宣言する
・@classディレクティブで宣言しておいたクラスのヘッダファイルは
実装ファイル(.m)で#importする
としておくと、ヘッダファイルの依存関係で悩まされることは
通常無いと思います。
- Objective-C Pocket Reference買っちゃった。
CocoaオンリーかとおもってたらGNU関係も対比して書いてるじゃん。
翻訳出るかな?これ。出たら友達に勧めよう。
- JavaでCocoaアプリを作る時なんですけど、製作の過程はどのような感じになるの?
Javaの知識だけあればできるの?
それとも、あの英語だらけで調べるのも一苦労のマニュアルを見ながらでないと
作れないの?
- どのみち英語で苦労しなきゃならんと思われ
- いやー、マイクロソフトの開発環境は日本語情報充実してたしなぁと思って。
JavaならObj-Cよりも日本語の情報で苦労しなくてすむかなと思ったんだけど
そういうもんじゃない、ってことですかね?
- ObjC使ってますが、だいたいはProjectBuilderに付属したリファレンスを見てやってます。
- >>588
クラスライブラリが全部英語だとすごく疲れませんか?
僕は疲れます。
読み進むスピードが日本語の3分の1くらいになるし…
- >>589
ここを利用してみれば?
http://www.oomori.com/cocoafw/index.html
参考にするといった程度だけど。
- >587
>JavaならObj-Cよりも日本語の情報で苦労しなくてすむかなと思ったんだけど
正解。
でもCocoaのリファレンスが全て英語なのでそこで苦労する。
JavaとObj-Cの情報の差なんて微々たるものだよ。
Obj-Cの情報なら荻原本で大体事足りるし。
>589
疲れる。
っていうか必要な部分を斜め読みするだけでまともに読んだことないな。
なんで後から「こんなクラスがあったのか!」って後悔すること多数。
あぽーもWin32からのポーティングガイドなんて訳してないで
Cocoaリファレンスを訳してほしいもんだ。
- というより、本当に教えてほしい点は(出し惜しみしてたわけじゃなくて)
「Cocoaフレームワークの中でJavaのライブラリを使うだけ」なのか、
「Javaで組んだら勝手にCocoaアプリになる」のか、ってことかも。
つまりCocoaのお勉強が絶対条件として立っているなら、
別にjavaでもObj-Cでも一緒だなぁと思いますし。
言語仕様自体の違いなんて問題にならないから。
- >>592
>「Javaで組んだら勝手にCocoaアプリになる」
この辺がよく分からんが。
Pure Javaで組んだらPure Javaのモノが出来る。
Pure JavaでQtやGTKのネイティブアプリが出来る訳でないのと一緒で、
Pure JavaでCocoaアプリが出来る訳じゃない。
Objective-CでCocoaを使う事の利点はいざと言う時に
すぐにCarbonに降りて処理出来る事。
エイリアスの解決とかちょっと凝った事をしようとすると
Carbonが必要になる。
逆に、そんな些細な事は気にしないでCocoaの上だけで完結するなら
Javaにはガーベジコレクタが有るし
既存のクロスプラットフォームで優秀なライブラリが
公式、非公式に大量に存在する。特にXML関連はJavaが強い。
つっても、要求仕様に併せて自分の好きな方を選べばよろし。
Objective-CもJavaもよく似ているから
片方をある程度知っていればもう片方を勉強するのは
そんなに難しい事じゃないよ。
問題は、両者の似て非なる部分が微妙で混乱しがちな所か。
- cocoa javaならこれ
http://www.amazon.co.jp/exec/obidos/ASIN/4798003530/ref=sr_aps_b_/249-4965523-9500347
読んでからうんちく垂れれ
- >>594
へぇー、こんな本があったのか。
Cocoaはやっぱりとどっちが分かりやすいだろう…
- どっちがって、「別の本」だよ。内容的に。
あくまでJavaの本であり、Javaがわの視点から書かれてるから。
- >>595
この本買ったけどわりといいと思うな。前半Javaそのもの、後半Cocoaをからめて、ってかんじで
しょうか。まだ前半を少ししかよんでないけど。
「Cocoaはやっぱり」はObj-Cベースだと言う事もありJava系のものをさがしてたらコレがあって。
かなり易しく噛み砕いているので僕のような初学車でもいけるかなと思います。
- http://www.amazon.co.jp/exec/obidos/ASIN/4877780939/qid=1055422586/sr=1-2/ref=sr_1_2_2/249-6240115-4070723
Cocoa+Java―MacOS X 10.1対応版????MacOS Ⅹプログラミング入門
これと>>594ならどっちのほうがいいと思いますか?
どっちかにしようと思ってるんですけど。
- >>598
Amazonにはレビューが付いてるだろ。レビューが無い本は売れてないとも読める
- >>599
この本、前のりビジョンにはいくつかレビューついてるんですよ
- ファイルのフルパスを表示する時に、本当のファイルネームでのパス
を放り込んだらローカライズされたパスに直してくれるクラスとかありますか?
- NSFileManagerのドキュメント内を探せ。
- -displayNameAtPathかと思ったけど、
これって返ってくるのがlastPathComponentだけみたいなんですが・・・。
/User/aaa/Documents/abc.jpgというフルパスを渡したら
/ユーザ/aaa/書類/abc.jpgというNSStringが返ってくるクラスはFileManagerにあります?
- そういう場合はアレだ。
どうせ6つぐらいしかないんだから
手 動 で
- 森永
- >>603
だからちょっとは探せ。
- お騒がせしました。-componentsToDisplayForPathですね?
参考までに超意訳のリファレンスをのせときます。
componentsToDisplayForPath:
- (NSArray *)componentsToDisplayForPath:(NSString *)path
パスのコンポーネントを表すNSStirng(既にAutoreleaseされています)を要素とする
NSArrayを返します。このパスの要素は、ユーザが目にする形であらわされています。
(Finderやオープン・セーブダイアログ等におけるような)
このメソッドで得られるパスは、ファイル操作などに使用することはできない、ユーザに
表示するためだけのものです。
・・のはずなのに、なぜかnilしか返ってこない・・・。
- 何度もすみません。解決しますた。
-componentsToDisplayForPathに渡すのは、今現在実際に当該ファイルが存在する
パスしか渡してはダメみたいです。以前に保存していたファイルパスを表示するという
場合には注意がいりますね。
- Cの関数からobjective-cの処理を呼び出す方法は無いのでしょうか?
objective-c側から普通のC関数の呼び出しは、そのまま記述できるのを
確認したんだけど。(self とかは使えないみたいだけど、それはまた別問題として、、)
具体的には、昔cでつくった処理からIBで作ったCocoaの表示処理を呼び出したいんです。
- CocoaもAPIはただの関数な訳で使えないことは無いと思うけど
Cocoaのクラスを呼び出すのは不可能だと思う。
- 反応早!
すんません。 Cocoaというレベルでなくて言語仕様レベルの話なんです。
昔作った処理の再利用が目的なんで、うわっかぶせでobj-c とcの
橋渡しができればいいんです。
C++経由というのをいま探索中です。
- ん?
Cの関数内から呼び出したいだけで、別にCで作ってるわけではないのね?
んじゃあ、Obj-Cなんだったらそのまま呼び出せば普通に使えると思うんだけど。
- ほれ
--- main.c ---
main() {PrintStrObj();}
----------------
gcc -c main.c
--- print.m ---
#import <Cocoa/Cocoa.h>
void PrintStrObj()
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
printf([[NSString stringWithString: @"Hello World!"] cString]);
[pool release];
}
---------------
gcc -c print.m
gcc -o p main.o print.o -framework Cocoa
- Cocoaはやっぱり のweb版ページ消えた?
- だいぶ前に。
- #import <Cocoa/Cocoa.h>
int main(int argc, const char *argv[]){
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
[pool release];
return 0;
}
みたいなのをコンパイルして実行すると、CFStringとかCFNumberなどのCF~のメモリが解放されていないようなんですけどこれはなんなんでしょうか?
- >>616
>これはなんなんでしょうか?
どうやって検証したの?
認識が違っているかもしれないし、方法がわからないと誰にもわからない。
- ageついでに、
Cocoa.Frameworkってメモリーリークしているのかしていないのか
わからない所がある。
MallocDebug.appでみると、リークしまくりのようだが。
- >>617
すいませんでした。
gcc main.m -framework Cocoa
とコンパイルしたものを
ObjectAlloc上で実行してみたところCurrentの所が0になっていないものが
たくさんあったんです。
- >>619
>ObjectAlloc
でわかるの???リークが!
- あれっわかんないんですか?何か根本的に間違ってますか?
- >>621
main(){
char* p=malloc(10);
free(p);
return 0;
}
でfree()があるときとないとき比べても
システム内で使われたかどうか知らないが、
消えてないオブジェクトがある。
- Cocoa-JavaでServerSocketがうまく動かずに悩んでいます。
Threadを継承したクラスのrunメソッド内で、ServerSocketをnew、acceptしてSocketを取得できません。
tryでくくっているのですがExceptionはスローされず、servSock.accept()で止まっているようです。
ServerSocket servSock = new ServerSocket(listenerPort);
NSSystem.log("port=" + servSock.getLocalPort()); // ここまでは動いています
Socket sock = servSock.accept(); // ここから先の処理に進みません
NSSystem.log("remoteSockAddr=" + sock.getRemoteSocketAddress());
このacceptで止まった状態でアクセスすると
java.lang.NoSuchMethodError
at ServerThread.run(ServerThread.java:46)
上記のエラーが出ます。何かこの問題の原因がわかる方おられましたら助言よろしくお願いします。
原因をさぐるべくPureJavaで書いてみましたが同様の症状でした。
- 追記です。
SHOEISHAのJavaゲームプログラミングを参考にしています。
(この本は推奨されないメソッドを使っている箇所がたくさんあるので気をつけてコーディングしています)
ポートは2357を使用しています。他のポートも試しましたが症状は変わりませんでした。
テスト段階で一回うまくいったような感じだったのですが
ポートを閉じる処理を忘れてからうまく動作しなくなったような感じがします。
記憶があいまいなので、もしかしたらうまく動いていたのは勘違いだったかもしれません。
この問題の解決が難しそうであればObj-Cで書き直すつもりでいますが
不馴れなためできればJavaで開発したいと思っています。
何卒よろしくお願い致します。
- >>616
それは多分、もともと解放されないオブジェクトだと思うのだが。
@"string"とかは解放されないNSStringのインスタンスでしょ?
>>623
たしかaccept()はそこで止まってアクセスを待つでしょ。
タイムアウトを設定すれば、時間切れで例外吐くようになるんじゃない?
- >>625
うおおレスありがとうございます!
んー、なるほど。たしかに止まってアクセスを待ってるような感じもします。
なんでNoSuchMethodErrorが出てるのかもうちっと調べてみます。
- >616
CFStringなどはCFReleaseで解放しなければならない
ということではなくて?
>618
リークは0にはならないね。
俺は10KBくらいにおさまれば良しとしてる。
OSのバージョンが上がれば改善されるみたいだし。
10.1ではNSURLHandleとかリークしまくりだったけど
10.2になったら直ったよ。
- ご返事ありがとうございます。
>>627
自分で生成した覚えのないものなので一体なにを解放すればいいのかわらないんです。覚えがないのならば気にしなければいいのかもしれませんが...
>>625
というのはシステムが勝手に生成して解放しないオブジェクトがあるということでしょうか?
やはりObjectAllocを使って調べようとしているのが間違いなのかな。
- >628
CFStringはNSStringの内部で使われてたりします。
NSStringのリリースし忘れでは?
確認ですが、NSAutoreleasePoolは、Javaのガベコレと同等物ではないことはご存知ですよね?
autoreleaseメッセージをオブジェクトに投げると、カレントプールに登録され、
カレントプールがリリースされるときに登録されたオブジェクトに対しreleaseメッセージを投げるだけです。
ですから、カレントループが解放されるときにretainCountが1でない場合、
retainCountが1減るだけで解放はされません。
> やはりObjectAllocを使って調べようとしているのが間違いなのかな。
普通の人はMallocDebugを使います。
- >>629
上に書いたようにNSAutoreleasePool以外に特にオブジェクトを生成していません。main()の中身はあっても無くても変化はありませんでした。
一応retainCountのことは理解しているつもりです。
MallocDebugはウィンドウアプリケーション(?)しか使えないのではないでしょうか?少なくともgcc main.m -framework Cocoaとしてできたa.outは選択できませんでした。
- Qt/MacのGPLバージョンがでるらしいです
http://www.trolltech.com/
- >>630
>MallocDebugは
ループがないと動かない。
main()
{
....something code
while(1);
}
普通のアプリはイベントループがある。
MallocDebugではポインタの上書きしか検出されない、と思う。
ObjectAllocで見れる参照カウントがあるなら、Win32のデバッグ環境
のようにCheckPoint設定してダンプする関数があってもいいのにな。
ライブラリ自体がリークに関してあやしいのか。
- >>628
そういうこと。
例えばNSString *のなんとかNotificationとかがAppKitにはいっぱい定義されてたりするでしょ。
それらはNSStringのインスタンスとして扱えるけど、自分で生成する必要もないし、解放もしない。
それにClassオブジェクトだって解放されないでしょ。
たしか現時点ではBundleはロードできてもアンロードできないんじゃなかったっけ。
つまり実質的にはリークしてるってことだ。どうせページアウトされるし。
- あの、現在テキストエディタらしきものを作っているのですが、分からない
点が有ります。だれか教えて下さい。
分からないのは『タブの長さの設定が可能なのかどうか?』ということのなの
ですが、現在は手動で \t(タブ)を任意個のスペースで置き換えるようにして
います。現在うまく動作していますがこの為だけのコードが出てきてしまい、
体によくありません。
1、ファイル読み込み時にタブをスペースで置き換え
2、タブ入力時にスペースに置き換え
3、保存時に必要な箇所をタブに直す
というふうになりますが出来ればフレームワーク側でできないかな?
と思いまして。。。
- Cocoaはやっぱり!を読んで最近はじめた初心者ですが(Cとかはそれなりに)
ftpなどの対話的なインターフェイスを持つコマンドを、Aquaから
グラフィカルにそうさしつつ、ターミナルは開かないというような動作は
実現できますか?
Aquawget(だったかな)みたいなのを見てると、出来そうな気もするんですけど…
それと、Cocoa初級者むけのメーリングリストとかありましたら(ちゃんと生きてる奴)
教えてもらえると助かります。
- >>634
NSMutableParagraphStyleを用意して、NSTextTabをNSArrayに入れてsetTabStops:でセットする。
んでこのNSMutableParagraphStyleをNSTextStorageとかNSMutableAttributedStringにセットする。
たぶんこの方法でよいと思われる。
Attributeの名前とかはリファレンスのNSAttributedString Additionsとかに書いてあるのでそれを参考に。あとはパフォーマンスとかの問題があるかもしれないので色々実験してみて。
>>635
NSTaskで対話的なものもたぶんできると思う。NSTaskはプロセスを実行して、NSNotificationとかで読み込みを受け取ったりするので、そこらへんを調べてみては。
あとユーザーの入力はstandardInputで与えることになると思うので、NSPipeとかNSFileHandleを使用する。
そして扱うデータによってはNSDataとNSStringの変換とかでエンコーディングの知識が必要になるカモ。あと、文字列を解析する場合はNSScannerが便利。
NSTaskでできなければforkとか使うのかな?
- >>636
レスありがとうございます。
636の方法で方新は見えてきたのですが、NSTextTabの意味が
よく分かりません。今は時間がないのでテストできないのですが
後日調べてみます(よろしければおしえていただけないでしょうか?)。
面白くなりそうです!
- >>633
遅くなりましたがどうもありがとうございました。
objective-cだけの時には気にならなかったのですが、cと混ざったものを
書いているときになにか自分で解放し忘れてるものがあるのではと
思ったのでした。
- なんか昨日から、特定の?文を入れてリターンを押すと
オートインデントが利かないばかりか、tabを押してもタブが入らず、
何度も挑戦しているとかならずProjectBuilderが落ちるようになってしまって
ションボリックリンクなんだけど、これはもうDeveloper toolsの再インストールしかない?
といったところで、インストーラのパッケージを探してみたら、
なんかいつの間にかハードディスクの中から消えてる??
MDD867なんですが、インストーラはどこにあったか教えてもらえませんか?
- >>639
とりあえずADCOnlineにでもなって(もしなってなかったらね)Dec2002と昨日でたDec2002用gcc3.3パッチとセットでDLしたら?
てかその前にpreferencesあたり疑ってみたりインデント外すなりしてみるとか。
Xcodeになってもインデントバグがあったりするとかなり鬱になりそうだけど(汗
- すみません。CocoaJavaのNSImageについて質問なのですが
dissolveToPoint(NSPoint aPoint, float delta)ではOSXに付属のスクリーンセーバのような
なめらかな位置の移動はできないのでしょうか?
NSPointの各座標の値を1.234みたいな値にしても結果は1Pixelずつの移動でした。
なんか根本的な勘違いをしてますでしょうか?
- >>640
ウワァァン、最新版入れてもplist消してもやっぱりインデント設定を入れると落ちるよう
しょうがないからオートインデントなしで書くか…これじゃmiとあんましかわらんね
何が悪いのか皆目見当が付かないところもションボーリ
- あと、ついでに質問なんだけど…
オートインデントを切ったら、tabがスペースに変換されてインデントされるのは
これはどうしようもないことなんですか?
回避方法(tabをtabとして記録する)があれば教えてほしいのですが…
環境設定の「エディタでタブを使う」とか項目をいじってみてもどこが変わったのか
よく分かんないし…助けてくだされ
- >>643
うちはむしろスペースがtabに変わるなぁ。いったいどこの設定だろ
- >>643
「エディタでタブを使う」の設定はプロジェクトの個々のファイルごと
にも設定されてるようだ。cmd+iで情報パレット出してチェック入れれば
ちゃんとtabが入るよ。
- >>645
ホントだ!
情報㌧クスコ!
- 自己解決しました。
drawAtPoint,drawInRectを使用することでうまくいきました。
よくドキュメントを読んでから質問します、、、板汚しスマソ。
- 現在勉強のためCocoaJavaで全画面表示のスライドショーを作っているのですが
OSXに標準のスクリーンセーバに比べて描画速度が遅くて困っています。
NSViewを継承、RunnableをimplementsしたClassを作成して
run()内の無限ループでdisplay()、sleep()を繰り返し処理をしています。
(具体的な描画処理はdisplay()の中で行っています。)
drawInRectの描画面積が広く、クロスフェードで透明度をつけるととても遅いです。
スリープを0にしても遅くてなめらかな動きになりません。
OSXのスクリーンセーバはとてもなめらかに動いてるので
何とか対処できるのではないかと思うのですが解決策が全くわかりません。
やはり全画面描画をするときはObj-cでNSOpenGLViewを使わなければならないのでしょうか?
全画面描画について何かアドバイスよろしくお願い致します。
- 練習で、NSTask から呼び出したコマンド(ls)の出力を、
ウィンドウに配置した NSTableView に表示するものを作ろうと思ったんですけど、
NSTableView にデータを表示させるにはどういう手順が必要なのかいまいち分かりません。
・NSTableDataSource を NSTableView のデータソースとして指定する
・おそらく tableView:setObjectValue:forTableColumun:row: でデータを書き込む
と言うところまでは分かるんですけど…
あれ、"(NSTableView *) tableView" がパラメータとして指定されてるということは
setDataSourceは必要ないということ?
ls の出力結果ということで、改行で区切られた文字列がダラダラと帰ってくるわけですけど、
これを配列に変換したものを、一気に書き込むなんてことはできるんでしょうか?
- >>649
NSTableView の DataSource に必要なのは
-(int)numberOfRowsInTableView:(NSTableView *)aTableView;
-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex;
この使い方は
http://homepage.mac.com/mkino2/cocoaProg/AppKit/NSTableView/NSTableView.html#setValue
このあたりを参照。
あとは、文字列を配列に変換するのに
-(NSArray *)componentsSeparatedByString:(NSString *)separator;
を使ったりすると吉。
- NSMutableDictionaryとNSMutableArrayで階層構造を作っているデータがあるんですが、
全データを丸ごとコピーして新しい辞書を作るにはどうすれば良いでしょうか。
dictionaryWithDictionary:では頂上しかコピーされないし、
再帰でごりごりとコピーするしかないんでしょうか?
あ、ファイルに書き出す、は無しでお願いします(ファイルに書き出せないデータを含むので)
- >>650
うーん、この説明を読んでもさっぱりです…
たとえば myObject にアウトレットを作って、
tableView, tableColumn というアウトレットをそれぞれ
NSTableView, NSTableColumnに接続しますよね、
それでボタンをひとつ用意してそれに対してアクション run: を接続して、
その run: の中でテーブルにデータを入れたいと思ったら、
どのような操作が必要なんでしょうか?
- >>652
ちょっと勘違いしているようで。
CocoaではオブジェクトがNSTableViewにデータを送って、表示するような方法は取ってないよ。
NSTableViewのほうから、「ここのカラムの何番目に表示するのは何よ?」って聞いてくるから、
オブジェクトは「表示するのは@"hoge"」とか返せば、その文字列が表示するって仕組み。
- >>653
むむむ。そうすると、
NSTableView「行数はいくつなの?」 (numberOfRowsInTableView)
オブジェクト「5つだよ」(↑の戻り値)
NSTableView「じゃあじゃあ! hogeの3行目はなに?」(tableView:objectValueForTableColumn:row)
オブジェクト「hogehogeだよ」(↑の戻り値)
って感じですか?
なるほどそうなると、なぜオーバーライドするのかとか
なぜそのメソッドを使うのかとかが分かってきたような気が。
- >654
マルチポスト
警告1
- >>651
ファイルに書き出す一歩手前でコピーすれば良いんじゃないの。
NSCodingで一旦シリアライズしてしまうとか。
- >>655
???
- macosx-dev-jp にマルチポストしてないか?ってことでは。
- しょうもな。
- >656
ファイルに書き出す前の処理です。
NSCodingに対応していないオブジェクトを含んでいてそれをデータから排除したいわけです。
でもメインのデータをいじっちゃうとその後の動作に問題が起きるので、
丸ごと複製してそっちをいじってやろう、というわけで。
設計上の問題といわれればそれまでですが。
- >>655
この人可哀想…。
- >661
同情するなら金をくれ
- >>651
カテゴリを使っちゃうのはどうか。(ObjCだよね?)
@implementation NSObject (RecursiveCopy)
- (id)recursiveCopy {
return [[self copy] autorelease];
}
@end
@implementation NSArray (RecursiveCopy)
- (id)recursiveCopy {
NSEnumerator *enumerator = [self objectEnumerator];
NSMutableArray *copy = [NSMutableArray array];
id obj;
while (obj = [enumerator nextObject]) {
[obj addObject:[obj recursiveCopy]];
}
return obj;
}
@end
@implementation NSDictionary (RecursiveCopy)
以下略
こんな感じで。
でもこれってコピー用の再帰的な関数書くのとあんまり変わらんかもね。
あとinitWithDictionary:copyItems:ってのもあるけど。
- >663
レスサンクスです。
>でもこれってコピー用の再帰的な関数書くのとあんまり変わらんかもね。
こっちの方が再利用がきいてよりオブジェクト指向っぽいですね。
勉強にもなるしちょっとやってみます。
- Objective-Cの質問です。
あるクラス(モデル)のメソッドで、文字列を引数として受け取り、
処理の結果を文字列として返す関数を作ろうと思うんですけど、
この場合、関数の定義はどうするのが一般的に正しいですか?
このメソッドは常に外部のクラス(コントローラ)から呼ばれることが前提です。
- (NSString)hogehoge: (NSString)aString
{
(略)
return aString;
}
のようにすればいいのかな。
オブジェクト指向言語でのプログラミングはほとんど始めてなので
クラスを引数にする時はどうすればいいのかイマイチ分かってないんですけど。
return aString とやると、ポインタか実体かどっちが帰ってくるんですかね。
- 普通は
-(NSString*)hogehoge:(NSString*)aString
じゃないかと思うが。
- ポインタじゃないの
- >>666-667
ありがとー
その後、stringWithString とかの定義を見てたら何となく分かってきたよ
といったところでもうひとつ質問が…。
アホな質問ばかりでごめん…
クラスAとクラスBがあったとして、クラスBの中のメソッドXが、
(メソッドX内で作った)NSArrayのポインタを返すとします。
これをクラスAの中から呼び出す時は、
NSArray *hoge = [ classB methodX ];
とやるのか、それとも
NSArray *hoge = [ NSArray arrayWithArray: [ classB methodX ] ];
とやるのか、どっちなんでしょう?
もしメソッドXが返すインスタンスがそのまま解放されないとしたら、
クラスA側でわざわざ別のインスタンスを作るのは無駄なように思えるし…
- 前者が正解だとは思うが。
>>668 は荻原本あたりで文法を学んだ方が良いかもしれない。
- >>669
ということは、まったく別のクラスの内部にあるメソッド内でインスタンス化された
ローカルオブジェクトが、解放されないまま別のクラスから参照できる、って事?
どこで宣言、インスタンス化されたオブジェクトであっても、それ自体をrelease
しない限りはメモリ上に残り続けるってことで合ってますか?
そして、たとえばクラスBのインスタンス自体が解放された場合、その中の
メソッドXでインスタンス化されたオブジェクトは解放されずに残るのか、
それとも一緒に消えるのか、どっちなんでしょ?(もちろんautoreleaseしてない場合)
萩原本は購入予定には入ってるけど資金不足でしばらく無理…
- >>670
ほったらかしてれば残ります
- クラスBのインスタンスが解放されても
その中のメソッドXでインスタンス化されたオブジェクトは解放されずにメモリ上に残る。
クラスBが解放されてしまっているので、
たとえオブジェクトがメモリ上に残っていたとしてもアクセスできず、
メモリリークということになってしまうが。
- これらの違いが分かれば後は適当で良いような気もする。
@implementation B
-(NSArray*)hoge1{
NSArray *array=[[NSArray alloc] initWithObjects:@"a",nil];
return array;
}
-(NSArray*)hoge2{
NSArray *array=[[NSArray alloc] initWithObjects:@"a",nil];
[array release];
return array;
}
-(NSArray*)hoge3{
NSArray *array=[[[NSArray alloc] initWithObjects:@"a",nil] autorelease];
return array;
}
@end
- >>673
それぞれの違いはだいたい分かる…はず。
autoreleaseは同じイベント処理内(もしくはarpが作られてから破棄されるまで)
はずっと保持されるってことでいいんですよね。
それに対して何も無しはずっと解放しない。
releaseがあるものはその場で解放されるのでnilが返される。
で、合ってますか?
あともうひとつだけ!質問ばっかりですいません
componentsSeparatedByStringを使って、改行で分けた文字列を作るには、
セパレータを 「@"\n"」 ってやるのは間違ってますか?
- ドラッグアンドドロップについて行き詰まってます。。。
NSViewにドラッグアンドドロップするのは出来たのですが、
NSCellにドラッグアンドドロップをしようとして、はたと立ち止まってしまいました。
NSView上にNSCellを複数配置してあって、それらの一つにFinderから
アイテムをドロップしたいのですが、どのように処理すれば良いのでしょうか?
- NSDraggingInfoのdraggingLocationメソッドでどこにdropされたか調べればよいのでは
- >>674
間違ってない。っていうか、プロジェクトを作って実験すればいいだけの話じゃん。
- >>675
どのように処理すれば、の意味がよく分からん。
NSCellをオーバーライドすれば?
- わかりにくくてすいません。
NSViewにドラッグアンドドロップする時はNSViewのinitWithFrame中で
registerForDraggedTypes:メソッドを呼び、PboardTypeを登録しました。
その上で
(unsigned int)draggingEntered: (id) sender;
-(unsigned int)draggingUpdated: (id) sender;
-(void)draggingExited: (id) sender;
-(BOOL)prepareForDragOperation: (id) sender;
-(BOOL)performDragOperation: (id) sender;
-(void)concludeDragOperation: (id) sender;
を実装してドラッグアンドドロップできました。
こんどはそのView上に乗っているNSCellに対してもドロップ処理をしたいのです。
例えると、NSViewがFinderのウィンドウで、NSCellがファイルのアイコンです。
NSCellはマウスでつかんで移動できるようにしてあるので、NSViewにドラッグアンドドロップを
実装した時のように、NSCellに対しても上記のメソッド群を実装してやれば
OKかな、と思ったのですが、NSCellにはregisterForDraggedTypes:がありません。
それで、どうすればよいのかな分からなくなったのです。
長文すいません。
- >674
> releaseがあるものはその場で解放されるのでnilが返される。
これ違う。
勝手にniになってくれるわけない。
- >>674
後半
NSString *LF=[NSString stringWithCString:"\n"];
NSAttay *array=[hoge componentsSeparatedByString:LF];
みたいにするとか。
もっと良い方法があるかもしれない。
- >>681
あれ、@"\n"じゃ問題あり?
汗。
- @"\n" だと \n という文字列になってしまうし。
あと、>>682
×NSAttay
○NSArray
- ごめん、>>682 じゃなくて >>681。
- そういえば、HMDT 本の概要が明らかになってますねぇ。
http://homepage.mac.com/mkino2/books/hmdt.html
Cocoa はやっぱり!や荻原本やヒレガス本などの
先行本の良いところを拾った感じになりそう。
- >>679
そっか、NSCellはNSViewのサブクラスじゃないもんね。
何も考えず適当なレスしてスマソ。
ちょっと調べてみます。
- 実験してみたら @"\n" でいけたよ
どうも他の部分でバスエラってるモヨリ
- 試してみたら、@"\n" でいけますねぇ。
以前、同じ問題で悩んだ時には @"\n" で失敗したので、
>>681 の方法を使ってたんだけど。
- ついでだからもひとつ…
同じクラス内の全てのメソッドが使える配列を作ろうとしたんですけど
@implementation Hoge
NSArray *aArray = [ NSArray array ];
- (IBAction)run:(id)sender.......
って感じにしてみたら、initializer elemant is not constant
って怒られてしまう。
メソッド内で同じものを宣言すると問題なく通るのだけど
何か基本的な間違いをしてますか?
それと、今作ってる練習用のプロジェクト(簡単なやつ)が
意味不明の場所でエラーを起こして落ちてしまうんですけど
どこかに上げたら誰か見てもらえませんか?
デバッガでトレースしてみてもやっぱり意味不明のところで落ちてるような。
- >>678
そうなんですよ。
私もNSCellがNSViewのサブクラスだったらいいなぁと思ってたんですが。。。
解決したら書き込みます。
もうちょっとドキュメントあさって見ます。
- >>689
インスタンス変数でいいと思います。
@interface Hoge : NSObject {
NSArray* aArray;
}
...
そもそも変更不可の空Array作っても仕方がないのでは。。
こういうときはNSMutableArrayを使います。
- >690
NSViewはNSCellの座標を知ってるんだよね。
じゃないとマウスでつかんで移動とかできそうにないし。
だったら、NSViewから適当なNSCellに振り分けすればいいのでは?
NSViewの方にcellAtPoint:を実装、NSView・NSCell両方にNSDraggingDestinationの
メソッドを実装する。
たとえば、NSViewの方のprepareForDragOperation:はこんな感じかな。
- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
{
NSPoint point = [sender draggingLocation];
NSCell *cell = [self cellAtPoint:point];
return [cell prepareForDragOperation:sender];
}
NSViewの方でregisterForDraggedTypes:を呼んでおけば、上のコードが呼ばれて
目的のcellのprepareForDragOperation:を呼ぶことができる。
- >>691
あやや、失礼しますた。書き間違いです。
なんでこんなことがしたいかと言うと、
これ自体がNSTableDataSourceを内包しているので、
スタティック変数(じゃないけど)を参照してセルの内容を返す必要があるんですよ。
んで、あるボタンを押すとその内容が変化するので、その度に毎回NSArrayを
作っているとそのうちメモリが溢れるかなぁと思ったもんで。
- ttp://www.kari.to/upload/source/d/0563.sit
ってことでこれがプロジェクトのディレクトリなんですけど。
余裕があったらぜひとも試して添削してみてくださいませませ。
- >>693
ソースまだ見てないけど、そういう場合は、
@interface Hoge : NSObject {
NSArray* dataArray;
}
で、
-(NSArray*)dataArray{
return dataArray;
}
-(void)setDataArray:(NSArray*)inArray{
if(dataArray) [dataArray release];
dataArray=[inArray retain];
}
みたいなアクセッサメソッドを作りそれを介して扱います。
deallocで[dataArray release]すればきっちり片付きます。
- >>695
??
最初のメソッドの意味が分かんないです。
この例のままだと、変なポインタ返しませんか?
もしかしたら役に立つかもしれないので教えてください。
よく考えたらNSMutableArrayを継承して、データソースのメソッドを持つ
専用のクラスを最初からインスタンス化しておくのが無難かもしれない…
- >>594 のソースを見てみた。
・tableData はインスタンス変数にして -(void)awakeFromNib; の中などで初期化すれば良い
・RunTask クラスを nib ファイル内でインスタンス化する意図が不明
・listView の dataSource は nib ファイル内で指定すれば良いのに
・とにかく一回基本書を買って読んだ方が良い
- >>697
アドバイスありがとー
Cocoaはやっぱり!を読んだだけじゃぁナンニモワカンネーヨ!
ってとこですか。ぐふぅ
次のステップとしては、ヒレガス本か入門Cocoaか萩原本かHMDT本が
あると思いますけどどれがいいでしょうかね。
HMDT本はまだ出てないから候補から外すとしても。
- 入門Cocoaは、他の本に書いてないことがちょこっとだけ載っているので、
ぱらぱらっと立ち読みすることにして、他のを全部買えばいいんじゃない。
どれにしようとか、考えてると結構時間の無駄だし。
- いや、金がないんですよ(萎)
現時点でもっとも実りが多そうな本がいいなぁと…
萩原本かな。
- ヒレガスだろ。
聞いてることはほとんど載ってるような・・・。
HMDTは発売後様子を見てから。
- >>701
萩原本立ち読みしてきたらすごく良さげだったんで、やっぱり両方ですかのう
合計で7000円くらいするよ…あふん
- たしかに萩原本は役に立つ。ちょっとしたリファレンスとしても重宝。
そこらへんHMDTに期待。テキスト処理なんかが詳しく書いてあるとかないとか。
ちなみに、Learning Cocoa -> 萩原本 -> Cocoaはやっぱり! -> ヒレガス本
-> Cocoa Programming の順で買った。
- おこづかいが今、全部で1200円しかないんです。
でも1冊買うとしたら、どの本を買うと良いですか?
- かえませんw
- おこづかい以外の金がある罠
- 本当にそうなら図書館いってみい。
割と大きめの図書館なら大体おいてるし、無ければ「ない」と言えば、結構おいてくれる。
うちの近くの図書館もそんな感じで、妙にプログラム系の書籍が多いぞ。
- 図書館なんて地方地方で事情が全然違う
自慢にもならんが、こっちの図書館には全部ない。
行く度にリクエスト用紙かいてくるが2年間ずっと無視
郷土関係のマイナーな本は山ほど買ってる見たいだけど、いらね
他の図書館から取り寄せてもらっても、貸し出し付加
・・・・・・・・・・・結局全部かいますた
- この前、LaoxMac管でアーロンの本買ったら、手あかで黒くなってやんの。ムカついたよ。
買う本決まってる時はアマゾンで買うと決心した。
- >>709
ばかやろう、その本はなあ、みんなにもみくちゃにされながら
おまえに買われるその時をじっと待ち続けていたんだぞ!
- Amazonでも結局業者の倉庫から出てくるのできちゃない本はありマッスル。
もちろん書店でもみくちゃにされた本が返本されてたのを、ブックカバー換える前に
再出荷することもよくある。
- Cocoa/Javaでソフトを作っていたら以下のようなメッセージが
でるのですが、これの意味(日本語訳という意味ではなく、どう解釈したら
いいのか)がわかりません。どなたか教えて下さい。
2003-07-05 00:01:30.923 SampleProject[5964] *** _NSAutoreleaseNoPool(): Object 0x1ece520 of class NSCFDictionary autoreleased with no pool in place - just leaking
ちなみにいつ発生するかというと以下のような手順で発生します。
ウィンドウにはNSTextFieldとNSButtonが一つずつあります。
1、ボタンをクリック
2、アクションメソッドでちょっと時間のかかる処理を行う。
3、処理終了
4、この時点でウィンドウに対して何か(例えばフィールドに文字書いたり、
ボタン押したり etc)をすると上記エラーが発生する
- >>711
そうなのか。(´・ω・`)ショボーン
- >712
Javaでこれが起こるってことはガベコレのバグかな?
これはObjCでNSAutoreleasePoolと言うクラスのインスタンスがないスレッド上で
autoreleseメッセージを送信したときにでるものです。
まあ、あえてJavaでいえばインスタンス変数にNULLをセットするようなものかな?
最初に書いたようにJavaの場合はガベコレが勝手にやってくれますので意識する必要はまったくないです。
どこかでプロジェクト一式晒してみるか、
Appleに”ガベコレがおかしいぞ!ゴルァ”メールを送るかしないとだめかも。
と思って調べてみたらCocoa/JavaにもNSAutoreleasePoolがあるのね。
いまいち必然性が分からない...
ってことで各スレッドごとにNSAutoreleasePoolのインスタンスを確保してください。
- >>690
ふと気がついたんだけど・・・
ドラッグ関係のメソッドってNSViewに実装されているわけではなくてNSDraggingDestinationプロトコルのものなんだよね。
(NSObjectで採用されている)
だからNSCellでregisterForDraggedTypes無しでもドラッグを受け入れられるのかも?
- >>714
レスありがとうございます。
NSAutoreleasePoolについて調べてみたものの解決しません。
NSAutoreleasePoolのドキュメントに以下のような方法で例の
エラーを回避できると書いてありました。
//--------------------------------Cocoa-Javaドキュメントより
int myPool = NSAutoreleasePool.push();
// Your code here
NSAutoreleasePool.pop(myPool);
//--------------------------------ここまで
しかし、これをどこに記述すれば良いのかがわかりません。
今回自分で新しいスレッドは生成していませんし、、、
とりあえずボタンをクリックされた時のアクションメソッドの最初で
push() して、このメソッドの最後でpop()してみましたが、駄目みたいです。
ほかにもいろいろ試してみましたがどれも解決しませんでした。
やはり、なんらかのバグなんでしょうか?(あまり簡単にバグだと思いたくない
んですよね)
- gcc3.3インストールしても
ProjectBuilder-ターゲット-GCCコンパイラ指定でv3.1とv2.95.2しか選べない・・・
3.3をデフォルトで選ばれてるようにProjectBuilderを設定するにはどうすれば良いでしょうか?
(ふつうにビルドするとヘッダのバージョンについての警告がたくさんでてきて
3.3でビルドになってないっぽい。
ターゲット-詳細設定ビューでCC = /usr/bin/gcc-3.3
CPLUSPLUS = /usr/bin/g++-3.3
GCC_VERSION = 3.x
を追加するとPrefix headerの所で止まってビルドできない。
PREFIX_HEADER=
と、空白にすると
警告も出ず、「ビルドは問題なく完了しました」と表示される。)
- >>717
3.3の付属ドキュメント(PDF)に全部書いてある。
- マウスボタンを押していない時のView内のマウス座標が知りたいのですが、
取得できる座標は画面端からの座標だけなのでしょうか?
Viewやwindowはマウスボタンを押した時にしかわからないのでしょうか?
window1枚にNSView,CustomViewの2枚が乗っている状態です。
- もう一個objCの質問なのですが、音を出したいときこれではダメなようなのですが
どうしていいのか良くわかりません。任意のタイミングで効果音を出したいのですが。
a.h
@interface MyO : NSObject
{
NSSound* s;
}
@end
a.m
#import "a.h"
-(void)awakeFromNib
{
s = [NSSound soundNamed:@"Bang"];
}
b.h
@interface MyV : NSView
{
}
-(void)bangDraw(NSPoint *)p;
@end
b.m
#import "b.h"
#import "a.h"
-(void)bangDraw(NSPoint *)p
{
[s play];
}
@end
- >>720
s = [ NSSound soundNamed:@"Bang" ];
[ s play ];
[ s release ];
を同じメソッド内で処理するようにしよう
- 音を鳴らすことが多いので、playだけを別にしたかったのですが。
スミマセン。呼び出し方が解かってません
a.h
@interface MyO : NSObject
{
NSSound* s;
}
-(void)bangSound(int)playSoundNumber;
@end
a.m
#import "a.h"
-(void)bangSound(int)playSoundNumber
{
s = [NSSound soundNamed:@"Bang"];
[ s play ];
[ s release ];
}
b.h
@interface MyV : NSView
{
}
-(void)bangDraw(NSPoint *)p;
@end
b.m
#import "b.h"
#import "a.h"
-(void)bangDraw(NSPoint *)p
{
[bangSound 1 ];
}
@end
- んじゃ、aとかbとかのサウンドの名前や通し番号を引数で渡すようにしたら
ちょっとは汎用性が高まるけれども。
- >>722
MyVからMyOのメソッドを呼び出そうとしている書き方が間違ってます。
その書き方では呼び出せません。
MyVのインスタンス変数に「MyO *myO;」とか保持させてちゃんと代入すれば、
[myO bangSound:1];
と呼び出せます。あるいは、
NSApplicationのdelegateに音を鳴らすメソッド書いておいて
[[NSApp delegate] bangSound:1];
とか。
あと、soundNamed:で作られたインスタンスは(最初からautorelease
されてるので)releaseしたら駄目。
逆に言うと、ずっと保持していたい場合はretainしなきゃ駄目。
- >>722
わざわざMyOにsを持たせずにMyVで作成して保持すれば良いことだと思うが・・・
>>719
グローバル座標からViewの原点を引けば良いんじゃないの?
- +わざわざMyOにsを持たせずにMyVで作成して保持すれば良いことだと思うが・・・ >>Viewが2つあるんです。
+グローバル座標からViewの原点を引けば良いんじゃないの? >>ありがとうございます、調べてみます。
>>724 修正してみました。
a.h
@interface MyO : NSObject
{ NSSound* s; }
-(void)bangSound(int)playSoundNumber;
@end
a.m
#import "a.h"
-(void)bangSound(int)playSoundNumber
{
if (s != nil) {s = [NSSound soundNamed:@"Bang"]; }
[ s play ];
}
-dealloc { [s release]; [super dealloc]; }
b.h
#import "a.h"
@interface MyV : NSView
{ MyO *myO; }
-(void)bangDraw(NSPoint *)p;
@end
b.m
#import "b.h"
-(void)bangDraw(NSPoint *)p
{
if (myO == nil) myO=[MyO alloc];
[myO bangSound:1 ];
}
-dealloc { [myO release]; [super dealloc]; }
@end
あと、delegateも勉強中なので、試してみます。
- >719
> 取得できる座標は画面端からの座標だけなのでしょうか?
NSViewおよびNSWindowに変換メソッドがあります。
NSViewの場合スクリーンからの直接変換は出来ないようなのでいったんwindowメソッドでNSWindowを取ってきてNSWindowの座標に変換後、
convertPoint:fromView:メソッドでNSViewの座標に変換しなければいけません。
NSViewをカテゴライズして変換メソッドを実装してもいいでしょう。
カーソルの変更のような主導権がユーザー側にある場合は
http://developer.apple.com/documentation/Cocoa/Conceptual/BasicEventHandling/Tasks/HandlingMouseTracking.html
この辺。
でも、ファーストレスポンダーしか反応しないような書き方してるね。
- >>726
それじゃMyVごとにMyOのインスタンスがそれぞれ作られるんで、
>わざわざMyOにsを持たせずにMyVで作成して保持
するのと一緒。
「MyO→s, MyV, MyV」としたいのだろうが
「MyV→MyO→s, MyV→MyO→s」となっている罠
- >726
>myO=[MyO alloc];
myO=[[MyO alloc] init]; ね
MyOに関しては>728の通り。
Cocoa的には
1.MyOをnib上でインスタンス化
2.MyVにMyOのアウトレットを追加
IBOutlet id MyO;
3.nib上でMyVのアウトレットにMyOのインスタンスを接続
ってのがスマートかも。
- cocoaはさっぱりなんで、勉強になります。
>>727 ADCのDocument読んでコード書いてます。
>>728 そんな罠が(´・ω・`)
>>729 InterfaceBuilderでCreateInstanceすることにより、
コード側で[[MyO alloc] init]をなくせました。音も鳴ります。(`・ω・´)シャキ
しかし、初回だけ[s play]でファイル読み込み?で1秒ほど固まるようです。(´・ω・`)
a.h a.m >>726とおんなじ
b.h
#import "a.h"
@interface MyV : NSView
{
IBOutlet id myOutlet;
}
-(void)bangDraw(NSPoint *)p;
@end
b.m
#import "b.h"
-(void)bangDraw(NSPoint *)p
{
[myOutlet bangSound:1 ];
}
-(void)myAction(id)sender// なんとなくoutletとセットで作ってしまった。
{//どうやって呼び出すんだろう?
}
@end
詰まったらまた質問に来ます。ヨロシクお願いします。
- >>730
awakeFromNibというメソッドを調べてみると吉
- >>731
初期処理で音データを一度読み込んでおくというふうに理解しましたが?調べてみます。
>>etc
実際のコードにおとす部分でイロイロ詰まってまして、、また来ます。
- HMDTの本ってオンラインで予約できるサイトないのかな?
出版元のサイトにもトップページのコラム以外に情報のってないし・・・。
- オンラインでないとダメなの?
- 今さらCocoa本はいらん。
もうちょっと前なら欲しかったけど、、、
- >>735
じゃあ、おすすめの本とか勉強方とかを聞きたかったりして。
- >>733
表紙の画像はあるのにISBNコードも予価も書いてないし。。。
原稿が遅れてるんですかね?
20日に出版できるんだろうか。。
誤植いやだから初版は避けたいところだけど、
どうせMac関連の本だし第二版なんて出るのはいつの事やら。
Webで誤植フォローしてくれればいいんだけどね。
- >>736
う~ん、お勧めかぁ。
俺が読んだのは『Jaca&Cocoaプログラミングバイブル』だけなんだよ。
あんまりお勧めはしないけど…。
基本的にドキュメント読んで、いろいろ試してれば分かるでしょ。
どの本読んでも内容は一緒に見える。
ただ、Obj-Cの勉強をしたいなら話は別かもね、俺はJava使いだから。
- Cocoaはやっぱり!が復活age
http://www.big.or.jp/~crane/cocoa/
- HMDTとの差別化に苦労してるな。
- とあるクラスのソース内で、メソッドの中括弧の外で宣言した変数は
同一クラス内から自由に参照できますよね。
とすると、そのヘッダで、
@interface Hoge : NSObject
{
// この部分
}
ここで宣言した変数はどういうことになるんでしょうか?
外から見えるようになるんですか?
- >>739
を、ほんとだ。トップからはリンクなさそうだけど(つーかフレームのメニューが固定だから狭い画面なんで見落としてるかもしれんが)。
まだメインの記事は復活したわけじゃないし、740の言う通りHMDTとの差別化に苦労してるっぽいね。
今後どうやってくのかちと様子見(ほれ、PB(そのうちXcode)とIBの使い方はここ見れって言えるサイトに戻るといろいろと楽なんだが)。
#正直blogだけだとゴミ決定だったけど、これで見れるサイトに戻ったな。
- >>741
1.メソッドの中括弧の外で宣言した変数
Cのスコープが適用されるのでグローバル扱いのハズ
2.@interfaceの中
objective-cには、
@public
@protected
@private
の予約語があります。
デフォルトは@protectedです。
-
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
- NSSoundで、曲と効果音を同時に鳴らせますか?
-
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
- 良スレ保守ageぽ
- 発売延期アゲ
- Cocoa環境で使える、質が良くてそこそこ高速な乱数生成は、どれを使うのがいいかな?
- >>749
C言語のsrand( time(NULL) )と、rand()関数使え。
- >>750
rand()なんて質の悪い関数使えないっす
- >>751
あそ。
そこまでの質を求めて何したいのかはわからんが、
MT法を使えばいい。
- なんで逆ギレされんのかわからん…
- いやキレてないわけで・・
- というか、逆ギレの使い方が間違っているわけで・・
- そもそも、そういう事を議論するスレではなくて・・・
- 使用目的または評価方法について書かれていない限り
質がいいかどうかなんて他人に判断しようがない。
だから、一番お手軽なrand()を教えてくれたのに
「質の悪い」なんて言い返した751が悪い。
ちゃんとどの程度の質を求めているか書けばよし
- randを知らんプログラマーなんているのか
- >>758
居るんじゃない?
というかこの話題もうそろそろやめたほうがいいでしょ。
- http://home.jp.freebsd.org/cgi-bin/showmail/FreeBSD-users-jp/69444
このへんのスレッドが参考になるかも
- WebKitSDKが落とせないなー。
- Japan以外なら落とせたー。
- HappyMacintoshDevelopingTime買ってきたけど、読みにくいな。
C言語をマスターしてるのが前提なのにメモリのアドレスとか、ヘッダ
ファイルとは・・・、とか無駄な説明が多い。1~3章は要らない。
校正も残念ながら不十分で、おかしな日本語や図の貼り忘れとかがある。
説明もあまり適切ではない。読むんなら4章以降でしょう。
ウェブサイトの方は簡潔なのにね。本だとむずかしいのかな?
- 読んでないから中身についてはなんとも言えないけど、
むしろ「プログラミングをやったことが無い人にも
読めるように作った」とか書かれていなかったっけ。
- >>764
そうなんだけど、多分、そういう人が読んだら3章までで挫折すると
思うよ。それにObjective-Cを使うためにはCがわからなければ無理
だから、全くプログラムを組んだことがない人、ってことはありえない。
Cocoaの初心者という意味だと思う。
1~3章は入れないほうが良かったと俺は思う。
- さすがにCの教科書はたくさんあるから、省いてもいいとは思うけど。
第2版は出ないだろうから、ミスはミスのままか……
作者のサイトでエラッタがでればいいか。
- >>763
で肝心のCocoa部分はどうよ?
- >>767
まだ5章読んでるとこだから何とも言えんが、4章からはOK。
- setDoubleAction: でダブルクリックの際の動作を指定してあるNSTableView に
addTableColumn: で動的に NSTableColumn を追加した場合、
追加した NSTableColumn の部分だけダブルクリックに反応しなくなるという問題で困っています。
恐らく、NSTableColumn を追加する際に何か設定を見落としているのだと思いますが、
それが何なのか分かりません。
この問題について、どなたか解決策をご存じの方はおられないでしょうか。
ちなみに、問題の生じているプロジェクトは以下のようになっています。
http://www.geocities.co.jp/SiliconValley-Bay/5171/tablecolumnsample.dmg.gz
- >>769
NSTableColumnがeditableということはありませんか?
- [tableColum setEditable:NO ]
で、入力側にDoubleClickを奪われなくなるなり。
- >>770-771
まさにそれが原因でした。
何かに反応するには editable = YES だろうと勝手に理解していたのですが、
どうやら editable の意味を取り違えていたようです。
ありがとうございました。
- NSMenuあたりについて質問させて下さい。
今、サンプルでステータスバーのメニューにフォルダを登録して
メニューから任意のファイルやフォルダを開けるように
したいと思っています。
しかし、サブメニューを持つNSMenuItemはアクションを設定しても
実際にはアクションがおこりません。なぜなのでしょうか?
NSMenu rootMenu = new NSMenu();
NSMenuItem item1 = new NSMenuItem("item1", action, "");
NSMenu submenu = new NSMenu();
item1.setSubmenu(submenu);
submenu.addItem("item2", action, "");
submenu.addItem("item3", action, "");
こうするとitem1でアクションが起こりません。
なにか、間違っているのでしょうか?
あと、NSMenuItemの setMenu() と setSubmenu() の違い(意味?)が
よく分かりません。だれかご教授おねがいします。
- >>773
通常は MenuItem を選択した場合に action が呼ばれるわけですが、
MenuItem に SubMenu のある場合は、
選択しても何もしないのが正しい挙動なのでは?
あと、NSMenuItem の
setMenu は親メニューを登録する場合に使い、
setSubMenu は子メニューを登録する場合に使うものではないでしょうか。
リファレンスでは setMenu は呼ばないように注意されていると思います。
- >>773
言いたいことはわかる。
>>774
>選択しても何もしないのが正しい挙動なのでは?
動的作成(というよりオンデマンド)メニューを作りたいからで、
サブメニューからアクション(コールバック)されてメニュー構築
をしたいということでしょう。
Obj-Cで試したことあるけどできないんだよ。
- (void)submenuAction:(id)sender;がコールバックされない。
ドキュメントでは、メニューがオープンされるとき呼ばれるとあるんだが。
たぶん、バグでしょう。分かる人いたら教えて!
他の人たちは、Carbonでやっているはず。
- >>775
submenuAction:は使ったこと無いけど、メニューのオープンならNSMenuのupdateメソッドで拾える。
- >>774-776
返事ありがとうございます。
なるほど、基本的には出来ないのが”仕様”ということですね。
>他の人たちは、Carbonでやっているはず。
そうなんですか、、Snardみたいなことをしたかったんですが、残念です。
でも、出来ない事が分かったので、別の方法を検討してみます。
重ね重ねサンクスです。
- こういう場合普通、変動がある度にメニューを更新しておいて
プルダウンされる時には既に更新されたメニューにすり変わってるんではないのかな?
まあ、snardを知らないわけだが。
- なぁ、macosx-dev-jpってやたらとスルーされる質問が多いと思わないかい?
- どんな質問?
スルーされた質問をコピペしてみ、解かることなら答えるよ。
ところで、macosx-dev-jpってどんな雰囲気なんさ?
- いや、漏れの質問ってわけでもないけどさ、
答えられるだけの技量を持った人が少ないのかなぁ…
まぁ漏れは答えられないから黙ってるんだけどさ。
雰囲気としては、普通の技術系MLと同じような感じで大人しいですよ。
- >>778
いや、普通はメニューバーのメニュー項目がクリックされた時に
メニューを再構築するんだと思う。その延長で、サブメニュー
のあるメニュー項目がクリックされた時に、再構築しようって
ことになったのだと推察。
最初にサブメニューも含めて再構築するしかないのではないか?
階層構造深くてそのタイミングで一気に再構築だと時間かかる
のであれば、778の言うようなやり方するか。
- >>782
質問者は単にフォルダ(=サブメニューあり項目)を選んだら
Finderで開きたいだけのような気もする
- >>781
雰囲気今は枯れてるのだが、一時期FinderのUIがどーのでフレーム湧きまくりでおおむね逃げちゃったんじゃないかな?>答えるような椰子。
そういう罠はある。ま、MLワチスレで確認してくれ。
- >>784
技術系MLって、なぜかどこもそういう話題で荒れたり感情的になったりするよね。
個人への批判やたしなめの文章をML宛に送信したりとか。
実はアホが多いのかな。
- >781
パスワドのことなら、あれ答えるのが難しい。
MacOSX的には「KeyChain使え」何だけどCocoaフレームワークに入ってないから薦めにくいんだよね。
しかも使い方覚えるまでが地獄だし。
かといって「DEC(crypt)使うのが普通」ってのもなんだかなあって思うし。
んでも「MD5ハッシュでもいいよ」って答えるのも違う気がするし。
っていうのを誰かポストしてくれればいいなーなんて夢想してみる。
- >786
夢想してないで、そのままMLに投げちゃえば良いべさ。
全員が均一なスキルを前提としたような、クロ-ズドなMLじゃないよね?
質問者の書かなかった行間を(勝手に)補完してみたり、派生する(技術的な)余談を振った方が
面白いと思うんだけど。
答える人を暗に固定していってしまうと、発言できる・できないの閾値が
自分のストレスになるよ。
ストレス溜めておくと、フレームが燃えた時に参加したくなるから(w
- >>783
正解です。
結局今のところフォルダを表すメニューの子メニューに
『***(フォルダ名)を開く』というメニューを持たせることにしました。
多少操作性が悪くなるけど。。。
- >>788
CarbonのChangeMenuItemAttributesで、kMenuItemAttrSubmenuParentChoosableを
指定やればできると思います。
ちょこっとやってみたところ成功しました。
ただ、今やってみたところ、nibファイルで作ったメニューには効くんですが、
プログラムで作成したメニューに対しては効きませんでした。。。なんで?
プログラムで作ったってのは、ステータスメニューアイテムを作成して
その中のメニュー項目にたいしてなんですが、なんで効かないんでしょう。。。
-
クリックできるメニューとできないメニューの表示区別が無いのに
>サブメニューのあるメニュー項目がクリックされた時
に選択されるというUIは、激しく気持ち悪い。
- >>789
Carbonなら出来るみたいっすね。
俺、Carbonは全くわからないんすよ。
すいません。
とにかく、情報ありがとうございます。
>>790
そうですか?
いや、そうかもしれないっすね。あんまり考えた事無かったです。
でも、メニュー自体がディレクトリを表すので逆に直感的かな…と。
フォルダのアイコンをメニューにつけたら少しは気持ち悪さが
減りますか?(そういう問題じゃない?)
- HMDTの記事を参考にして、Cocoaアプリケーションにホットキーの機能を付けようと思うんですが、
HMDTの記事どおりにやっても、エラーが出てアプリケーションが起動しません。
targetの設定で作成したNSApplicationのサブクラスを主要クラスに設定し、
File's ownerのカスタムクラスも作成したNSApplicationのサブクラスに設定してあります。
エラーの内容に
Creating more than one Application
とあるので、どこかでNSApplicationを複数作成してしまっているようなのですが
コードを見直してもそのような記述はありません。
どなたか解決策をご存じの方はいらっしゃいませんでしょうか?
- HMDT の記事を参考にしたのであれば、
HMDT のサイトの BBS で直接聞いた方が早いんじゃないかと思うが。
-
>>792
「ホットキーを登録する」の記事のことだったら、その記事には
詳しい解説があって、
サンプルソースのプロジェクトまで置いてあるみたいだけど。
動いているコードがちゃんとあって、Macがエラーまで指摘しているのに
これで、まともな質問すらもできない奴の
「解決策」なんて、ひとつしか無いとおもわれ。
- "Learning Cocoa with Objective-C 2nd Edition"
初心者向けにイイよー。初版とはまるっきり別の本だ(w
- >>794
もちろん解説も読みましたし、サンプルコードも見ました。
動いてるソースと自分のソースを比べて異なっているのはもちろん
自分のソースにはいろいろと他の処理が入っていることです。
その上で、"Creating more than one Application"というエラーが出るので、
上記のようにどこかでNSApplicationを複数作成してしまっているのでは?と推測しました。
作成したNSApplicationのサブクラスには-initや、+sharedAppliccationといったメソッドも
HMDTの通り、実装してあります。
一応どこかでNSApplicationの+sharedApplicationが呼ばれてしまってるのでは、と思い
カテゴリで自分の作成したNSAplicationのインスタンスを返すように
NSApplicationの+sharedApplicationを上書きしてあります。
自分の書いたコード中で明示的にNSApplicationを作製している箇所はないので
なぜなのか分からない、ということでこちらで質問させていただきました。
確かに長くなるので説明をはしょってあります。上記説明でもはしょってます。
>まともな質問すらもできない奴
で申し訳ない。
>「解決策」なんて、ひとつしか無いとおもわれ。
そう言われちゃしょうがない。
>>793
そうなんですが、こちらの方がいつも利用しているし、返答も早いだろうと思い
こちらに書き込みました。でもおっしゃる通りですね。
今あちらにポストするとマルチになるのでもうしばらく調べてみます。
もし、同じような箇所ではまった方いらっしゃったら情報いただけるとうれしいです。
- NSApplication のサブクラスの +sharedApplication で
既にインスタンスを作成してある場合は改めて init を呼ばないようにしてあれば、
他の場所でいくら +sharedApplication を呼んだところで
"Creating more than one Application" が出るはずないと思うが。
- >792,796
インスタンス作ってる部分が被ってるだけだと思うが、、、正直質問が掴めん。
>795
推薦文でも書いてくれ
でも、初版と比較するから良くみえるんじゃねえの?
>794
毒吐いてないで、アドバイスしてやれよ。
でも、
|他人からパクッったコードと自分のコードを混ぜたら動きませんでした。
|おれさまのコードは(漠然と)動いていたので悪くないです。
|何とかしてください。
っていう香具師を思い出したのは確かだけど(w
- >792
えーとHMDT見てないので適当に
> targetの設定で作成したNSApplicationのサブクラスを主要クラスに設定し、
> File's ownerのカスタムクラスも作成したNSApplicationのサブクラスに設定してあります。
この場合、
int main(int argc, char* argv[])
{
NSApp = [[AppsSubClass alloc] init];
.......
}
てのが必要だとADCのドキュメントに載ってた気がする。
- オブジェクトの解放に関する質問なんですが・・・
オブジェクトAの中でオブジェクトBを生成します。
オブジェクトBは一定時間待ってオブジェクトAのメソッドAを呼び出して任務終了です。
この場合オブジェクトBの生成時にretainしないでほったらかし
(というか[[[B alloc] init] autorelease])
にして、作業完了したら勝手にいなくなってほしいのですが、
どのようにすれば良いのでしょうか?
メソッドAでreleaseすれば良いわけですが何となくスマートじゃないような気がして。
やっぱ自分で自分をretain,releaseするのは反則なんですよね?
NSTimerなどはどのようになっているのでしょう?
ちなみに「一定時間待って」というのはあくまで例でして、NSTimerを使え、というのは無しでお願いします。
- >>800
質問の意図が全然わからん。
AがBを作成し、
BはAを利用。
Bが作業完了したら、もういらない。
AはBを保持したくない。
ってことだね。Bの作業完了ってのはBのその作業をする
メッセージを呼ぶ奴が誰かいるわけだから、その作業を
要求したやつがリリースすればよいのではないかと思うが。
それと、その間EventLoopから抜けないのであれば、
NSAutoreleasePoolが開放されないから心配いらないし。
どっちにしろ、何がやりたいのかもう少し具体的に説明すれ。
- 質問が抽象的すぎましたね、すみません。
えーとですね、BはGUIのコントローラです。
Aでボタンを押されるとパネルを表示して、ユーザがボタンを押したらAに連絡します。
ものすごく簡単に言えばアラートを表示してOKを押させるだけのクラスです。
もちろんAの中でやりゃすむ話ですが、いろいろ使いまわししたいので別クラスにしたわけです。
なもんでパネルを表示したらEventLoopから抜けてしまいます。
うーん、やっぱりAが保持すれば良いだけのことですかねえ?
パネルを表示するのを専用のクラスでなくてNSAppでやっているのが不思議だったんですが、
もしかしてそこら辺の事情もあるんでしょうか?
- >>802
用が済んだら勝手に居なくなるという動作で言えば、
autoreleaseしている時点で「いつか勝手に無くなります」。
それはイベント処理の終わり(デフォルト)かもしれないし、
自前で作ったARPを解放した時かもしれないけれど、
とにかくいつかは解放されます。
ということで、希望通りの動作をしていることになります。
もしもう使わないことが決定した時点で解放したいのなら、
autoreleaseを使わずに、[ [ B alloc ] init ]で生成して、
不要になった時点で自分でreleaseする必要があります。
ARPに登録したインスタンスをretainせずにreleaseした場合は
実行時にエラーが出ます。
具体的に言うとARPが解放された時点で、存在しないインスタンスを
解放しようとして怒られます。
- 返事が無いみたいだけど、>>802タンは理解してくれたかなぁ…?
オーナーシップ・ポリシーの考えに従うと、
オブジェクトを生成(alloc)した人(今回はオブジェクトA)が責任を持ってreleaseしないと
いけないことになっています。
だからAが生成したインスタンスBを、Aが解放するのはごく普通のことです。
その手間を省くのが、autoreleaseということです。
- >>802
NSDocument と Document Window のような関係の
NSDocument 側を生成&消滅させたいってことですね。
まずPanelはModeless Windowですか?
私の場合は、ControllerをPanelを定義するnibでインスタンス化
させてしまいます。そうすると生成&消滅するタイミングを気に
する必要がありません。この方法の欠点は、生成するだけの役割
のクラスがそのnibのFile's Ownerになってしまうってこと。
あとは、そのパネルの終了時のNotificationをクラスAなりNSApp
なりで受け取って、消滅させる。でもその場合にはそいつがクラス
Bのインスタンスを保持していないとだめか。
自分自身に終了ボタンが押された時に自分自身にreleaseか
autoreleaseを送りたくなりますね。
でも、それはクラスAが生成してクラスBが消滅させるっていう
のが嫌っぽい。誰もが納得する正解はちょっと思い付きません。
- レスありがとうございます。
>>803,804
オーナーシップポリシーは一応理解できているはずです。
現状はAでBをretainして、Bが作業完了してAを呼んだ時、Aがsenderをreleaseという方法でやっています。
ただAはBを生成して走らせるだけであとは完全にノータッチなのでもう少しスマートな方法は無いかな、と。
>>804
>NSDocument と Document Window のような関係の
>NSDocument 側を生成&消滅させたいってことですね。
うーん、このたとえでいうとむしろWindow側だと思いますが・・・
NSDocumentがまず存在してそいつがGUIを作るんですよね?
繰り返し気味ですが、目標はNSTimerです。
あいつはscheduledTimerWithTimeInterval...で作成すると、retainしなくてもちゃんとfireまで生きていて、repeats:NOであれば自動的に退場してくれます。
でもBは単純にautoreleaseしちゃうと、パネルを表示してユーザの反応待ちになった時点でイベントループから抜けてreleaseされてしまうので困っているんです。
NSTimerはいったいどうやっているんでしょうかね?
>自分自身に終了ボタンが押された時に自分自身にreleaseか
>autoreleaseを送りたくなりますね。
>でも、それはクラスAが生成してクラスBが消滅させるっていう
>のが嫌っぽい。誰もが納得する正解はちょっと思い付きません。
そうなんですよ。
なんか抜け道みたいなものがあるのかと思ったんですが・・・
無いようなら普通にAに解放してもらうことにします。
- ちょっと話が前後してしまいますが・・・
>私の場合は、ControllerをPanelを定義するnibでインスタンス化
>させてしまいます。そうすると生成&消滅するタイミングを気に
>する必要がありません。この方法の欠点は、生成するだけの役割
>のクラスがそのnibのFile's Ownerになってしまうってこと。
これってFile's Ownerはautoreleaseしちゃうんですか?
で、宙ぶらりんになったControllerをNotificationを捕まえてreleaseするということでしょうか?
でもFile's OwnerをreleaseしちゃったらControllerも消えますよね・・・
Contorollerを生成するクラスを間に挟むのはどういう意図なんでしょうか?
私はControllerをPanelのnibのFile's Ownerにしていますが・・・
アルファベットばっかりでわけ分かんないですね。(^^;
- >806
> 繰り返し気味ですが、目標はNSTimerです。
> あいつはscheduledTimerWithTimeInterval...で作成すると、retainしなくてもちゃんとfireまで生きていて、>repeats:NOであれば自動的に退場してくれます。
あれはちょっと違う。NSRunLoopが一枚かんでます。
内部的にどうなってるか詳しくは調べてはいませんが、
1,NSTimerインスタンスを生成。
2,カレントランループに1を登録。(ここまでがscheduledTimerWithTimeInterval...内)
3,カレントランループが時間に到達したNSTimerオブジェクトにfireを送信。
4,NSTimerオブジェクトがfire内でrepeatを調べ、NOなら自身をinvalidate。
5,カレントランループがinvalidateされたNSTimerオブジェクトをrelease。(っていうかNSArrayから削除してるだけかも)
ていう流れです。
NSTimerは自身をinvalidateするだけで実際に解放するのはNSRunLoopってことです。
(解放と言うかオーナーシップの放棄ね)
- >>807
>これってFile's Ownerはautoreleaseしちゃうんですか?
そうです。っていうか、File's Ownerは自分でreleaseしてしまいます。
>で、宙ぶらりんになったControllerをNotificationを捕まえてreleaseするということでしょうか?
で、Controllerはなんもしません。Notificationっていうのは別のアイディア。
>でもFile's OwnerをreleaseしちゃったらControllerも消えますよね・・・
>Contorollerを生成するクラスを間に挟むのはどういう意図なんでしょうか?
>私はControllerをPanelのnibのFile's Ownerにしていますが・・・
ちょっと、誤解されているようです。
MyFactoryClass/MyControllerを独自に作って、nib上には
File's Owner = MyFactoryClass/FirstResponder/Panel/MyController
があるようにします。MyControllerはIBのインスタンス化で作ったものです。
プログラム中からは[[MyFactoryClass alloc] init];して、
MyFactoryClass中でloadNIbNamed:owner:します。
Panel/Controller作ったら、MyFactoryClassはいらなくなるのでrelease。
nibで作ったインスタンスの廃棄処理はプログラム的には気にしなくて
よかったのですよね?だからControllerは必要な限り存在しているし
必要なくなったら破棄されるってことでやっています。
苦肉の策なのでもっと良い方法あれば私も変えたい。
- あの、盛り上がってるところ申し訳有りませんが、
質問させて下さい。
Cocoaアプリのinfo.plistのNSBGOnlyに1をセットすると
ドックにドックを表示せずに起動出来ますよね。
しかし、こうして起動したアプリケーションに対してキー入力
が出来ません。これはこういうものなのでしょうか?
例えばテキストフィールドに文字入力が出来ない。
Command + W でウィンドウが閉じない…等。
これは仕様なのでしょうか?
アプリケーションがアクティブにならないからキーイベントを
受け取れないというのであれば納得できるのですが、出来たら
受け取りたいです。良い方法は無いでしょうか?
それともバックグランドアプリで文字入力はタブー??
- >>795
そんなにがらっと変わったんだ。
初版買っちゃったんだよな~。うかうかしてる間に日本語版とか出てるし(死
でもあんまたいした事なかったんだよね、あれは。
O'Reillyの新刊もそう考えるといいのかなぁ。
- >>810
NSUIElement
- >>808
ほほう、NSRunLoopが管理してたんですか。
勉強になりました。
そう特殊なことをやっているわけではないんですね。
>>809
>nibで作ったインスタンスの廃棄処理はプログラム的には気にしなくて
>よかったのですよね?
え、そうなんですか?
ウィンドウが閉じられたらnib上のインスタンスが全部解放されるとか?
(そういわれてみるといままでもそうだったのかな)
それならBをnibでインスタンス化しておいて、
FactoryClassを作成してすぐにautoreleaseで良いのかも。
作業が完了したら自分でパネルを閉じるので、
そこで(そのうち?)nib上のインスタンスは全部解放してもらえる、と。
よく分からないんで、あとでテストしてみます。
- >>812
サンクスコ!
最初クラス名かと思って探しちゃいました…。
思ってた事が出来ましたよ( ´Д⊂ .... メグスリ タゾ. ゴルァ゙
- >>813
>ウィンドウが閉じられたらnib上のインスタンスが全部解放されるとか?
Nibの読み込みにNSWindowControllerを使うとそうなる。
NSBundleから読み込むと自分で解放する必要有り。
……と、DevTool付属のドキュメントに有ったと思う。
- http://developer.apple.com/documentation/Cocoa/Conceptual/LoadingResources/Concepts/NibFileLoaded.html
これの後半部分だね。
- >>815,816
おおー、なるほど。
そういうことでしたか。
WindowControllerはまだ良く分かってないんでちょっと読んでみます。
どうもです。
そういえばヒレガス本かなんかでもこれ説明されてるんですよね。
今度立ち読みしときまふ。
- >>815,816
ありがとん。自作プログラム修正しなくちゃ。
- 質問です。
ドロワーってユーザーが自由に大きさを変えられますが、これの大きさをAutoSave
するにはどうすればいいのでしょうか。
NSWindowの、-setFrameUsingNameみたいなのもないみたいですし・・。
- AutoSaveは無理なんじゃないの?
自分で保存しようよ。
大した手間じゃないし。
- 今JAVAでCocoa用のライブラリを作ろうとしてるんですけど、
ProjectBuilderでプロジェクトを作らずに普通にCocoaライブラリに
クラスパスを通してコンパイル-テスト(JUnit)を行うとコンパイルは普通に
通るのですが、テスト時に _NSAutoreleaseNoPool() エラーが多数出力されます。
それでもテストには成功するのですが、精神衛生上よろしくないっす。
多分正常な(Cocoaが内部的にやってくれている)処理を踏んでいないので
起こるのだと思われます。解決方法は無いものでしょうか?
どなたか、Cocoa-Javaライブラリを作った方いましたら体験談
が聞きたいっす。
- (^^)
- >>821
>通るのですが、テスト時に _NSAutoreleaseNoPool() エラーが多数出力されます。
よくわかりませんが、そのライブラリの入り口で
NSAutoreleasePool.push();
出口で
NSAutoreleasePool.pop();
してやればどうでしょうか?
- 現在Macがインターネットに接続されているかどうか調べるにはどうしたら良いんでしょうか?
Cocoa、Carbonどっちでもいいんですが
- >824
NSTaskでPingを使ってみたら?
- 以前は変数はメソッドの先頭で宣言でしなくてもエラーにならなかったのに、
いつの日からかparse error before '*' と出るようになりました。
NSString *string;
NSLog(@"test");
string = @"string";
は問題ないのに
NSLog(@"test");
NSString *string = @"string";
だとエラーになります。なぜだか分かる方いないでしょうか?
- >>826
そういうもんです。
変数の宣言は必ずメソッドの最初でやるべき。
なぜと言われてもコンパイラのバージョンが挙がったからでないの?
別にNSLogの順番が変わったところで対した問題でも無し。
- >>827
そういうもんなんですか... いつからこうなったんでしょう。
僕みたいな初心者が参考書を見ながらプログラムする時困るんじゃないだろか。
- どこでも好き勝手なとこで変数がでっち上げられちゃうほうがよほど困るよ
Perlとかな
- >>827
> 変数の宣言は必ずメソッドの最初でやるべき。
この仕様もどうかと思うんだけどね・・
変数の宣言が集中しちゃってややこしくなっちゃう。
- 一時的に使う変数を最初に宣言するのが嫌なら、
その一時的に使うルーチンを別の処理単位に分けたほうがいいよ。
メモリの動的管理という意味からも、そのほうがいい。と、思う。
- >>825
gcc3.3 (Dec2002gccUpdater) 入れてない?
デフォルトコンパイラが gcc3.3 になってると、Project Builder が gcc2.95
を使うようになって、ISO C99 の拡張が無効になる、ということみたい。
とりあえず、
gcc_select 3
すればよい。詳しくはアップデータ付属のドキュメントを読む。
- >>830
メソッドの途中でしか使わない変数は、中括弧で囲ったブロックの中に閉じこめれば
いいと思うけどな。
下手に処理単位を分けると却って引数の受渡しでごちゃごちゃする怖れもあるし、
この方法が個人的には気にいってる。
- >>824
TechNote 1145が参考になるかと思います。
原理はEntpointを作成してみて確認するという
無理矢理な方法で確認しています。
それか、System Configuration Frameworkのドキュメントを見て下さい。
原理はやっぱりDynamic Storeに有効なIP Addressを持つものが
あるかどうかを調べると言う、
やっぱり無理矢理だなあという方法を使っています。
Jaguarだとこれが限界ではないかと思います。
- >>825,834
レスサンクスです&遅レスすいません
ストレートに調べることはできないみたいですねえ。
API一発で調べられるのかと思ってたんですが・・・
何も考えずとりあえずつないでみるってのが一番手っ取り早いのかもしれませんね。
- "Learning Cocoa with Objective-C 2nd Edition"で勉強している所ですが、
初版と比べてやっぱりずいぶん分かりやすくなってますね。
Currency Converter Tutorialのくだりは初版ではわかりにくかったのが、
ずいぶん説明が整理されて、ワシのようなド素人でも
何とかなるレベルになってました。
英語で文献を読める人なら、お勧め、って感じです。
-
- マルチウィンドウなアプリを作る場合にですね、
新しいウィンドウを動的にいくつも生成したいわけです。
この場合、Interface Builderではどのようにすれば、実現できますか?
同じnibファイルに新しいウィンドウとして作ると、最初からインスタンス化されたままに
なりますよね?
あと、他のアプリを覗いてたら、複数のnibファイルに別れてるんですけど、
これはどうやって読み込むんでしょうか?
- 一般的な、ファイルの中身をウインドウに表示するものなら
プロジェクト新規作成時にDocument-basedを選べば良い。
- >838
>あと、他のアプリを覗いてたら、複数のnibファイルに別れてるんですけど、
>これはどうやって読み込むんでしょうか?
NSBundleのloadNibNamed:owner:
- うーん、画像ビューワーなんですが、画像を表示するウィンドウの他に、
操作用のウィンドウ(これが本体)が必要なんですよ。
そういうのって Document-basedでいけるんですかね。
- NSWindowControllerのinitWithWindowNibName:のが適当じゃない?
- >操作用のウィンドウ(これが本体)
所謂、「インスペクタ」だと思っていいのかな?
MainMenu.nibでユーティリティウインドウを作ってもよさげな感じがするけど。
- >>842
それっぽいです。助かります。
>>843
そうかもしれませんけど、私にはそれが何か良く分かりません…どうもすいません。
ところで、Document-basedでのアプリの作り方がまるで分からないんですが
別に使わなくても出来そうな気もします。どうなんでしょう?
- >>844
> 別に使わなくても出来そうな気もします。どうなんでしょう?
使わなくても出来るけど使ったほうが楽チン。
- うーん、HDMTやらよしきを見て見たんですけど、
今のところとりあえずQuickTime(OSかな?)が提供してくれてる画像ルーチンを
使えればいいので、Document-basedだとファイルタイプとか拡張子とか確認して登録するのが
面倒くさい分不利な気がしてきました。
ということで今回は普通のCocoaアプリとして作ったほうが面倒が少なそう…
- >846
QTが再生できる全フォーマット用のファイルタイプがあったはず!
でも忘れた(泣
- だ、ダメじゃん…w
どうでもいいけど、PICも展開できたらいいかなと思って
「PIC 稲妻展開」で検索したらX68kへの愛が感じられるテキストがヒットして
泣けてきましたよ。
- Interface Builderで、ウィンドウのサイズが一定より小さくならないんですが、
これはIBの仕様なのかOSの仕様なのかどっちなんでしょう?
この限界を突破してもっと小さいウィンドウを作りたいんですがどうすればいいですか?
- サイズの最小を変更しよう!
そうしよう!
- NSTextField に入っているのが、文字か数字(整数)か判別したいんですけど
決まったやり方みたいなのはあるのでしょうか?
今はintValueで返って来た値をみて、0が入っていた場合や
全角の数字が入っていた場合を始めに振り分けた上で判断するしかないのかな
と思っているのですが・・・
- もっと良い方法があるだろうと思いつつも NSCharacterSet を使った方法。
-(BOOL)isIntegerString:(NSString*)string{
NSCharacterSet *set=[NSCharacterSet decimalDigitCharacterSet];
int i;
for (i=0;i<[string length];i++) {
if ([set characterIsMember:[string characterAtIndex:i]] == NO) return NO;
}
return YES;
}
NSCharacterSet の使い方がいまいち分からないです。
- >>851
NSScannerのscanInt:を使いましょう。
- NSScanner の scanInt: だと、
例えば @"10a" といった文字列の場合に YES が返ってくるような気もしますが。
- >>854
YESが返ってきますね。失礼しました。
では、こんな方法でどうでしょう?
-(BOOL)isIntegerString:(NSString*)string{
NSCharacterSet *set=[NSCharacterSet decimalDigitCharacterSet];
NSScanner *scanner=[ NSScanner scannerWithString:string ];
if([ scanner scanCharactersFromSet:set intoString:nil ] && [ scanner isAtEnd ]) {
return YES;
} else {
return NO;
}
- >851
何をするために判別するのでしょう?
目的によって最適な方法は変わると思いますが。
- >>850
ありがとう。できました。
ところで、Project Builderについてなんですけど、
ClassesとOther Sourcesとあって、Interface Builderから作ったソースやヘッダは
Other Sourcesに置かれるんですが、じゃあClassesには何を置くとか、そういう使い分けは
基準はあるんですか?
- >>857
たまたまでは?最後に選択したファイル/グループによって
その時々でファイルの作成場所は違っているようです。
- >>852, 855
ありがとうございます。そんな方法があったとは!
NSCharacterSetは、まったく気が付きませんでした。ドキュメント読み直さねば。
>>856
NSTextFieldの入力を見て、数字入力と文字入力の振り分けがしたいのです。
数字だった場合は、リストに登録してある番号に、その数があるかどうかを見て
あった場合は、その番号に対応する項目名を自動入力したいなーと。登録が
なかった場合は、エラーを返して入力を促します。
文字列だった場合は、リストに重複がないかを見て、新しい項目名だった場合は
追加登録するという流れです。
- >>859
一つの TextField に複数の機能を持たせた場合、
画面はシンプルになりますが、頭の中は逆に混乱してしまうので、
そこらへんを検討された方が良いのではないかとも思います。
- >>859
そう言う用途なら単に最初の1文字が数字かどうかで分けても実用上問題ないと思うけど。
- >>867
えっ、そうですか?
PBから、適当なところをクリックして新しいファイルを作ると好きなところに置けますけど、
IBから(PBでMainMenu.nibをダブルクリック)だと今まではOther Sourcesにしか
ファイルが置かれたこと無いんですけど。
- >>862
確認のため、今試したけどIBからソース書き出しする前に
Classグループを選択しておいたら、ちゃんとそこに書き出された。
環境は?こっちは10.2.6 + Jul 2002
- >>863
ありがとう、意味が分かりますた。
何となく常にResourcesを選択していた(多分main.mがあるから)のが、
間違いの始まりだったのか…
普通に考えたら、クラスの定義するファイルなんだからClassesに置くのが当たり前ですよね。
- と思ったら、Classesを選択してから書き出しても
やっぱりOther Sourcesに書き出される…なんでだ!?
こちらは 10.2.6 December 2002でおます。
結局生成してからClassesにドラッグしてまふ…
- Cocoaでわからないことがあります。
・ファイルがエイリアスであるかどうかを判別する方法と、
・エイリアスだった場合、元ファイルのパス
誰かご教示下さい。
- >>866
ttp://homepage.mac.com/nathan_day/pages/source_frames.html
ttp://cocoa.karelia.com/Foundation_Categories/NSFileManager__Reso.m
- >>846
>Document-basedだとファイルタイプとか拡張子とか確認して登録するのが面倒くさい
NSDocumentを使わないアプリでもファイルタイプとか拡張子を登録しないと開けない
ので変わりはない。
何でも開ける設定にして自前で判断するにしても、NSImageで表示させるつもりなら、
NSApplicationのdelegateで
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
{
if([NSImageRep imageRepClassForFileType:[filename pathExtension]]){
[[NSDocumentController sharedDocumentController]
openDocumentWithContentsOfFile:fileName display:YES];
}
return YES;
}
とかすればDocument-basedで問題ない。なぜそんなにDocument-basedを嫌う
- >>846,868
ドロップされたファイルを全部受け取りたいなら
ファイルタイプを"*"にしときゃいいだけだと思うが。
>なぜそんなにDocument-basedを嫌う
単にOSの仕組みを知らないだけだろう。
そもそもDocument-basedにしないと
DnDやファイルオープンダイアログでの
フィルタリングは効かないからな。
- >>867 サンクスコ
- > そもそもDocument-basedにしないと
> DnDやファイルオープンダイアログでの
> フィルタリングは効かないからな。
嘘。
NSOpenPanelを100回読め。
- >>860
ありがとうございます。そこが結構気になっている部分なんです。
ただ、同じ一つの項目を入力させるのに2つのフィールドがあるのも
混乱する所かなーと思って、とりあえず二種類作ってみることにしたのですが
いまだ結論は出ず。
- NSOpenPanelのテストとして、こういうのを書いたんですけど、
なぜかファイルを選ぶとバスエラーで終了します。
キャンセルした場合は問題ない模様。
どこかおかしいところはある?
- (IBAction)openFile:(id)sender
{
NSOpenPanel *op = [NSOpenPanel openPanel];
int result;
result = [op runModalForDirectory:NSHomeDirectory() file:nil types:[NSImage imageFileTypes]];
NSLog(@"result = %@", result);
}
- ごめん、NSLogのフォーマットを %@から%dにしたら直ったよ…
intにdescriptionなんて搭載されなかったよ…
- あぼーん
- いつもはMenuItemのactionに接続されてて、senderのtagを読み取って
処理を分けてるメソッドがあるんですけど、このメソッドをコードから使う方法って
ありますか?
コードから直にそのメソッドを呼び出したらsenderにtagがないことになるし、
かといって、NSMenuItemには「actionを送れ!」というメソッドもないみたいだし・・・。
おわかりの方がおられましたらお教え下さい。
- 呼び出し元のオブジェクトに -(void)setTag:(int)value; と -(int)tag; を実装して
-(void)setTag:(int)value; で tag の値をセットした後で
sender に呼び出し元のオブジェクトを渡しつつ NSMenuItem の action メソッドを呼ぶとか。
- >>876
-(IBAction)myAction:(id)sender{
//とかやって
[self myMessage:[sender tag]];
}
-(void)myMessage:(int)tag{
//直接こっちを呼べばいいのでは
}
- >>877,878
ありがとうございます。
どちらもなるほどー!といった感じです。解決策は一つではないと言うことですね。
ひとまずは>>878さんの方法でいってみることにします。ありがとうございました。
- プログラミングなんて一度もやったことないおいらが
自分のオナニーのためだけに画像ビューアー作るよ!
- >>880
gangare!
- すいません、質問です。
ビユーのRect情報の取得なのですが、frameを使って取得すると、
実際のサイズより大きな情報を取得してきてしまいます。
やりたいのは実サイズの取得なのですが、どのメソッドを使えば良いのか、
探しましたが見つかりません。
インターフェースビルダーで言うところの、Layout Rectに相当する
情報です。よろしくお願いいたします。
- bounds のこと?
- boudsだと、以前やった時はframeとサイズ的には同じ値を
返してきたので違うのです。
もしかして一発では無理なのかもしれないのですが、どうやれば
できるのかが分かりません。
- >>884
残るはvisibleRectかな
NSScrollViewに入ってるならdocumentVisibleRectやらNSClipViewのframeやら?
おいらもちゃんと理解してないですけど(´д`;)
- 相手はNSButtonなのです。
ご紹介頂いたvisibleRectも以前試してみたところ撃沈でした。
NSScrollViewのdocumentVisibleRectやNSClipViewのframeは
相手がNSButtonなだけにダメそうです。
簡単なことのように思うのですが、なぜ一発呼び出しができないのか...
Cocoaってたまに理解に苦しむことがあります。
- >882
frameであってる。多分描画してある部分とのずれの話だと思うけど。。。
たとえば、IBでNSButtonを配置後、インスペクタのカスタムクラスを独自クラス(例えばCButton)に変更し、
@interface CButton : NSButton
@end
@implementation CButton
-(void)mouseDown:(NSEvent*)event
{
NSLog(@"Click!");
[super mouseDown:event];
}
@end
を実装してやって、ボタンの周囲をクリックしまくってみなはれ。
DevToolに入ってるPixel(だったっけ?)を起動してやると細かいところまで分かるよ。
- >>882
NSButtonのIBでいうLayout Rectなら、frameから12ずつ引けばいいんじゃない?
Layout Rectの数字はIBがボタンの影の部分とかの大きさを抜いて、
レイアウト用に出してる数字じゃなかったっけ?
間違ってたらスマソ
- IBのファイルみたいにファイルをバンドルにして保存したいのですがどうしたらいいのでしょう?
NSWorkspaceのisFilePackageAtPath:で判定はできるんですが、セットの方法が分かりません。
- >889
1,info.plistの書類のタイプで「ファイルパッケージ」にチェック。拡張子を指定。
2,NSFileWrapperを使う。この時ファイルネームに1,で指定した拡張子を使用する。
拡張子ではなくファイルタイプでも行けるかもしれませんが、試してません。
- NSImageViewで質問
1.setImageでNSImageを描画する
2.NSImageViewを別の場所へ動かす
3.setImageで別のNSImageを描画する
すると前(1)に描画したNSImageが残っているんです。
これを消すことはできないんでしょうか?
- -(void)display; を呼んで強制的に再描画するとか。
- >>892
ありがとうございます。なんとかなりました。いや、NSWindow側とは。。。
NSImageViewもしくはNSImageの問題だと思って、ずっと「メモリの解放なのかな?」とかうんうん唸ってました
- >891
>1.setImageでNSImageを描画する
NSImageView* target; // 既に動かすViewが入っているとする。
[[target superview] setNeedsDisplayInRect:[target frame]];
>2.NSImageViewを別の場所へ動かす。
>3.setImageで別のNSImageを描画する
この順で。
- >>894さん、わざわざありがとうございます
実はJava使いなのでObj-Cの解釈が間違っていたらすみません
NSImageViewのスーパークラスであるNSView
その中に用意されているメソッドsetNeedsDisplayInRectを呼び出している
ってことだろうと解釈しました。
で、さっそくCocoaリファレンスを見て引数など確認。
さぁ、いざ使ってみるかな。。。。「シンボルが解釈できません」
なぜ?と思い本家appleDevelopersに行ってJava用リファレンスを見てみると、
「setNeedsDisplayInRectがない!!」
>>http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Java/Classes/NSView.html#//apple_ref/doc/j_ref/NSView
Java萎え~。残念です。
>>894さん、親切にありがとうございました。
- Javaでしたか。リファレンス見てみました。
Javaの場合多分こうなります。
terget.superview().setNeedDiplay( target.frame() );
- >>896
夜遅くなのにありがとうございます
target.setNeedsDisplay(target.frame());
でなんとか消えました。少し早くなったようです。
- >>890
サンクス!
Document Basedではないので書類のタイプ設定してもどういう風に使えばいいのかよく分かりませんが、それは自分で調べます。
- IBじゃなくてプログラムでアウトレットを設定するやりかたがわかりません!! Cocoaはやっぱりで昔解説されてたような気がするの ですがもう見られません!! すみませんが教えて下さい!!
- Cocoaの大抵のクラスはsetXxxで
// Xxxはアウトレットの名前
行けたと思うけど。
- >>899
>アウトレットを設定
意味がわからない??
- クラスのヘッダファイルに
IBOutlet NSHogehoge *hoge;
を追加してやって、IBで読込んだらいいんじゃ?
- 萩原本に書いてるので立ち読みしてきたら?
- どうも最近癖で
NSBeep(1);
と書いてしまう....
- Cocoa ってゲーム作るときはやっぱ OpenGL 使うしかないの?
- >>905
しかないってことはないけど(NSImageをぺたぺたやればグラフィックはできるし)、
OpenGLを使うのはいい方法なんじゃない?
2Dでもコーツイクストリームで高速そうだしー。
詳しい人の意見も聞きたいなあ。
- RGBの画像データとグレースケールのアルファチャンネルデータがありまして、
この2つをプログラム内で合成したいのですが、どのような方法がありますでしょうか。
- GRBとAをGRBAにする。
- >908
それがわからないんです。>GRBとAをGRBAにする
RGB画像とアルファ画像をそれぞれNSImageに読み込んで
compositeメソッドで合成しようとしてるんですがうまくいきません(アルファ画像が白黒画像として解釈されてしまう)
なにか根本的に間違ってるんでしょうか。
- ところでCocoaから気軽に使える正規表現ライブラリってないですか?今は
regex(3)を地道に使ってるけどやっぱNSStringを受けてくれる奴が欲しいです。
みんな自作してるのかな?
- Cocoaって、nibファイル無しでWIndowを描画するってできるんでしょうか。
できるのならメソッドの書き方を教えてください。
今、とあるソフトのプラグインを書いていて
そのプラグインからWindowを呼び出したいのです。
- >>910
AGRegx or MOKit
- >>910。
日本語の使える正規表現で困ってたけど、鬼車と自作ラッパーで
検索アプリ作れた。一度やってみなよ。
基本的な関数のみだけど、いろんな表現形式が使える。
修正BSDライセンスでGPLみたいなウィルス性はないし、フレームワークにして
思い切って公開してしまえば神になれる。
暇なきゃ必要な分ラップすればいいだけ。実用になる。
漢字コードもEUCとかUTF8とかShiftJISがあるからマジでお勧め。
- >>911
ソフトのプラグインを書ける人が、どうしてこんな質問できるのかが知りたい。
- >>914
carbonならできるんだけどね。
Cocoaがわからんのですよ。
そんなに楽勝な事なのか・・鬱。
- じゃぁ、carbonで書けっていうことになりそうなんで
書いておきますが、Carbonでwindow描くと
ホストがcocoaだからなのか虹がぐるぐる回るもんで
cocoaで描くと上手く行くかなと思って聞いてます。
- >>915
CocoaのBundleプラグインならNib使えるんでは?
- >>913
そこまでやってるなら913が神になってくれ
- >>915
いわゆる荻原本に Interface Builder 使わない Window の作り方が書いてあったような。
- >>915,919
荻原本には書いてあるね。
ざっくり言えば、
NSWindow *window = [[NSWindow alloc]
initWithContentRect:NSMakeRect(x, y, w, h)
styleMask:NSTitledWindowMask | ...
backing:NSBackingStoreBuffered defer:YES];
NSButton *button = [[[NSButton alloc]
initWithFrame:NSMakeRect(x, y, w, h)] autorelease];
[[window contentView] addSubView:button];
てな感じ。
まあ、nib から読み込むほうがスマートだとは思うけど...
- まだつまっています。
解答するのもアホらしい質問なのかも知れませんが、
どこか勉強できるサイト、あるいは書籍を教えていただけませんか…
- >>907
具体的には、アルファチャンネル付きのNSBitmapImageRepを作成し、
bitmapDataメソッドでビットマップ情報を格納する領域の
ポインタを取得して、そこへRGBとアルファチャンネルの情報を
書きこんでいきます。
入力元の画像からBitmap情報を取り出すには、
NSBimapImageRepのinitWithData:メソッドでオブジェクトを
作成し、やはりbitmapDataメソッドでビットマップ領域の
ポインタを取得します。
作成したNSBitmapImageRepはNSImageにaddRepresentation:して
使います。
APIリファレンスの、NSBitmapImagRepの
initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerP
ixel:hasAlpha:isPlanar:colorSpaceName:bytesPerRow:bitsPerPixel:
メソッドの説明も参照してください。
だいぶ昔、英語サイトで画像合成のサンプルコードを見かけた事があるので、
それを見せられれば早いんだけど……。URL失念してしまいました。
- >>918
,.-――――――――――――-、 ダメだっ…… オレはダメなんだ……
/ \ わかったんだよ……
\ l オレには もう…… わかった…
>、 |
/―`\、 | 鬼車派には二種類ある…と
/―――u \__ |
ヽ ヽ二二ニニニヽ`ー-、_____ | ラッパーを作って公開できる奴と
n===~=-、===============、 .| それができない奴と・・・
| |〉 i] ) u | |⌒`i .|
| | └┐r' u | |⌒`| .| オレは…… そのダメな方……
./U u`ーし‐' U .l |(^) | | …ダメなんだ…
∠__ ) O ーU-、\. .| .|___ノ |
<_____ ヽ .Vヽ | どうしてもマイナスのイメージが拭えない…
└┴┴┴┴`i l / \ | フレームワークを作ろうとしても……
┌┬┬┬rノ / \ |\ 自作アプリでは一部のメソッドしか使わない姿がちらついて……
匚 ̄ ̄ ̄ ̄u. / \/ どうしてフル機能のラッパーを作ることが出来ない………
| U u / / 今も苦悶中………
l_____/ / もう自分の必要最低限を作るのでギリギリ……精一杯なんだ………
- >>922
これは関係ないかな。
http://cocoa.mamasam.com/COCOADEV/2001/09/1/11010.php
適当に検索しただけなので、ちごてたらすまん。
- >>922,924
ありがとうございます!
NSImageRepresentationは勉強してませんでした。
早速勉強して参ります。
- みなさんレスどうもです。
荻原本買ってきます。
- >>910
遅レスだが、NSStringはUTF-8で値を持ってたと思うから、PCREにUTF-8オプションつけてコンパイルしたものがオススメ。
鬼車使ったことないから、どっちが良いとは言えないけど。
- >915
Nibから作らないとAquaにならなかったと思うが。
>917さんも書いてるけど、プラグインはBundle形式じゃないの?
- >>928
レスどうも。
CocoaBundleではなくて
ライブラリーっていう形式なんですよ。
(新規ターゲットから選べるやつ)
アイコンが"B"じゃなくて"L"になってます。
この形式でCocoa.hをincludeすると、obj-cに対応してないみたいで
コンパイルすると@とか[]の部分でエラーでまくりという状態で
今いろいろためしているところです。
昨日ためした限りでは、ライブラリーだとobj-cは対応してない様子です。
CocoaBandleとは、ライブラリーとはなんぞや?
というのを調べてみます。
- >>929
えーと、Project BuilderがObj-Cに対応したコンパイルを
行なってくれるかどうかは、ソースファイルの拡張子で決まっていたはず。
問題のソースファイルの拡張子が".c"になってませんか?
".m"またはC++を併用するなら".mm"に変更してください。
- >>929
ライブラリって本来Carbonオンリーぽいのだが、、
何のソフトのプラグインなのか示せば話がはやいかも
- >>ライブラリって本来Carbonオンリーぽいのだが、、
僕もそんな気がします。
ソフトは・・秘密にしておきますw
すいません。
>>930
mmにしてます。
エラーが出るのは上記問題のような気がします。
しかし、OSXのプログラミングはおもしろいですね~
- みなさんどうもです。
結果報告。
コンパイルに成功し、読み込みもうまく行きました。
windowの表示はできませんでしたが・・w
(表示しようとはしているようです。読み込み時HOSTが重くなりました。)
どうもwindow描画のメソッドがおかしいようなので
荻原本見て勉強します。
あと一歩~
- >>907
どーしても分からんかったら自前でピクセル触ったら?
そっちのほうが早そう
- スレッドセーフなキューを作ってるんですが、排他制御の方法で困ってます。
キューは
enum {
queueIsEmpty,
queueHasSpace,
queueIsFull,
};
という3つの状態を持ってます。
状態が2つなら、NSConditionLockを使えば簡単に排他制御が出来るのですが、
3つの状態を持つ場合にどうやれば排他制御が出来るのかが分かりません。
キューの容量を変化可能にすればqueueIsFull状態を無くすことは出来ますが、
動作が重くなってしまうので出来るだけ避けたいです。
よろしくお願いします。
- >>935
Lockを増やす
- >936
ありがとうございます。ちょっと考えてみます。
>935 ちょっと条件が足りなかったので付け加えます。
Queue* queue;
id data = [queue dequeue]; // queueIsEmptyならデータが入るまでwaitをかける。
と、
[queue enqueue:data]; // queueIsFullなら空きができるまでwaitをかける。
です。
よろしくお願いします。
- >936
考えてみましたが、デッドロックが発生しない方法を思い付けませんでした。(泣
とりあえず、queueIsFull状態をなくして、キューがいっぱいのときは例外を投げてごまかすことにします。
このすれは毎日チェックしてますのでどなたか良い方法があれば教えて下さい。
- 個人的には、というか普通の人にとっては
「なんとかピーク版とかいうのはいいから、リリース版を出してほしいなぁ」
というのが、今望んでいることだったりする。
でもまだ開発調整中だったらごめんなさい。
開発版をsourceforgeではなく2chで議論することに疑問を感じるところではあるけど…
- Cocomonarスレと間違えた。
- t
- IBでカーボンアプリも作成できる様ですが
それはクラシック環境でも動くのでしょうか?
よろしくお願いします。
- 追伸:
ココアでクラシックで動くアプリがいちから作れるか、ということです。
- >943
残念ながらCocoaはクラシック環境では動きません。
Carbonで作成したとしてもProject BuilderがCFMバイナリを生成できませんので、
やはりクラシック環境での動作は出来ません。
古いCodeWarrior等を使ってCFMバイナリを作れば
Nib+Carbonでかつクラシック環境で動作するアプリケーションが作成可能です。
(最新のCodeWarrioirはMach-Oバイナリしか生成できません)
- >>944
丁寧なレスありがとうございます。
クラシック用アプリの開発環境は現行ではREALBasicぐらいということでしょうか。
- >>944
> 最新のCodeWarrioirはMach-Oバイナリしか生成できません
間違い。
http://www.metrowerks.com/MW/Develop/Desktop/Macintosh/Professional/mac9
- ながーい計算を途中中断するのに、データを一時保存したいのだが
アプリケーション独自形式のデータをファイルに書き出す方法を
だれか教えて。
入門書だと、ドキュメントベースにしてテキストを出し入れする
例題ばっかで、document.nibが無い例が無い。
ググッてみても、さっぱりわからん。
デバッグのことを考えて、テキストコメントとデータで
セーブデータを作るつもりなんだけど
変にCocoaにコダワリすぎ?
- NSDataにしてwriteToFile
- NSArchiverでNSDataを生成すると書いてあるのを見たけどちんぷんかんぷん
たった今までNSDataはNSDocumentの継承だと勘違いしていた、、、
調べなおしてみます。
Cocoaはやっぱりワカンネー
- >>949
セーブデータを格納するオブジェクトを作って、
それにNSCodingプロトコルを実装させる。
ここが参考になるかと。
ttp://www.stripe-net.jp/cocoa/cocoa/foundation3/foundation3-2.html
- >946
指摘ありがとう。
http://www.metrowerks.co.jp/Products/Desktop/MacXE.html
これが最新版だと思ってた。機能限定版だったのね。
- cocoaで画像の変形をしたいのですが。良いサンプルコードは無いでしょうか。
サンプルコードさえあれば後は自学自習しますんで
- 画像の変形って?
フーリエ変換とかでいいの?
- 追記
アフィン変換で、例えば台形をした画像を、正方形に変形する事はできるのでしょうか?
- >>953
フーリエ変換でということは、画像の周波数成分から特定の値をとるとか
フォトショップのフィルタみたいなってことですかね?
フォトショップの編集メニューにある自由変形みたいなことがしたいのです。
- >>952
むしろ、台形かどうかを判定する方が難しいような。
変形は簡単にできるけど。
http://developer.apple.com/samplecode/Sample_Code/Cocoa/Transformed_Image.htm
- >>956
ありがとうございます
ソース見てみます。
- >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は実行時までどのように展開されるか決まりません。
だからパスをまんま書くことはできません。
- ありがとうございます。
>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にしる。
- ×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ゲットォォォォ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´
ヘ_ヘ ) (´⌒(´
ミ ・ ・ ミ ) (´⌒(´
( ° )~≡≡≡(´⌒;;;≡≡≡
 ̄ ̄ (´⌒(´⌒;;
ズザーーーーーッ
- Cocoa関連検索してたら出てきたんだが、この考え方って正しいの?
ttp://www.fastwave.gr.jp/diarysrv/trinity/200309a.html#20030909-2
- >>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
ってこんな感じであってる?
- >971
導入部は別に間違ってないと思う。
オーナーシップに関する理解がなければ簡単にリークしちゃうと思う。
メソッドの戻り値のオーナに関して明記されてないとあるが実はキチンと明記されている。
ここ
http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/4objc_runtime_overview/chapter_4_section_2.html
#ここには>966氏が理解してない +alloc... と -init... が不可分であることもきちんと明記されている。
御覧の通りこれはObjective-Cのお勉強の資料です。
彼はObjective-Cのお勉強もしっかりやらずにうんちく垂れてるわけですね。
- って、ちょっとまて。
>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に対しては冷静な対応をお願いします。
(できれば反応しないのが安全かと)
- 規制でかけなかったよ。
>967
G3 or G4よりもHDDか。
FirewireDiskを増設すれば改善する?とかちょっと思ったけど、
テンポラリファイルは結局システム側なのでダメポ。
新型も待ちたいけれど、我慢できないぽい。
>969
スンマセンでした。参考になります。
NSMutableData ドキュメント読んでます。
>975
理解してないのはメモリ周りだけじゃないってことで。(T_T)ノシ
たとえば、
-(NSString *)description
{
NSString *result=[[NSString allloc] initWithFormat:@"=%d",Number];
[result autorelease]; //releaseが必要
return result;
}
-(NSString *)description
{
return [NSString stringwithFormat:@"=%d",Number];//自動解放される
}
と言われても、何をたよりに区別していけばよいやらさっぱり
- NSTableViewに列を追加するときは、Interface Builderで出来ますが、
コードを書いて動的に列を追加するにはどうしたら出来るのでしょうか?
- NSTableDataSourceを実装したオブジェクトをdataSourceに指定
http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/Protocols/NSTableDataSource.html#//apple_ref/occ/cat/NSTableDataSource
- ごめん、上のは行の制御だ。
列は
- addTableColumn:
- removeTableColumn:
- moveColumn:toColumn:
- tableColumns
- columnWithIdentifier:
- tableColumnWithIdentifier:
あたりか。
前にとりあえず試しただけで実際に実用品を作ってるわけじゃないから
いいかげんだけど。
- 次スレを急いで!
- >>980
allocを使って生成したオブジェクトは自分がオーナーなので、いらなくなったら解放する>NSString *result=[[NSString 『allloc』] initWithFormat:@"=%d",Number];
allocを使わないで生成した(正確には生成してもらった)オブジェクトは自分がオーナーではないので、解放する必要はない
>return [NSString stringwithFormat:@"=%d",Number]
あるオブジェクトを使用し続けたい場合はretainして、いらなくなったらreleaseする、っていうのは理解してるよね?
allocで生成するとすでに一度retainされている状態なので、いらなくなったらreleaseしなくてはいけないということ。
stringwithFormatの方はNSStringクラスがallocで新しいオブジェクトを作ったあと適当なタイミングでautoreleaseしているので、retainされていないオブジェクトが出てくるという感じかな。
基本的には
allocの回数+retainの回数==releaseの回数+autoreleaseの回数
でメモリリークはないことになる。
と思う。
- >985
メモリ管理の基本がなんとなくあやふやな理解なので、
さらっと
NSString *result=[[[NSString allloc] stringwithFormat:@"=%d",Number] autorelease];
とか書いてしまいがちなうっかりさんということなのでつ。
- Cocoaはさっぱり!!! Version.3
Cocoaはやっぱり!を見て真似してソフトを作ったは良いが、
オリジナルを作ろうと思ったら、全然その先に進めない人集まれ!
親切なプログラマーさんが暇なときだけ教えてくれてる(よね?)
前スレ
Cocoaはさっぱり! http://pc.2ch.net/mac/kako/1007/10076/1007632025.html
Cocoaはさっぱり!version:2 http://pc.2ch.net/test/read.cgi/mac/1007632025/l50
関連スレは >>2
プログラム関連スレ
Macでプログラミング{3} http://pc.2ch.net/test/read.cgi/mac/1049070432/
MacでC言語 http://pc.2ch.net/test/read.cgi/mac/1048587374/
MacOSX Java総合スレッド http://pc.2ch.net/test/read.cgi/mac/1047361032/
「AppleScript,Perl,Shell」OS Xでスクリプトスレ http://pc.2ch.net/test/read.cgi/mac/1055091471/
Mac OS XをUnixとして使ってる人の為のスレ その5 http://pc.2ch.net/test/read.cgi/mac/1055874672/
XCode ② http://pc.2ch.net/test/read.cgi/mac/1061702196/
参考リンク
HAPPY Macintosh Developing TIME!
ttp://homepage.mac.com/mkino2/
Cocoa Developer Documentation
http://developer.apple.com/documentation/Cocoa/Cocoa.html
file:///Developer/Documentation/Cocoa/CocoaTopics.html
Cocoaはやっぱり!
ttp://www.big.or.jp/%7Ecrane/cocoa/
- >このホストでは、しばらくスレッドが立てられません。
繋ぎ変えてもだめぽ。
スレたて、だれかおねがいします。
- チャレンジします
- ダメでした、他の人ヨロ
- チャレンジ:レスポンス
- じゃ、建てるよ。
- 建てました。
Cocoaはさっぱり!!! Version.3
http://pc.2ch.net/test/read.cgi/mac/1063295248
This page was generated by Dat2HTML Rev.