Objective-C [ObjC part:3];at TECH
Objective-C [ObjC part:3]; - 暇つぶし2ch650:デフォルトの名無しさん
08/10/06 20:40:16
そりゃおまえ現代文法だろ

651:デフォルトの名無しさん
08/10/09 23:25:39
NSViewってコントローラー無くても四角形とか描写できるよね。

あれはなんで?
コード見ても描写を担う関数が仮引数とか受け取ってるみたいだけど・・・・・・・。
一体この仮引数はなんなの?

652:デフォルトの名無しさん
08/10/09 23:52:57
>>651
何を引き受けているのかってことかな?

確かにNSViewって不思議。
他のオブジェクトだったらIBとXcodeはアウトレット、アクションとコントラーを介して
つながっているけど、NSViewってクラスでそのままリンクさせることができるもんね。



653:デフォルトの名無しさん
08/10/10 00:29:12
>>652
確かにcocoaで良くわからないところだった。
NSTextViewでもコントローラーをソースとして登録しておくって考え方も
.net出身者としては腑に落ちなかった。

654:デフォルトの名無しさん
08/10/10 09:03:01
そのあたりはいくらでも説明しますが、
何が疑問なのか曖昧すぎてわからないので、もうちょっと詳しく書いてくれませんか?
>>651 さんとかどの関数の話をしてるの?
>>652 はなにがいいたい?クラスでそのままリンクって?
>>653 はどういうこと?コントローラをソースとして?ソースって何?

655:651-652
08/10/10 14:21:46
>>654
ドモ、ありがとうございます。超初心者です。

このサイトにあるGraphic関数です
URLリンク(homepage.mac.com)

疑問1
このサイトで四角形を描写させるためのサンプル全ての関数において
NSFrame型のframeRectっていう仮引数をうけとっているよね。
でも関数の中身をみるとそんな仮引数を利用している形跡がない。
別に宣言する必要が無いのでは?というのが最初の疑問。

疑問2
サンプルコードをダウンロードしたプログラムにはコントローラー(青色の立体箱)がなかったんですよね。
僕はIBで作成したインターフェイス部分とX-codeで記述したコード部分を繋ぐためには
コントローラーでアクションとアウトレットで接続する必要があるって理解していたから
コントローラーがなくてなんでX-codeで記述した関数がインターフェイスに反映されるのか全く分かりませんでした。

そしたらこのサンプルではIBのNSViewのクラス名部分がX-codeで作成したクラスに
なっていたんです。
これはコントローラーが介在していないってことですよね。?



656:デフォルトの名無しさん
08/10/10 15:18:45
>>655
NSViewのサブクラスは -drawRect:(NSRect)frame;をオーバーライドして描画をやります。
で frameにはview自身の大きさが入ってきます。
ので、それに習っただけでしょう。

DLしてないけど、多分NSViewのサブクラスがwindowに貼り付けてませんでしたか?
最後の段からすると多分そうなってるんだと思うけど、
そうしておくと、nibロード時にサブクラスを作ってそこに貼り付けてくれます。
(実際には違いますがイメージはそんな感じです)
で、NSViewのサブクラスの
-drawRect:(NSRect)frame;
で描画処理が行われているはずです。

657:デフォルトの名無しさん
08/10/10 15:20:24
コントローラはデータを扱うクラスですので、データを使ってなければ不要です。

658:デフォルトの名無しさん
08/10/10 15:53:59
>654じゃないですが、こんな感じじゃないでしょうか。

答え1
- (void)drawRect: (NSRect)frameRect は nib (xib) が読み込まれて初期化する
時や絵を書き直す過程で呼ばれる。frameRect は描画する場所を限定する為のもの。
描画効率upの為に customView の一部に限定する事もできる。初期化の時は多分、
customView.bounds で view の全体を描画させているんだと思うな。

答え2
コントローラは介在していない。ていうか、MVC の View を直接いじっていて、
Model、Controller が無い状態。

と、書いているうちに >656 さんが書いてくれましたね。customView が直接 window に
貼付けられていました。

659:デフォルトの名無しさん
08/10/10 20:40:38
>>653
> .net出身者としては腑に落ちなかった。

そこがCocoa(MVCパターン)と.NET(n層パターン)のアーキテクチャの違いというやつだ。
MVCのViewは、主に描画だけを行いデータの保持や管理をしない。Model内でデータを更新すると、それに連動してるViewが勝手に再描画される感じ。
n層パターンだと、ビジネス層で処理したデータをプレゼン層に送りこんで、プレゼン層側でデータを保持したり処理したりする。

660:デフォルトの名無しさん
08/10/11 01:07:34
>>639
書いてるのはシロタンですぞw

retain count方式の説明に微妙に誤解を招きそうな表現があった気がした。

661:デフォルトの名無しさん
08/10/11 11:50:01
>>656-658

イメージとしては理解できました。
本当にありがとうございます。


662:デフォルトの名無しさん
08/10/19 23:32:59
10.5以降にはNSViewControllerがある

663:デフォルトの名無しさん
08/10/21 22:59:05
x-codeで開いたソースファイルの文字を大きくしたいんだけど、
やりかた知ってますか?

一応必死に探したんだけど見つかりませんでした。


664:デフォルトの名無しさん
08/10/22 00:07:56
環境設定 -> フォントとカラー

665:デフォルトの名無しさん
08/10/22 02:22:42
>>663

>>664の場所にあるよ。
フォントサイズのみの指定って感じのインターフェイスじゃないからわかりにくいっちゃあわかりにくい。
フォント名をダブルクリックしてフォントパネルの中で指定。

666:663
08/10/22 20:35:04
>>664-665
ありがとう!
フォントサイズをこんなにも決め細やかに設定できるなんてすばらしすぎる。
背景もモダンにして高級感たっぷり。

ありがとう!

667:デフォルトの名無しさん
08/10/27 21:51:10
>>659
なるほど。
だから
.NETではインターフェイスに入力したデータがコードにも受け継がれるけど、
cocoaの場合はインターフェイスに入力したデータはコードでは受け継がれずに
関数で取りに行く必要があるのか。
めんどくさいよね。これ。

668:デフォルトの名無しさん
08/10/27 22:53:40
>>667
つまり
textBoxの値をlabelに反映するだけのアプリケーションで説明すると

.netの場合
labe.text = textBox.text;
で終了。

cocoaの場合
labeField = [NSTextview setStringValue : textField];
さらにIBでlabelField,textFieldをアウトレットでコネクトする必要あり。

面毒せー!
でも高度なテクニックはcocoaのほうが分かりやすいんだよなー

669:デフォルトの名無しさん
08/10/27 22:56:19
なんでも関数にするからだめなんだよ。

.netはcocoaを見習いようがないけど、cocoaは.netを見習えるような気がする。


670:デフォルトの名無しさん
08/10/27 23:36:30
BaseTenがダウンロードできないんだけど・・・・・なんで?


