1 名前:デフォルトの名無しさん [2009/04/15(水) 00:11:00 ] Objective-C(オブジェクティブ シー)はプログラミング言語の一種。C言語をベースにSmalltalk型のオブジェクト指向機能を持たせた上位互換言語。 (Wikipedia:ja.wikipedia.org/wiki/Objective-C より) Objective-C [ObjC part:3]; ttp://pc12.2ch.net/test/read.cgi/tech/1186543111/ Objective-C ttp://pc11.2ch.net/test/read.cgi/tech/1106983092/ Objective-C ttp://pc5.2ch.net/tech/kako/990/990574267.html
116 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:00:46 ] >>115 んなわけねーだろ。retain count を勉強し直してこい。 2chで調べ物をしたい時は「教えてください」って書いても なかなか教えてもらえない。 そういう時は、知ったかぶり風に間違ったことを自信満々に書く。 そうすると、ものすごい勢いでツッコミを入れてもらえる。 コピペ新聞 - 調べ物のコツ copipe.info/archives/9084 ということですか。
117 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:56:44 ] >>116 そのメソッド頂いたっ!
118 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 02:29:23 ] >>114 いやネタっつうか、できるできないで言うならできるという意味で書いた そりゃ普通こんな書き方はしないけど
119 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 05:54:02 ] retain/releaseはObjective-Cと関係ないけどなんでここでやってんの? Cocoaスレでやれば良いのに。
120 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 07:04:39 ] OpenStepで規定されてるしここでいいんでねいの。
121 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 07:34:48 ] 正しい書き方は一体どれなの?
122 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 07:56:37 ] そういう大事なことはこんなところで断片的な情報をかき集めるより書籍かなにかで 体系だった解説をきちんと読むべきだと思う。 Cocoa周りはアップルが出しているリファレンスがしっかりしてるから>>91 の リンク先でも読むといいよ。
123 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 08:42:14 ] ぶっちゃけOpenStep系以外のObjCフレームワークだってほとんどretain/release採用してるでしょ
124 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:23:46 ] ここで出てるような単純なサンプルならいいけど、 一般にはオブジェクトを入れてから取り出すまでに、別スレッドからdictionaryをいじられて、別のオブジェクトをreleaseしてしまう可能性がある。 まあ作法として避けておくのが無難。
125 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:34:39 ] あんなコード書いてたらどうしようもない馬鹿だと思われることは確実。
126 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 13:14:39 ] >>96 のことな
127 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 14:30:20 ] >>126 すまん、初心者でよくわからんのだが、 >>96 のやり方だと何がまずいのか教えてくれ。
128 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 15:34:59 ] >96 のその部分だけ見れは、前者だろうが後者だろうがメモリリークする 実は前者はこの後のコードでリリースしてます、とか オーナーシップとかしらね、後でリリースできれば良いんだよ、 とかって言い出さない限り。
129 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 18:59:21 ] autoreleaseされたインスタンスを返すfactory methodを作るのが普通の感覚でしょ。 そこに思い至らない時点で実力は推して知るべしだから、GC使うかリークなんて 気にしなくて良いよ。リークが問題になる規模の物はどうせ作れないし、多分他にも 問題山積で誰も気が付かない。
130 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 23:38:40 ] OS3.0のiPhoneでも autoreleaseは果てしなく遅いぞ
131 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 00:41:02 ] iPhoneでGCって性能的にやっぱ厳しいのかな
132 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 10:11:29 ] OS X でも GC は案外リソース喰う気がします Core Data で GC つかったフリーウェアつくってますが、使っていると 時々 CPU 使用率があがるのは何故かと問い合わせがあって、 しらべてみたら GC がかなり頑張ってるように見えました。
133 名前:デフォルトの名無しさん [2009/06/17(水) 19:24:12 ] journal.mycom.co.jp/column/objc/019/index.html こちらの方法で、特定のクラスのメソッド一覧を取得しようとしたのですが、 Objective-C 2.0でobjc_method_list構造体の構造が変わってしまっているようで、このままでは取得できませんでした。 Objective-C 2.0における、objc_method_list構造体もしくはそれに変わる構造体について、知っている方居たらよろしくお願いします。
134 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 20:06:24 ] >>133 class_copyMetodList(Class cls, unsigned int *outCount) なおその手のものは、Obj-C 2.0 RuntimeAPIに載ってる。 ttp://developer.apple.com/DOCUMENTATION/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html
135 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 01:06:04 ] >>134 Runtime Referenceがあることを知りませんでした… ありがとうございます。
136 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 21:41:42 ] OS3.0だとNSOperationQueueにaddしたOperationが2つしか実行されなくなるんだけど実装方法変わったのかな?
137 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 13:27:15 ] setterが失敗したときって、どういう処理をすべきでしょうか? 1. setterの返り値をBOOLにしてNOを返す。 2. objective-c例外を投げる。 1はsetterの返り値がvoid以外になると、KVCとかでおかしなことにならないか心配。 2は、c++の例外とのすみわけがややこしいので、できればobjective-cの例外は使いたくない。 どうしたもんでしょう。 ライブラリとしては、c++は使わないと割り切ってobjective-cの例外使うべきなのか…
138 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 14:01:29 ] setterが失敗って? 予期しないオブジェクトが渡されたって事ならObjCの例外を投げるのが普通。
139 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 17:29:31 ] あとはデリゲートで処理とか?(それも含めてならごめん)
140 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 18:36:08 ] 3. 何もしない 本当に値がセットされてるかどうか知りたかったら getして比較しろや! 4. exit(3)をコール 気に食わなければ黙って帰る 5. abort(3)をコール そんな話聞いてないです!
141 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 03:26:10 ] これじゃだめ? - (void)setHogeHoge:(Hoge *)aHoge error:(NSError **)error;
142 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 04:02:09 ] >>141 KVCしたいってことだからそれじゃ駄目じゃね? >>137 1.で問題ないんじゃない?Obj-Cのメッソドディスパッチはそんなにヤワじゃないよ。
143 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 07:10:47 ] ええかげんなこと書くな。 NSKeyValueCoding Protocol Reference - (BOOL)validateValue:(id *)ioValue forKey:(NSString *)key error:(NSError **)outError おまいらまぬある嫁。
144 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 11:52:18 ] それだとKVCのときだけしか通用しないよね
145 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 16:22:38 ] KVCはNSKeyValueCodingプロトコルですでに定義されてるんだから、 BOOL返したいんなら同等の別のメソッドとして定義すればいいだけじゃん。 KVC準拠のsetterなら戻り値はvoid。 なんとかしたいなら単に例外投げればいい。
146 名前:137 mailto:sage [2009/06/27(土) 22:24:24 ] んー、validate???: error:か、validateValue:forKey:error:使うのが、 ルールなんですね。 ttp://developer.apple.com/jp/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/Validation.html でも、自動で呼ばれるわけじゃないんで、呼び出し側がvalidateした後にsetするわけですか。 すると、validateとsetの間に他スレッドに割り込まれないようにするためには、 呼び出し側でロックしないといけなくなって、イマイチ。 すると、setterでobjective-cの例外投げたくなるけど、「荻原本」とか、 ttp://google-styleguide.googlecode.com/svn/trunk/objcguide.xml#Avoid_Throwing_Exceptions 見ると、objective-c例外は使うな的なことが書かれてて(両者の理由は違うけど)、悩ましい。
147 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 01:01:34 ] >>146 Cocoa API 自体が予期せぬ引数を与えられた場合は 頻繁に Obj-C 例外投げるので、 別に自分が投げても大勢に変化ないと思いますが...
148 名前:デフォルトの名無しさん [2009/06/28(日) 15:06:59 ] ちょっとイニシャライザに関して、質問よろしいですか。 wisdom.sakura.ne.jp/programming/objc/objc7.html ここのページの指定イニシャライザのサンプルプログラムなんですが id pt1 = [Point new]; id pt2 = [[Point alloc] initWithPoint:400 int:300]; メイン関数(メソッド)で、pt2にオブジェクトをセットする際に initが走ってないように思うんですがこれでいいもんなんですか? [[クラス名 alloc] init]のセットで覚えてきたので、initしなくて いいのかなっていう疑問なんですが。 ※pt1はinitのオーバーライドで[super init]が走ってるからいいとして。 init自体がよく分かってないから、こういう質問してしまってるのかもしれ ないですが、この方法は正しいのか誤ってるのか、また正しい場合は何故な のかご教授下さい。
149 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 16:03:34 ] init〜ではじまるメッセージは内部でinitを呼んでるはずだから大丈夫。
150 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 16:28:17 ] え?逆じゃね? NSObject +newは、内部的に[[NSObject alloc] init]と等価。 指定Initializerは他のinitから呼ばれる基本部分を含んだ、共用部分。 この例では、 [Point new] [Point alloc] init] はどちらも、内部的にinitWithPointを呼んでいるということ。 もちろん引数は初期値を使っている。この場合は0だろうね。
151 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 20:15:22 ] >>150 >>148 はpt2の初期化のことを聞いてるんじゃね? ちなみに>>148 のコードをXcode 3.1.3(gcc 4.0.1)で試したところ、正しく動作した(ただしそのままだとコンパイルも通らないので、本質的でないところは改変した)。 ただ、このサンプルコードはPointのインスタンス変数を読んでprintfしているだけだから上手く動いたのかもしれん。 [super init]がないことに関しては、>>149 の言うとおりなのかもしれんが、そうだとするとメソッド呼び出しが循環するし、そうでないとするとObject部分が初期化されていないということになるから、あまり良い実装ではない気がする。
152 名前:デフォルトの名無しさん [2009/06/28(日) 21:07:22 ] 148です。 >>149 様,>>150 様,>>151 様ご回答ありがとうございます。 結局はpt2ではinitを明示していないので疑問に思ったのです。 >>149 様が仰っているように、メソッド名にinit〜をつければinitWithPointで initが自動的に走る、という考えなら納得いきます。 ただ、詳解Objective-C2.0では、サンプルコードのinitWithMinという メソッド内で[super init]と明示しているので、メソッド名に init〜を付けただけではinitが走らないとも判断できます。 まあ・・・[クラス名 alloc] init] の形で覚えておけば問題ない所だと 思うのですが。
153 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 22:43:13 ] >>148 のコードは駄目だな。普通はこうだろう。 - (id) init { return [self initWithPoint:0 int:0]; } - (id) initWithPoint:(int)x int:(int)y { if ((self = [super init])) { self->x = x; self->y = y; } return self; }
154 名前:150 mailto:sage [2009/06/28(日) 23:08:13 ] ああ理解した。 リンク先のコード見てなかったが、ひどいコードだったのね。
155 名前:デフォルトの名無しさん [2009/06/28(日) 23:42:37 ] 148です。 >>153 様、レスありがとうございます。 やっぱり>>153 様のように[super init]で初期化して判定させた方がいいです よね。ありがとうございました。
156 名前:デフォルトの名無しさん [2009/06/28(日) 23:58:33 ] ここ読むといいよ developer.apple.com/jp/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_6.html#//apple_ref/doc/uid/TP40002974-CH4-SW17
157 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 00:01:34 ] >>153 > - (id) initWithPoint:(int)x int:(int)y { > self->x = x; > self->y = y; これってどうなの?
158 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 00:07:29 ] 銅ではありません。
159 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 02:14:09 ] >>148 wisdom.sakura.ne.jp/programming/objc/objc7.html は情報が古すぎるから初心者は読まないほうがいい
160 名前:150 mailto:sage [2009/06/29(月) 07:49:54 ] インスタンス変数なんだよね? 意味府。
161 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 08:22:39 ] 148です。やはり、元の情報が古いように感じますね(後に他のページも参照 してみた感想です)。 詳解Objective-C2.0が難しすぎたんで、上記のサイトを参考にしていたんで すが、誤字脱字が多く、たまにコーディングミスもあったりしてかえって混 乱してしまった、というのが素直な感想です。 余談ですがObjective-cってなんか楽しいですね。感覚的に、ですが。。。
162 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 15:06:09 ] >>161 ヒレガス本を買うのが一番おすすめ。最新版の日本語訳って出たんだっけ? 英語が読めれば英語版をかうのがよし。 cocoadevcentral.com/ もわかりやすいよ。英語が読めれば。
163 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 17:33:45 ] ヒレガス本の最新版の和訳は、たのみこむあたりに持ち込むしかないのだろうか…
164 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 20:49:49 ] またまた148です。>>162 様、書籍紹介どうもです。 ヒレガス本調べてみましたが、かなり評判いいみたいですね。 英語は得意ではないですが、読むこと事態に嫌悪感は無いので是非購入してみ たいと思います。・・・まあ少々お高いのでまた来月にでも。 教えて頂いたサイトも参考にさせて頂きます。さらっと読んでみましたが図が あって理解し易いですね! また勉強して戻ってきたいと思います。できればアドバイスする側で! 貴重なお時間を割いて頂き、皆様には感謝致します。
165 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 21:33:26 ] >>164 2ページに1枚はスクリーンショットがあるレベルだ。安心していい。 ナイトライダーについてWiki辺りで調べておくとなおいい。
166 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 00:25:59 ] >>165 いや、日本人でもナイトライダーしってるだろ... いまどきの若者はそうでもない?
167 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 11:45:24 ] はい、マイケル
168 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 07:23:05 ] >> 164 Safari Books Onlineで立ち読みしてみたら?
169 名前:デフォルトの名無しさん [2009/07/02(木) 21:27:59 ] fscanfを使いたいのですが、どうしたらいいですか?
170 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 21:38:19 ] そのまま使えば良いんじゃない?
171 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 23:34:28 ] Objective-Cは2次元配列を扱えない糞言語である。
172 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 23:37:59 ] CとC++は?
173 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 00:12:11 ] int x = 20, y = 50; foo[x][y]; 何が不満なの?
174 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 00:07:26 ] 放っとけ。
175 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 00:09:45 ] int hoge[10][10] こいつをキャストする時って int(*)[10] get()とかでよかったんだっけ? C99の仕様と同じ?
176 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 01:04:37 ] malloc系使わずに int x = 20, y = 50; int hoge[y][x]; ってできる?
177 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 01:14:16 ] >>176 できる。C99。
178 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 16:30:47 ] ttp://code.google.com/p/plblocks/
179 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 19:27:02 ] blocks って何じゃいと思ったらレキシカルクロージャの事か www.mikeash.com/?page=pyblog/friday-qa-2008-12-26.html landonf.bikemonkey.org/code/iphone/Using_Blocks_1.20090704.html
180 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 00:31:15 ] >>179 Cocoa を Obj-C で組んでいると block が非常に欲しくなるのは事実なのだが、 C レベルで言語仕様を追加するのはいかがなものかという気もしないでもない
181 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 09:05:12 ] いつかObjective-C++0xも作られるのかね
182 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 09:10:34 ] なんで? いつかって0xということは今年中なわけだけど そんな情報入ってないぞ
183 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 10:28:56 ] ていうかObjC++ってObjCを普段CとしてコンパイルしてるところをC++としてコンパイルしてるだけだから gccがC++0xに対応すればその瞬間にObjC内でもC++0xが使えるわけだが
184 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 11:05:40 ] >>183
185 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 00:40:41 ] Objective-CってQueueクラスってないですよね なんでですか?
186 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 05:29:57 ] NSMutableArrayでまかなうから。 あんま好きじゃないけど
187 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 07:23:35 ] >>186 それは性能が激遅になってありえないですね STLの50分の1しか性能ないのにありえないじゃないですか?
188 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 09:19:59 ] >>185 Foundationのコレクションて、アプリケーションドメインで必要なものじゃなくて、 APIとのデータ交換に必要なものでしょ。 アプリ内でパフォーマンスを稼ぎたいなら、stlでもboostでも使えばいい。 データ交換には、タプル、配列、ハッシュの三種があれば十分。
189 名前:150 mailto:sage [2009/07/29(水) 23:21:15 ] こんな記事があった。 >ttp://homepage.mac.com/mkino2/spec/optimize/foundation.html
190 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 23:29:15 ] 自分はCFMutableArrayに構造体のポインタぶちこむだけで 普通に満足なんだけど、STLってそんなに早い? CFで固めると、void*埋め込めるしオブジェクトのretain/release すっとばせるし、楽だと思うんだけど。
191 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 23:39:16 ] 間違えた NSMutableStringを継承したクラスを作りたいのですが その中で、initWithString:を継承先のクラスに適合させるには どうやってラップすればいいれしょうか
192 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 00:42:23 ] { if(self=[super initWithString:string]){} return self; }
193 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 22:47:45 ] NSMutableArrayなどのコンテナクラスに オブジェクトを突っ込んだ後 それを取り出すときに、どうやって型判別するのですか? たとえばインターフェイスA、B、C、Dのインスタンスをいくつか 追加しているとの想定時、とどのように判断するのがObj-Cだと一般的なのでしょうか?
194 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 23:01:19 ] isKindOfClass:とか?
195 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 23:11:03 ] >>194 突っ込むインターフェースが増えた場合に、判定する箇所も増えるため、 バグを生みやすくなる(判定箇所の修正忘れ等) Obj-Cに限らず、コンテナには、同一クラス、または親(先祖)が同一のクラスに制限しておく方が安全と思われます。 どうしても異なるクラス、親、先祖を入れたいのであれば、 全てのクラスにプロトコルを採用し、共通の操作を行える様にするのが落としどころではないでしょうか?
196 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 23:24:39 ] >>194 そのAPIを単純に1億回実行してみたのですが 全然終わる気がしませんでした。たぶん普通の 用途では使えないと思います。 >>195 なるほど勉強になります。 A、B、Cの祖先をRとして @interface R : NSObject ... @end @interface A : R ... @end として操作するのはまぁいいのですが、例えば 入れ子になる。つまりCなんかがNSArrayなどの サブクラスをインスタンスに持ち、再帰的に呼び出す 場合、どのように扱うのが一般的なのでしょうか。 @interface C : R { NSMutableArray *array; ... } ... @end
197 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 07:57:30 ] 一億回呼ぶのが普通という基準がよくわからん
198 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 08:03:16 ] チェックが上手くできず無限ループに入ったって言いたいとか?
199 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 11:32:36 ] >>193 を読んで初心者だと思い安易な回答をしてしまった俺が悪かったよ
200 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 12:21:19 ] >>196 Objective-C に限らない話だとおもうが、 コレクションから A, B, C を取り出すループを書いて、 (全部 R のサブクラス) そのなかであからさまに C の場合だけ違う処理をさせるというのは 良くないです。 コレクションから取り出すループ内で クラスが C の場合だけ再帰的にしたい、というのは、 カプセル化に反します。 isKindOfClass: とか、 C++ なら dynamic_cast は最後の手段なので、 使いたくなったら反省すべきです。 ループ内ですべき仕事は R のメソッドにしておいて、 for(R* r in array){ [r doSomething]; } として、C での doSomething の実装内で NSMutableArray*array の内部の 操作をするのがよい。
201 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 12:28:44 ] >>196 再帰的なら、こういう事? @interface A:R {…} @end @interface C:R { NSArray *arrayC; } - (NSArray *) anUniqueSelector; // セレクタ名を共通に。再帰探索対象を返す @end @interface D:NSObject { NSArray *arrayD; } - (NSArray *) anUniqueSelector; // 必要なら、Rの子クラスチェックも可能 @end @implementation NSArray (recursive) - (id) recursiveOp { for (id obj in self) { if ([obj respondToSelector: @selector(anUniqueSeleclor)]) [self recursiveOp: [obj anUniqueSelector]]; //注:相互参照で無限ループ else if ([obj isKindOfClass:[R class]]) {…} … }
202 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 13:57:52 ] >>200 Obj-C触り始めて間もないのかな?isKindOfClass: は全く、全然、断じて、1_も、 最後の手段ではない。むしろ型判定の、最初の手段といっても過言ではない。 NSString などのクラスクラスタは、isMemberOfClass: では正しく判定できない。 NSString *hoge = @"~/Documents"; NSString *piyo = [hoge stringByExpandingTildeInPath]; [hoge isMemberOfClass:[NSString class]]; // NO, hoge: NSCFString class [hoge isKindOfClass:[NSString class]]; // YES [piyo isKindOfClass:[hoge class]]; // NO, piyo: NSPathStore2 class KVO では、-(Class) class さえ監視状態によって入れ替えるんだし。 Obj-Cにおいて、isKindOfClass: respondToSelector: object_getClass() 、 何を使おうとも、「正しい」型判定は現状で不可能。NSArray/MutableArray などは、実際に要素を追加/削除して例外発生させない限り、判定できない。
203 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 14:45:42 ] この場合は型判定を使うのが間違いだといってんだろうよ
204 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 19:43:44 ] 呼び出す側で判定して分岐するより、呼び出される側に共通のプロトコルを採用してポリモーフィズム
205 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 00:17:53 ] 型判定が最後の手段だというのは極端かもしれないけど、 それにべったり依存して型判定だらけになったプログラムも オブジェクト指向らしくないと思う。 まずは>>200 ,204のアプローチで設計し、 どうしようもない時だけ型判定で逃げるのが正道では。
206 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 01:31:27 ] >>202 >Obj-C触り始めて間もないのかな?isKindOfClass: は全く、全然、断じて、1_も、 >最後の手段ではない。むしろ型判定の、最初の手段といっても過言ではない。
207 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 02:53:12 ] ObjC的なオブジェクト指向の思想ではrespondsToSelector:使うのが自然のように思える。
208 名前:196 mailto:sage [2009/08/01(土) 13:22:20 ] >>200 では、基底クラスを設けないで@protocolで doSomthingを定義し、それを実行するのは Obj-C的にはどうでしょうか? >>201 そのようなコードを書いて、これ気持ち悪いコードだと思ったので ここで質問させてもらいました。 >>207 respondsToSelectorって頻繁に呼び出してもいいものでしょうか? 例えばRSSを解析するなどの用途で何度も何度も呼び出すと いいのだろうかと疑問に思うのですが
209 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 15:32:22 ] >>208 なんで RSS 処理で respondsToSelector とかの高等手段が必要なのか わからないんですが、どういう処理を書こうとしてるのか教えてください。 あと、respondsToSelector を頻繁に呼び出して良いか、ですが、 人によって「頻繁」の定義が違うので難しいです。 あなたのばあいは一億回とか平然と言うひとなので 頻繁に呼び出しちゃだめです。 最近はパソコン速いので100回や1000回ぐらいどうってことないです。 あと、スピードが気になったら Instrument 等でスピードを実測して、 プログラムのどこの部分で実際に時間がかかっているかチェックしましょう。 自分の勝手な思い込みで、実際には時間がかかってないところを 最適化してもしかたがないので。
210 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 15:36:01 ] >では、基底クラスを設けないで@protocolで >doSomthingを定義し、それを実行するのは >Obj-C的にはどうでしょうか? 別に基底クラスをつくるのと変わらないです。 R* x のかわりに id<R> x になるだけです。
211 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 16:06:51 ] Tiger環境なんだけどインタフェースビルダーが旧式だと知って絶望した… 豹買ってもいいけどもうすぐ雪豹でるし… でもそうしたら休暇が終わっちまう!
212 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 18:12:36 ] 情報の豊富な彪で覚えるまで雪豹は暫く放置で良いじゃん。
213 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:47:25 ] Objective-Cって継承でmethodをoverrideしたあとに更にそれを継承してもう一回overrideした場合、superで呼び出すと最終override以外のすべてが呼び出されるもんなの? sample #import <Foundation/NSObject.h> #import <stdio.h> @interface A: NSObject - (void)method1; - (void)method2; @end @implementation A - (void)method1 { printf("method1 of Class A\n"); } - (void)method2 { printf("method2 of Class A\n"); } @end @interface B: A - (void)method2; @end @implementation B - (void)method2 { printf("method2 of Class B\n"); printf("self --> "); [self method1]; printf("super--> "); [super method2]; } @end
214 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:48:40 ] @interface C: B - (void)method1; - (void)method2; @end @implementation C - (void)method1 { printf("method1 of Class C\n"); } - (void)method2 { printf("method2 of Class C\n"); printf("self --> "); [self method1]; printf("super--> "); [super method2]; } @end int main(void) { id x = [[B alloc] init]; id y = [[C alloc] init]; printf("--- instance of B ---\n"); [x method1]; [x method2]; printf("--- instance of C ---\n"); [y method1]; [y method2]; return 0; }
215 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:49:59 ] 結果 --- instance of B --- method1 of Class A method2 of Class B self --> method1 of Class A super--> method2 of Class A --- instance of C --- method1 of Class C method2 of Class C self --> method1 of Class C super--> method2 of Class B self --> method1 of Class C super--> method2 of Class A
216 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 17:01:01 ] あ、勘違いしていました。 CのsuperであるBのmethod2で更にsuperであるAを呼び出していました。 継承でoverrideを繰り返してもsuperで呼び出せるのはその一つ前でいいんですよね。