Objective-C [ObjC part:3];at TECH
Objective-C [ObjC part:3]; - 暇つぶし2ch750:デフォルトの名無しさん
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