671:デフォルトの名無しさん
08/10/27 23:53:43
頭わる…晒しage

672:デフォルトの名無しさん
08/10/28 00:02:21
かかって来い!

673:デフォルトの名無しさん
08/10/28 00:52:53
>>668
>cocoaの場合
>labeField = [NSTextview setStringValue : textField];
>さらにIBでlabelField,textFieldをアウトレットでコネクトする必要あり。
何年前の話をしてるんだ?
10.3 のときから、そんなのはコードを一行も書かなくても
Interface Builder でバインディングをすればできるわけだが ...
URLリンク(developer.apple.com)
とかみろ。もっと新しい英語版はこちら:
URLリンク(developer.apple.com)

674:デフォルトの名無しさん
08/10/28 01:02:43
>>673
ありがとー

実は入門書しか読んでねー。

675:デフォルトの名無しさん
08/10/29 23:21:44
もうちょっと活発に議論してほしい・・・・・・。

そこでバインディングについて簡単に説明して。
一体どんなすごいことが出来るの?

676:デフォルトの名無しさん
08/10/30 00:01:21
バインディングは議論するほどたいしたことじゃないし、
最近 Cocoa やってるひとなら常識だから。

View と Controller 間の glue
>.netの場合
>labe.text = textBox.text;
>cocoaの場合
>[labeField setStringValue : [textField stringValue]];
を書かなくてよくなるだけです。

インターフェースビルダーで、各 UI 要素が controller のどの変数を
監視/設定するかを設定出来るという機能です。(それだけじゃないけど。)
一番簡単な例は、controller に a という変数を用意して、
label も textfield も a を監視するように設定できます。
そうすると、textfield の内容が変更されると、自動で a が変更されて、
それに伴ってそれを監視している label も自動で変更されると。

別に凄いことじゃないです。

>>673
に引用されてる先を読んでください。

677:デフォルトの名無しさん
08/10/30 00:02:41
書きわすれましたが、
.net でも WPF だったか XAML だったかで同様のことができるんじゃなかったっけ。

678:デフォルトの名無しさん
08/10/30 01:52:23
週刊アスキーを読ませてもらった、大金持ちになりたいです。

679:デフォルトの名無しさん
08/10/30 02:11:38
>>675
outletを用意しなくても済むため、コード量を劇的に減らすことができるって、HMDTさんが言ってた。
URLリンク(developer.apple.com)

680:デフォルトの名無しさん
08/10/31 23:06:49
>.netの場合
>labe.text = textBox.text;
>cocoaの場合
>[labeField setStringValue : [textField stringValue]];

いちおう、cocoaでも
labeField.stringValue = textField.stringValue;
と書ける。objc2.0なら




681:デフォルトの名無しさん
08/10/31 23:37:41
明示的にプロパティじゃない setter をプロパティ構文つかうのは
Apple 的には推奨してるんだっけ?

URLリンク(developer.apple.com)

anObject.retain はするなとかいてあるが
.stringValue はいいのかな。

682:デフォルトの名無しさん
08/11/02 16:53:15
>>681
その文書を読む限り推奨も否定もしてないようですね。
ただ、書いてる内容を総合的に見れば、ドット構文を一般的なメソッド呼び出しの代替えとして使うな、ということのようだから、ちゃんとしたアクセッサメソッドならドット構文を使ってもいいんじゃないかな。
とりあえず、コンパイルエラーとかも出ないし。


683:デフォルトの名無しさん
08/11/03 01:31:54
ボタンを押したらピコーンて音声ファイルが再生されるようにしたいんですけど
なんて書けば良いんでしょうか・・。超低レベル質問なのは分かってるんですけども

684:デフォルトの名無しさん
08/11/03 02:34:21
>>683
AppleのドキュメントとかAPIリファレンスとかでそれっぽいとこ探せばいいのでは?
そこで分かったそれらしいクラス名なりメソッド名とかを使ってググるとか。
APIリファレンスとかにはそのメソッドとかを使ったAppleのサンプルへのリンクがあったりするからそれを見てみるとか。

ClashLandingってAppleのサンプルにそれっぽいのがあるらしい。



[オーディオ] - iPhoneアプリケーション開発
URLリンク(d.hatena.ne.jp)

試してみるとか?

俺も再生の仕方とかわからない・すまない。

他に詳しい方おしえてあげてください。

685:デフォルトの名無しさん
08/11/03 03:39:08
>>683
質問するスレはCocoa はさっぱり
スレリンク(mac板)
のほうが適当だとおもいますよ。
あと、質問するときはどのていどまで Cocoa を知ってるのか書いてください。
Interface Builder つかってボタンを表示する方法はしってるのかとか。
ではあちらのスレで会いましょう。

686:デフォルトの名無しさん
08/11/03 15:01:44
>>684
ありがとうございますとりあえず音は出せるようになりました!
半日かかりましたけどw
>>685
見落としてました。そのスレが自分向きですね
教えて君にならないよう頑張ってみます

687:デフォルトの名無しさん
08/11/03 17:01:52
URLリンク(blog-imgs-40.fc2.com)

688:デフォルトの名無しさん
08/11/07 02:19:43
NSTimerのscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
関数を使って一定間隔ごとにある関数を呼び出すタイマークラスを作成したいのですが、
上手くいきません。

targetに問題があるのかなと考えているのですが、
メイン関数でタイマークラスを作成し上記の関数をよび出す場合、
targetはselfでいいのでしょうか?







689:デフォルトの名無しさん
08/11/07 09:11:25
僕らは超能力者じゃないんだからもうちょっと詳しく書いてもらわないとわかりません。
main 関数ってほんとに C の main() ?
それだと NSTimer うごかないよ。Runloop 回さないと。
あと、この質問は Objective-C プロパーというより
たぶん Cocoa の話なので、>>685 にもあるように
新マック板の Cocoa スレに行ってください。

690:デフォルトの名無しさん
08/11/07 09:25:56
>>688
おそらく NSTimer はちゃんと出来ているけど、NSRunLoop に渡してないだけな気が
しますが…… NSRunLoop の addTimer:forMode: を参照

691:名無しさん@お腹いっぱい。
08/11/17 04:06:06
Objective-Cで定数って普通どうやって定義するのかな?
Javaみたいに、関係あるクラスの中で定義して、AClass.CONST_A_VALみたいに使いたいんだが。

692:デフォルトの名無しさん
08/11/17 04:42:09
できません。
Global namespace に大量に定数を定義するのが Obj-C 流。
(あまりいいことではないとおもうけど、そういうものなんだからしかたがない。)
そのかわり定数の名前がかなり(めちゃくちゃ)長くして衝突をさけます。
NSUTF8StringEncoding
とか
NSApplicationDidUnhideNotification
とか。
Java なら NSApplication.DidUnhideNofitication とかするところを
点を一個抜く感じだと思います。

693:名無しさん@お腹いっぱい。
08/11/17 05:02:17
>>692
うう、そうですか。
それがObjective-C流ならしかたない(泣。
defineとconstではどっちの方がいいんでしょう?

694:デフォルトの名無しさん
08/11/17 05:38:41
う~ん、普通は .h では const extern にしておいて、
.m で実際の値を定義するんじゃないですかね?
少なくとも Cocoa の標準ヘッダではそうなってますし僕もそうします。

Obj-C というか C だと const の中身までヘッダにかくと
リンク時に衝突するとおもいます。ご存知なら失礼。

695:名無しさん@お腹いっぱい。
08/11/17 10:45:31
>>694

いや、とても参考になりました。
ありがとうございます。

696:デフォルトの名無しさん
08/11/17 17:46:29
Obj-CからIllustratorドキュメントを操作する場合って直接は無理ですよねぇ…
JavaScript書いてそれをObj-Cから実行って感じですか?

697:デフォルトの名無しさん
08/11/18 00:32:39
.ai のフォーマットを知ってたら直接操作出来るんじゃない?
Mac 上でやるんなら JavaScript だけじゃなくて AppleScript もつかえるでしょう。
Obj-C から AppleScript なら呼び出し放題だけど。
URLリンク(developer.apple.com)


698:696
08/11/18 16:10:37
JavaScriptでいけた
ありがとー

699:デフォルトの名無しさん
08/11/19 11:49:45
エトワレの 0.4 が出たよ。
URLリンク(etoileos.com)
なんだか独自の方向に突っ走ってる気がするが...

700:デフォルトの名無しさん
08/12/02 22:43:50
>>699
(´・ω・`)ショボーン
URLリンク(imepita.jp)
URLリンク(imepita.jp)


701:デフォルトの名無しさん
08/12/04 03:22:21
Obj-C で visitor pattern ってどうやるのがいいのかな?
上のほうで一度話題になりかけてるんだけど、
なんか急激に煽り煽られになっててよくわからん。

C++ なら
HogehogeVisitor* visitor にたいして
ループ{
element->accept(visitor)
} として、 element の accept メンバ関数で更に
visitor->visit(this)
となってるわけだけど。ネットの議論をいろいろ読む限り、
Obj-C では単に
HogehogeVisitor を追加したくなったところで、
各 element をカテゴリで拡張して
@class HogehogeVisitorInfo;
@interface/implementation FooElement (HogehogeVisitor)
-(void)doHogehoge:(HogehogeVisitorInfo*)hoge;
@end
@interface/implementation BarElement (HogehogeVisitor)
-(void)doHogehoge:(HogehogeVisitorInfo*)hoge;
@end
としてしまって
HogehogeVisitorInfo* visitorInfo=[[HogehogeVisitorInfo alloc] init];
ループ {
[element doHogehoge:visitorInfo];
}
でいい気がするんですが、もっといい方法ありますか?

702:デフォルトの名無しさん
08/12/19 19:10:07
objective-cってc++みたいにtemplateあるの?

703:デフォルトの名無しさん
08/12/19 19:21:55
汎用型の id はあるが基本型は入れらんない。

704:デフォルトの名無しさん
08/12/20 06:36:47

void CopyVector( double *v1, double *v2 ) {
v2[0] = v1[0];
v2[1] = v1[1];
v2[2] = v1[2];
}

は、以下だと駄目みたいですがどう書くのでしょう?

-(void)copyVector:(double *)v1 To:(double *)v2 {
v2[0] = v1[0];
v2[1] = v1[1];
v2[2] = v1[2];
}

705:デフォルトの名無しさん
08/12/20 06:55:08
-(void)copyVector:(double *)v1 To:(double *)v2
このインスタンスメソッド自体にエラーが生じるの?

よければそのエラーの内容も書いてほしいんだけど・・・・・・・

それともただ単に仮引数V2に渡した引数にコピーされていないだけなの?



706:デフォルトの名無しさん
08/12/20 07:23:41
インスタンスメソッドだと実体化したオブジェクトに引き渡されるだけで
本の配列には全く関係ないと思うんだよね。

v2のアクセッサメソッドを定義する方法もあるだろうけれど、
クラスメソッドにしてみてもだめ?


707:デフォルトの名無しさん
08/12/20 07:24:44
double a[2][3];
a[1][0]=a[1][1]=a[1][2]=1.0;
copyVector:a[1] To:a[0];

とすると、copyVector のところに、error: syntax error before 'To' と出てしまいます。

708:デフォルトの名無しさん
08/12/20 07:27:31
それはいったい何をやっているの?

インスタンスメソッドだよね?
ちゃんとオブジェクトに送ってるの?

709:デフォルトの名無しさん
08/12/20 07:30:28
+(void)copyVector:(double *)v1 To:(double *)v2 {
v2[0] = v1[0];
v2[1] = v1[1];
v2[2] = v1[2];
}
ということでしょうか? 結果は同じ様です。

710:デフォルトの名無しさん
08/12/20 07:34:28

[self copyVector:a[1] To a[0]];

でどう?

711:デフォルトの名無しさん
08/12/20 07:35:17
>>709
てかクラスでもインスタンスメソッドでも
オブジェクトにメッセージをおくらないと・・・・・


712:デフォルトの名無しさん
08/12/20 07:40:35
copyVector:a[1] To:a[0];


・・・・・・・・・・そりゃToの前にエラーが出るわな。


713:デフォルトの名無しさん
08/12/20 07:43:14
>>710 で解決した様です。この場合のself って何に当たるのでしょう?

714:デフォルトの名無しさん
08/12/20 07:46:15
済みません解説をお願いしますう。>>712

715:デフォルトの名無しさん
08/12/20 07:47:15
>>714
すみません。
突っ込んどいて解説なしはダメですよね。



716:デフォルトの名無しさん
08/12/20 08:18:48
copyVector: (ラベルやね、ラベル!) a[1] (配列の要素になんか入れようってか!) (...さあ.代入コイ!代入!...) (ふじこ)To:a[0];

717:デフォルトの名無しさん
08/12/20 08:46:20
>>716 何といいますか、おっしゃる事がよく分からないのですが。。。

718:デフォルトの名無しさん
08/12/20 10:18:41
解説をお願いする前に C と Obj-C の文法をおさらいしたほうがいいと思うんだな

719:デフォルトの名無しさん
08/12/20 15:41:56
self 知らずに Obj-C のプログラムが書けるわけが無いと思うんだが。

720:デフォルトの名無しさん
08/12/20 15:46:57
最優秀Javaプログラマがよく作る
グローバルスタティックメソッドライブラリークラス
じゃないの?

721:デフォルトの名無しさん
08/12/20 18:46:28
スーパーサイヤ人にはなれるけど、

空を飛べないサイヤ人みたいだ。

722:デフォルトの名無しさん
08/12/21 01:42:16
今おさらい中です。

723:デフォルトの名無しさん
08/12/21 02:38:06
>>711が全て。

selfは自分自身だよ。

724:デフォルトの名無しさん
08/12/21 02:56:14
なんかやっと分かりつつあります。自分て言うのは、そのメソッドを持っているインスタンスということですね。

725:デフォルトの名無しさん
08/12/21 11:24:40
人に聞く前に
せめて教科書くらいは読んだ方がいいと思うんだよね

726:デフォルトの名無しさん
08/12/22 12:15:25
Obj-CよりC++勉強した方がいいよって、叔父さんに言われた(´・ω・`)

727:デフォルトの名無しさん
08/12/22 15:44:28
叔父さんってどうせIT土方のクソドザだろ??
そんなには13インチのMacBookプレゼントしてやれ。

728:デフォルトの名無しさん
08/12/22 22:58:46
両方勉強したって大した事でもない。

729:デフォルトの名無しさん
08/12/23 18:45:13
おすすめのObj-C入門書教えてけろ
「やさしいC」みたいなのがいいっす

730:デフォルトの名無しさん
08/12/23 18:51:31
NSString に入っているファイル名なテキストから拡張子を取り除きたいのですが、
対応するメソッドはありますか?
拡張子を取るなら NSString#pathExtension で出来ますが、それ以外の部分が欲しいのです。


731:デフォルトの名無しさん
08/12/23 19:14:02
>>729,730
この手の話・質問はここよりも、新Mac板 Cocoaはさっぱり!!! の方がレスポンス良いよ。
スレリンク(mac板)

>>729
「やさしいC」は読んでないけど、入門書は
木下誠「たのしいCocoa」、アーロン・ヒレガス「MacOSX Cocoa プログラミング」

>>730
-(NSString *)stringByDeletingPathExtension

732:デフォルトの名無しさん
08/12/23 19:22:05
>>731
ありがとうございます
「たのしいCocoa」にします

733:デフォルトの名無しさん
08/12/28 13:29:54
「やさしいC」は言語の理解に重点を置いた本だから

荻原 剛志「詳解 Objective-C 2.0」
Stephen G. Kochan "Programming in Objective-C"

この2冊が該当する。Kochanの本を和訳して欲しいと思っている。

734:730
08/12/30 12:26:15
>>731
サンクス


735:デフォルトの名無しさん
08/12/30 12:30:53
ObjectiveCってわざわざC言語の拡張にしたから構文がキッタナイキッタナイ
この言語の構文は学部生の卒論レベルだぞ
まったく整理されてない
企業でやるならもう少し良く考えて作ってほしい

736:デフォルトの名無しさん
08/12/30 12:37:51
そんなに汚い汚い言うほど派手に拡張されてないし、
言語というよりは動的な環境を提供するライブラリ+呼び出し用マクロって感じだよ。
昔からあるじゃんESQL/Cとか。ああいう系統。

737:デフォルトの名無しさん
08/12/30 12:48:11
ごめん、C++のほうがキッタナカかったわ
まぁ、C言語を拡張した言語ってのはろくなもんじゃないってことで

738:デフォルトの名無しさん
08/12/30 12:53:08
Obj-C の方が汚いだろ・・・。

739:デフォルトの名無しさん
08/12/30 12:56:28
Obj-C は拡張じゃなくてハイブリッドじゃないの?
まあ、僕も中括弧族の言語は好きくないけど
>>735 綺麗だと思う言語教えて

740:デフォルトの名無しさん
08/12/30 13:18:30
735じゃないけど、綺麗だなって思うのはPythonくらい。
そもそもSmalltalkの構文が(思想は別にして)美しく感じられない。

741:デフォルトの名無しさん
08/12/30 13:27:41
構文が美しいっていうのは、大抵その美しいと言われるところで好みが分かれがちだよね。

742:デフォルトの名無しさん
08/12/30 13:43:08
まあ、世界の最高級の頭脳が集うアップルの上を行く 735 が
画期的な新言語を発表して、あっという間に世界中に広まるよ

743:デフォルトの名無しさん
08/12/30 13:44:58
>>739
何が1番きれいかといえば scheme シンプルだしな。
2番目は haskell モナドで一貫性あるプログラミングができる。
3番目は smalltalk でもプログラミング環境や動作環境は最悪最低。遊び専用言語。

744:デフォルトの名無しさん
08/12/30 13:45:44
>>742
別にそんな最高の頭脳が集まってるわけじゃないと思うぞw
俺だって一応オックスフォード出身だし。

745:デフォルトの名無しさん
08/12/30 14:24:14
Obj-C はあのモサイところがいいんじゃないか。
美しさばかり追い求めていてはいかんよ。まだまだ若いな。

746:デフォルトの名無しさん
08/12/31 02:17:46
>>742
残念ながら、言語が広まるかどうかはマーケティングに大きく依存するんだよ。

747:デフォルトの名無しさん
08/12/31 05:30:07
アップルはマーケティングだけはうまいはずなのにw

単に中途半端だから普及しないんでしょ。
言語の洗練度ではJavaやらに劣り、速度ではC++に劣り、ここ数年のトレンドのWEB系ではPHPやperlに劣る。

748:デフォルトの名無しさん
08/12/31 06:02:26
iPhoneは今はまだObjective-Cだけでしょ。

どうせ英語のリファレンスが読めなくて、使いたくても使えないからヒガンでるだけでしょ。


749:デフォルトの名無しさん
08/12/31 06:31:10
>>748
日本語の解説もでてるっつーの。アップルのサイトとか見ろ。
つーか、そもそも他の言語は英語だけでも普及したけどな。

750:デフォルトの名無しさん
08/12/31 10:18:05
Javaが洗練されているとかいってるやつは頭がおかしいだろ

751:デフォルトの名無しさん
08/12/31 10:36:58
まさにマーケティングの効果w

752:デフォルトの名無しさん
08/12/31 11:33:32
>>747
だったら何でハードもOSもシェアがあんなに少ないんだ?

753:デフォルトの名無しさん
08/12/31 11:35:00
>>748
Objective-Cが使えるか使えないかなんて低レベルな話はしてないんだよw
あんなものチュートリアル読んだら30分で使えるだろ

754:デフォルトの名無しさん
08/12/31 12:12:59
まあ、もっと低レベルな話ならしてるよな。


755:デフォルトの名無しさん
08/12/31 12:40:42
ihoneアプリを開発してるんですが、ObjectiveCで質問があります。

ObjectiveCのクラス内で、C++クラスを宣言したいんですが、include文でエラーが出ます。
どうやらC++クラスファイル内のclass宣言などで構文エラーが出ているようなんですが、
ObjectiveC内でC++クラスを宣言する際にコンパイルオプション等の設定は必要なんでしょうか?

どなたかご教授していただけるとありがたいです。

756:デフォルトの名無しさん
08/12/31 12:44:34
>>747
Objective-CはC言語に変換されるんだからC++より早いか同等のはずだぞw


757:デフォルトの名無しさん
08/12/31 12:51:37
それはないw

758:デフォルトの名無しさん
08/12/31 14:19:13
>>755
拡張子をmからmmにする
外してたらスマン

759:デフォルトの名無しさん
09/01/01 10:41:46
メッセージパッシングしなければCと同等だろうな。
そんなのはObj-Cじゃないけど。

760:デフォルトの名無しさん
09/01/01 11:59:59
オブジェクト指向では本当のメッセージパッシングは行えないよ。
Erlangのように部品が本当にプロセス(OSのプロセスとは別物)で動いているような言語がオブジェクト指向の進化系だと思うね。

761:デフォルトの名無しさん
09/01/01 12:36:32
誰もそんな話はしてない。

762:デフォルトの名無しさん
09/01/01 12:55:42
つまりだね、Objective-Cはもはや古臭い言語の一つというわけなんだよ

763:デフォルトの名無しさん
09/01/01 13:09:03
そらあ、30年以上前の言語を二つ合体させたんだから、古いよな

764:デフォルトの名無しさん
09/01/01 15:16:09
でもプログラミング言語って意外と新しいから良いっていう感じでもないよね。

765:デフォルトの名無しさん
09/01/01 22:03:33
>>764
それはマーケティングの効果
あるいはすでに普及している言語から移行のしやすさの効果

766:デフォルトの名無しさん
09/01/01 22:04:04
良い悪いが普及しているかしていないかではないんだよ

767:デフォルトの名無しさん
09/01/01 22:20:39
移行するメリットだな。

768:デフォルトの名無しさん
09/01/01 23:29:03
人が物を買うインセンティブは「より良いもの」よりも「不便」から生まれるらしい。
たしかにC++でどんなプログラムだって書けるから、多少便利になる程度では移行するインセンティブは生まれない。
だからほかの言語に移行するのがめんどくさい。

RubyOnRailsみたいに、使わないと不便になる、という状況が生まれない限り言語の以降はないだろうね。

769:デフォルトの名無しさん
09/01/02 20:07:06
apple的にMac/iPhone専用言語なんやし、他に広げる意味なんてないと思うが。


770:デフォルトの名無しさん
09/01/02 20:17:30
>>769
広まることはappleとObjCプログラマの双方に有益だと思うね。
ObjCが広まればObjCプログラマはObjC製だらけのMacOSXを使いたくなるかもしれないし、
ObjCプログラマはMacOSXで培った技術をほかのOSでも活用しやすくなる。

771:デフォルトの名無しさん
09/01/02 22:23:25
広まるって自動詞的に書いてるけど、広げる努力しなきゃどんなに良いモンだって広まらんでしょ。
Appleにはそんな事期待できんし、CocoaフレームワークのないObjective-Cなんぞ誰が使うのよ?

772:デフォルトの名無しさん
09/01/02 22:49:02
そこで Cocotron ですよ
URLリンク(www.cocotron.org)

773:デフォルトの名無しさん
09/01/03 04:34:06
オブジェクト指向な言語とフレームワークを勉強したいのですがOBJECTIVE-CとCOCOAって
適していますか?
それともJAVAとかMFCの方がいい?

774:デフォルトの名無しさん
09/01/03 04:38:33
MFC は設計マズいので適さない。
今更 Java するよりは .NET の方が良い。
Objective-C & Cocoa と .NET のどっちがいいかは OS 次第だろう。

775:755
09/01/03 19:12:38
>>758

ありがとうございます。mmに変更しいろいろやってみましたが、駄目です。
怪しいところはないと思うんだけど、なんでだろう。。。
どうもコンパイラがC++ではなく、Cのみでコンパイルしているっぽいのですが。


エラー文です。
-----
error: syntax error before 'ClassName'
error: syntax error before '{' token
error: syntax error before '=' token
error: syntax error before '=' token

もうC++のクラスを使用するのは、あきらめた方がいいんでしょうか。

776:デフォルトの名無しさん
09/01/03 19:56:56
>>775
;を忘れてるとかそういうのじゃないの? アップルの構文解析は糞だから、エラーはあてにならない。

777:デフォルトの名無しさん
09/01/03 20:40:04
>>775
僕らだってエスパーじゃないんだから、ソースコードをアプロダに貼るとか、最低限の行数まで削ってここに貼るなりしてください。

うちでは以下
#import <Foundation/Foundation.h>

@interface Aho:NSObject
{
int aMember;
}
-(id)aMethod:(int)baka;
@end

class Baka
{
public:
int i;
};
を aho.mm に保存して
gcc -c aho.mm 
でコンパイルできるよ?

778:デフォルトの名無しさん
09/01/05 21:36:17
評論家がたくさんいるようだが、そんなにobj-cを修得している椰子がいるとは思えない。
しったかはみっともないぞ。

779:デフォルトの名無しさん
09/01/05 21:51:35
多言語厨なら言語習得ぐらい1時間かそこらでできるだろ

780:デフォルトの名無しさん
09/01/07 23:05:01
メモリに関するいいサイトってありますか?

C 自体の初心者なんですが、dealloc とかしなきゃいけないと思って
いたら、そういう事をしていないサンプルばかりで困っています。

一般的な流れとして、どういう感じに alloc して dealloc するのか
知りたいのですが…。

781:デフォルトの名無しさん
09/01/07 23:13:59
dealloc は自分で呼ばず release を呼ぶ。
あるいは autorelease するか。

782:デフォルトの名無しさん
09/01/07 23:14:37
URLリンク(developer.apple.com)

自己レスですが、ここは一応読みました。
でももっとフローが分かりやすい実際のサンプルが見たいんです…。

783:デフォルトの名無しさん
09/01/07 23:24:22
これ買っとけ
URLリンク(www.amazon.co.jp)

784:デフォルトの名無しさん
09/01/08 00:14:17
>>780
>dealloc とかしなきゃいけないと思って
>いたら、そういう事をしていないサンプルばかり

どこにそんなのあるの?

785:デフォルトの名無しさん
09/01/08 01:08:29
>>784
例えばこのサンプルの中では dealloc という文字は出てこないです。
まぁ必要がないだけかもしれませんが…。

でも IBOutlet 系のクラス変数は dealloc しなくていいのでしょうか?
少なくともヘッダを見ると4つのクラス変数がある様ですが…。

URLリンク(developer.apple.com)

786:デフォルトの名無しさん
09/01/08 01:39:51
すいませんこりゃまた自己レスですが、IBOutlet 系のものを dealloc したら
元のオブジェクトが破棄されちゃうからしない、って事でしょうか?

787:デフォルトの名無しさん
09/01/08 01:47:13
「一応読みました」じゃなくってちゃんと読め。
「dealloc は直接呼び出してはなりません」って書いてあるだろうが。

788:デフォルトの名無しさん
09/01/08 01:54:33
>>787
何でダメなんでしょうか?

では、dealloc はオーバーライドするためだけにあると考えていいでしょうか?

789:デフォルトの名無しさん
09/01/08 07:12:40
>>788
なぜだと思う?
調べればすぐ分かることは自分で調べろ。

790:デフォルトの名無しさん
09/01/08 08:20:18
アホすぎて朝からビビった

791:デフォルトの名無しさん
09/01/08 10:04:57
すんません。Objective-C どころか C 自体が初めてなのでおかしな事も
言っているかもしれません。

直接 dealloc しないのはどこかで retain している可能性があるからって
事でしょうかね。

なんとなく分かって来た気がします。にしても release しているサンプルが
あんまりないのが気になりますが…。

dealloc 時に自動的にインスタンス変数も解放してくれないのは仕様ミス
の様な気がするんですけどねぇ…。オブジェクトは解放したのにその
インスタンス変数だけ確保しておきたい事なんてあるんでしょうか。

792:デフォルトの名無しさん
09/01/08 10:11:45
>>791
こっちへ移動してください。
スレリンク(mac板)


793:デフォルトの名無しさん
09/01/08 13:09:06
つか詳解Objective-C2.0買うなり何なり、
Obj-C関連の ドキュメント を読め。
それともあれか、ソースがドキュメントとかの
ドキュメントレスの世界で生きてきたのか?

ついでにオーナーシップの仕組みも理解してない内から、
仕様云々ってのは単なる理解の放棄でしかない。

794:デフォルトの名無しさん
09/01/08 21:28:26
参照カウンタでググれとしか言いようが無い。

795:デフォルトの名無しさん
09/01/08 21:33:39
誘導した人間じゃないんだが、新Mac板Cocoaはさっぱり!!でお預かりしましたので、
引き続きご歓談ください。

796:デフォルトの名無しさん
09/01/09 00:28:43
>>773
smalltalkが一番向いていると思う。

797:755
09/01/09 00:30:43
>>774
>>775

亀レスで申し訳ないですが、事故解決しました。

どうやらheaderファイルを使用してそちらにC++クラス宣言を書いていたのが原因のようです。
C++クラスだけ.mmファイル内で宣言するようにしたらコンパイルできました。
ありがとうございました。


798:デフォルトの名無しさん
09/01/13 18:05:29
↑↑馬鹿だろ

799:デフォルトの名無しさん
09/01/17 20:50:45
799

800:デフォルトの名無しさん
09/01/17 20:51:19
800

801:デフォルトの名無しさん
09/01/17 21:47:52
矢追

802:デフォルトの名無しさん
09/01/23 17:22:07
”NSKVONotifying_....”というクラスについて質問です。
MyObject というクラスを作って + initialize を埋めました。そしたら、子クラスが無いに
も関わらず、initialize が2回呼ばれました。変だなと思い、中で NSLog(@"%@", self) を
やると、”MyObject" と"NSKVONotifiying_MyObject" が出てきたんです。MyObject は
KVO を使っているので、勝手に作られた子クラスと思われますが、これって何ですかね?

803:デフォルトの名無しさん
09/01/23 23:34:23
>>802
KVO は実装するために、Cocoa の runtime が Objective-C の runtime を駆使して別個のクラスを動的につくって入れ替えて... とやってます。
"isa swizzling" とか呼ばれます。ググって勉強してみてください。

804:デフォルトの名無しさん
09/01/24 08:29:17
ちょうど解説があったよ。
URLリンク(www.mikeash.com)

805:デフォルトの名無しさん
09/01/24 17:14:50
ありがとう。勉強してみます。

806:デフォルトの名無しさん
09/01/25 22:33:33
iPhoneの低層のAPIを使って動画プレーヤー作りたい.
vlc-4-iphoneとかで使われてるcore_surfaceクラスとか使いたいがヘッダとか見当たらんのだけど,DSOとかで使えるようになったりするもん?

807:デフォルトの名無しさん
09/01/26 20:45:58
最近、Cocoaプログラミング始めた初心者です。
特定のTextFieldにフォーカスが移った時に、
半角英数入力に強制的に替えるにはどうすればいいですか?

808:デフォルトの名無しさん
09/01/26 21:54:49
>>807
スレリンク(mac板)
こっちで再度質問して。

809:jP
09/02/01 20:02:11
最近Mac向け開発を始めたんだけど、手順がよくわからん。
javaとかCと違って、インタフェースとコードが分かれてるから感覚がつかめないんだよね。
だれか、C/javaからobjective-C始めた人っている?
その辺を話したいんだけどなぁ。(ここに書くようなことじゃなかっから、ごめんちゃい)

810:デフォルトの名無しさん
09/02/01 20:13:07
むしろ大半がそうじゃね

811:デフォルトの名無しさん
09/02/01 20:20:37
ごめん俺AppleScript → ObjCだわ

812:デフォルトの名無しさん
09/02/01 20:24:24
俺なんかなでしこ→AppleScript→Objective-C(移行中)だぞw

813:デフォルトの名無しさん
09/02/01 20:37:45
Java→Objective-Cだけど呼んだ?
つかJava分かるならObjective-Cなんかすぐ分かると思うんだがなぁ。
勉強しなきゃいけない分量で言ったらJavaの1/3くらいじゃなかろうか。

814:デフォルトの名無しさん
09/02/01 21:40:44
気味の悪い文法が障害

815:デフォルトの名無しさん
09/02/01 22:41:34
文法はどうでもいいんだけど、
MSのダブルクリック&コードとn層データ構造に慣れてたから
CocoaのMVCには結構馴染みにくかったな。
あ、あとVSのIntelisenceに慣れてたからXcodeも面倒くさかった。
まぁ慣れだな。

816:デフォルトの名無しさん
09/02/01 22:46:42
>>809
既にプログラミングやったことあるなら、ADCのObjective-Cプログラミング言語とかCocoa基礎ガイドとか読めばいいと思うよ。

817:デフォルトの名無しさん
09/02/01 23:53:31
gccの-fobjc-direct-dispatchってもしかして
メソッドの実装を直接呼び出してくれるの?

818:デフォルトの名無しさん
09/02/02 03:10:32
objective-cを使ってアプリを作れるようになるには、何をすれば良いですか?
cocoaプログラミングの本は読みました。
例えば、Cの関数を覚えるとか、何かあったら教えてください。

819:デフォルトの名無しさん
09/02/02 03:25:06
>>818
釣れますか?

820:デフォルトの名無しさん
09/02/02 07:44:55
>>815
ダブルクリック&コードにかんしては
URLリンク(dotnetaddict.dotnetdevelopersjournal.com)
のひとが面白い分析をしてるなとおもった。
まあこのひとは .Net から Obj-C に半分ぐらい転向したひとなので、
無理に弁護してる感もなきにしもあらずなのだが...

821:デフォルトの名無しさん
09/02/02 07:50:37
>>817
>gccの-fobjc-direct-dispatchってもしかして
>メソッドの実装を直接呼び出してくれるの?
そんなことしたら Obj-C の良さが台無しだろう。
それは objc_msgSend を呼び出すのが速くなる最適化です。
メソッドの実装が欲しければ Obj-C のランタイムつかってとってこれます。

五年前の msgSend の実装 を解析したのが
URLリンク(www.mulle-kybernetik.com)
にあります。最近はもっと最適化進んでるんでしょうが。

822:デフォルトの名無しさん
09/02/02 23:45:10
>>809
Cocoaアプリ開発って極端な話XCodeで新規プロジェクトを選んだ時点で
完成してるんだよね。だからコード書かなくても動く。
サブクラスで必要な部分だけどんどん拡張していける。
CarbonやWin32って1から全部書かないといけないんだよね。

Cocoaアプリ開発=Cocoaフレームワークの拡張かな。

823:デフォルトの名無しさん
09/02/03 00:14:27
というか、C / Java だって、大昔アセンブラつかってたひとからすれば、
レジスタをいじらなくても動くなんてよく判らん、とか、
自分で vram を叩かなくても文字が表示される、どうなってるんだ、
とかだったはずで、単に慣れの問題だとおもう。
徐々にシステム側が沢山の部分をやってくれるわけでさ。

824:デフォルトの名無しさん
09/02/03 00:27:52
>>821
レスどうも。リンク先面白かったです。

ObjCのメソッド呼び出しが遅いとかなんとか
読んだ記憶がありましたので、もしかしたらと。

にしても、ObjC動的すぎて素敵。
いや、むしろ変態。

825:デフォルトの名無しさん
09/02/03 01:26:04
Cはアセンブラとあまり変わらない感覚だったよ。
特に68系の場合はアセンブラもわりと高級言語っぽかったから、
コンパイルしたらどういうコードになるか容易に想像ついた。

826:デフォルトの名無しさん
09/02/03 06:20:08
>>814
> 気味の悪い文法が障害
smalltalk一回経験してるとそうでもないんだけどね
c++に慣れてると目が点になるかもしれん

827:デフォルトの名無しさん
09/02/03 08:14:20
822みたいな奴を見ると、Mac使ってることが嫌になる

828:デフォルトの名無しさん
09/02/04 08:06:40
マク関係はどうもスルー力が試される機会が多いんだよな

829:デフォルトの名無しさん
09/02/06 03:31:49
>>814
気味の悪い文法が障害

CやJavaやPHPやってるんだが、始めて2日でむしろ気持ち良くなってきたんだが。

830:デフォルトの名無しさん
09/02/06 08:33:34
自然にコメントを大量につけてることになるのがいいよね。
自分でつくるクラスのメソッド名もならって読んで意味のわかる英語になるようにしてる。
これだけで数ヶ月後にコードを見直したときの理解度が全然違うベ。

831:デフォルトの名無しさん
09/02/06 12:30:15
>>829
俺も大分気持ち良くなって来ました。

832:デフォルトの名無しさん
09/02/09 16:13:30
[Meta2ch agreeTo:829 with:"passion" ]

833:デフォルトの名無しさん
09/02/10 18:09:21
WindowsがF#に移行しつつあるのにobj-c2.0ぐらいの文法で障害とか
どんだけ池沼なんだよw

834:デフォルトの名無しさん
09/02/10 18:14:22
>>833
>WindowsがF#に移行しつつある
まあ一般化はあと5年は先だろうな。

835:デフォルトの名無しさん
09/02/10 18:44:28
iPhone デベロッパーズ クックブック
もうすぐ出るね。
URLリンク(www.amazon.co.jp)

836:デフォルトの名無しさん
09/02/10 20:56:13
>>833
Windows、F#に移行しつつあんの?
最新版VSで辛うじてサポート程度としかしらんかったわ。

837:デフォルトの名無しさん
09/02/11 12:43:58
C# <= C++
J# <= Java
F# <= Fortran??

838:デフォルトの名無しさん
09/02/11 22:37:06
Functional Language

839:デフォルトの名無しさん
09/02/12 15:42:45
F#は、Objective Camlだよ。
研究とか趣味の人向けの選択肢であって、大多数のプログラマには無縁の存在だから。

840:デフォルトの名無しさん
09/02/18 14:21:32
Windows版のGCCにはobjective-cコンパイラも付属してますが、
これを用いて、Windows APIをコールして、簡単なGUIアプリを作成できますか?

841:デフォルトの名無しさん
09/02/18 14:25:00
できるはず

842:デフォルトの名無しさん
09/02/19 00:33:30
Windows API をどうやって Obj-C にくるむかという問題があるのでは...
Windows で Cocoa で開発したければ Cocotron
URLリンク(www.cocotron.org)
とか GNUStep
URLリンク(www.gnu.org)
とかあるよ。

843:デフォルトの名無しさん
09/02/19 03:43:53
GNU Step入門
URLリンク(www.amazon.co.jp)
なんて本がこっそり出てるんだけど、1ナノセカンドも
話題になってない気がする。

844:デフォルトの名無しさん
09/02/19 04:18:22
作者の名前と経歴がなぜか笑えるw

そういえばFileMagnetのWindowsクライアントはCocotronで作られたんじゃなかったっけ?

845:デフォルトの名無しさん
09/02/19 08:33:44
>>842
直接APIをコールすればいいんでねいの?

846:デフォルトの名無しさん
09/02/19 21:12:59
>>843
なか見検索できないんだが、なかはどうなの?


847:デフォルトの名無しさん
09/02/19 21:37:40
あったかいナリ

848:デフォルトの名無しさん
09/02/20 00:54:58
>>822
>完成してるんだよね。だからコード書かなくても動く。

おまえプログラム組んだ事ほぼ皆無だろw
Interface Builderでコントロールをドラッグ&ドロップしてアプリが完成したつもりになってる輩とみたw
そんな作業、アプリ制作の1%程度の作業なんだが。


849:デフォルトの名無しさん
09/02/20 02:14:38
アホなりw

850:デフォルトの名無しさん
09/02/20 12:35:06
>>848
まあほぼ同意だが、Interface Builder は何かほかの GUI デザイナとちがって
作業時間が長いようなきがするな...
バインディングとかターゲット、outlet とかも一杯で。
ソースコードになってない情報が多すぎてわかりにくいときも。

851:デフォルトの名無しさん
09/02/23 09:30:44
NSObjectのカテゴリ作ってperformSelectorを上書きして
呼びだされたメソッド名を逐一NSLogで出力したいんだが、
元のperformSelectorを呼びだす方法ってあるかな?
おもしろそうなのに全然使いこなせてない気がする>カテゴリ

852:デフォルトの名無しさん
09/02/23 13:46:53
カテゴリでは同名のメソッドは追加できない気がする。
URLリンク(journal.mycom.co.jp)
にやりかたがのってますが、Leopard になってすこし runtime がかわったので
10.5 でコンパイルする場合は 10.4 用にインスペクタで設定しないと
そのままではコンパイルエラーがでるでしょう。
何にせよその連載は勉強になります。

また、メソッドの呼び出しの際に performSelector: がいつでも呼ばれるか
というとそうではないので...

URLリンク(developer.apple.com)

URLリンク(developer.apple.com)
URLリンク(developer.apple.com)
URLリンク(developer.apple.com)

のあたり参照。

853:デフォルトの名無しさん
09/02/24 16:03:34
>>851
> 呼びだされたメソッド名を逐一NSLogで出力したい

それはずばりアスペクト指向の典型的な活用例なんで、素のObjC/Cocoaでは難しい。

URLリンク(journal.mycom.co.jp)

854:デフォルトの名無しさん
09/02/25 03:05:20
そういうのは DTrace が得意そうだね >> 呼び出されたメソッドの書き出し

855:デフォルトの名無しさん
09/02/25 03:57:43
>>854
DTraceはカーネルの呼び出しだけでしょう? ユーザー空間内での
やり取りは無感知。

856:デフォルトの名無しさん
09/02/25 09:34:51
>>855
そうでもないよ。objc????:: という provider があります。
URLリンク(www.mactech.com)
とか参照。

857:デフォルトの名無しさん
09/02/25 11:37:13
>>855
そんな事無いですよ。DTrace 自体はプローブポイントさえあれば、カーネルか
ユーザープロセスかは無感知。

858:デフォルトの名無しさん
09/03/01 12:49:31
objective-cで、あるパターンの中から文字列を抽出したいと思っています
<p class="info"><strong class="number">6</strong>|<strong class="time">3:16</strong>...
上記のような文字列から 6 と 3:16 の部分だけをそれぞれ取得したいのです
C#ではSystem.Text.RegularExpressionsのRegexクラスを使用して取得できたのですが、Objective-Cで同様の処理はどのように取得すればいいのでしょうか?
ちなみにiPhone上で動かそうと思っています

859:デフォルトの名無しさん
09/03/01 13:14:10
>>858
標準の NSScanner つかって頑張ってもいいけど、
個人的には RegEx Kit Lite がおぬぬめ。
URLリンク(regexkit.sourceforge.net)

860:デフォルトの名無しさん
09/03/01 13:29:01
>> 859
おおおまさにこれです!
ありがとうございました

861:デフォルトの名無しさん
09/03/03 01:59:36
質問です。
カテゴリを利用して、(ある1つのクラスの)ソースファイル
の分割を行うとします。

クラスAの実装ファイルを、
ファイル1とファイル2に分割、といった具合です。

そのとき、ファイル1で定義、実装されているプライベートメソッドを、
ファイル2で使おうとすると、ビルドのときに警告がでますが、これを
なんとかできないものでしょうか。

解決策として、そもそも、同一のプライベートメソッドを利用する
メソッド群を分割するな、という考えもあるかと思います。

また、コンパイラの警告レベルの調節でも、できるのかもしれません。

ですが、ほかにいい方法をご存知の方がいればご教示下さると助かります。
もしも、こういうこと(プライベートメソッドの他ファイルでの利用)
がプログラミングのマナー違反であれば、ご指摘下さい。

862:デフォルトの名無しさん
09/03/03 06:12:25
プライベートメソッドをならべたヘッダをひとつつくればいいんでは?

ClassAPrivate.h に

@interface ClassA (Private)
-(id)hoge:(id) ...
@end

とかしておいて、それを実装ファイルで #import すればいいとおもいます。
Obj-C では@interface ClassA (CategoryX) で宣言したやつの
実装を @implementation ClassA (CategoryX) の中でしないといけないという
ルールもないので、自由自在です。

863:デフォルトの名無しさん
09/03/03 12:43:26
その方法も頭に浮かんだのですが、ビルドのときに2重定義の警告と
なる気がして試してみませんでした。

864:デフォルトの名無しさん
09/03/03 17:17:10
>>861
分からないので聞くのですが、他から参照したいならなんでプライベートにするのでしょうか?

865:デフォルトの名無しさん
09/03/03 23:31:08
他から、といっても同じクラスなのです。

866:デフォルトの名無しさん
09/03/04 22:26:48
>>865
なるほど。
どうも私の頭がJAVA脳だったようです。


867:デフォルトの名無しさん
09/03/07 18:35:46
ClassA.hで
#import <Cocoa/Cocoa.h>
#import "ClassB.h"
@interface ClassA : NSObject {
ClassB* b;
}
@end
ClassB.hで
#import <Cocoa/Cocoa.h>
#import "ClassA.h"
@interface ClassB : NSObject {
ClassA* a;
}
@end
というように、互いにインスタンスを持ち合うとコンパイル時にエラーが出ますが、
ClassA.h内で
#import "ClassB.h"
@class ClassB;
ClassB.h内で
#import "ClassA.h"
@class ClassA;
というふうに@classディレクティブを付けることでエラーが出なくなります。
@class classnameが、classnameがクラスであることを宣言しているのはわかるのですが、
なぜこれをやると、ClassA.h、ClassB.hを互いにimportしているにもかかわらずエラーが出なくなるのでしょうか。
逆に、付けないとなぜエラーになるのでしょうか。
また、@classを付ける基準ですが、
・そのクラスのスーパークラス
・Cocoa等のフレームワーク内のクラス
を除く全てのクラスを使用する時、必ず@classをつけるという考え方で良いのでしょうか。

どなたか詳しくご存知のかたよろしくお願いします。

868:デフォルトの名無しさん
09/03/07 19:01:04
>>867
詳しくはないが、自分ならこう考える
Objective-Cの背後にある仕組みは結局Cと何もかわらない
importは本質ではなくひとつのファイルに連続して次のように書けるかという問題
Cではこう書けない
struct A { struct B *b; };
struct B { struct A *a; };
なぜならAの宣言時にBはまだ宣言されていないから。しかしCでは不完全型を定義できて、
struct B;
struct A { struct B *b; };
struct B { struct A *a; };
こう書く事ができる。Aの定義時にBは不完全型なのでインスタンスは作れないが、ポインタは作れる。ポインタのサイズはどの構造体でも固定だからだ
で、Objective-Cでも背後で同じようなことが起きてるんだと思うよ
@class B;
として不完全型を定義すればそのポインタを次の行からは使えるようになる
だからエラーにならない
どう?


869:デフォルトの名無しさん
09/03/07 19:10:43
>>867
だから、@classを付ける基準は
相互に依存するクラスを定義しなければならない時、またこのときは@classを書かざるを得ない
だけ
それ以外は冗長で無駄


870:デフォルトの名無しさん
09/03/07 19:18:21
>>868
ありがとうございます。今までずっと悩んでたのですが、すっきりしました。

>>869
特別な場合を除いて不要という形ですか、ありがとうございます。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch