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
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で呼び出せるのはその一つ前でいいんですよね。
217 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 17:04:27 ] >>216 そうだよ。
218 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 00:30:27 ] >>213 本題と関係ないが、 #import <Foundation/NSObject.h> とわざわざ細かく指定するとかえってコンパイルが遅くなりかねないよ。 プリコンパイルドヘッダが使えなくなるので。 #import <Foundation/Foundation.h> にしておきましょう。 あと printf じゃなくて NSLog(@"hogehoge") をつかうのが一般的じゃないかな。
219 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 19:15:23 ] >>218 萩原Obj-C(1.0のやつ)をはじめたばかりで、本のサンプルみながらやっているもので。 NSLogは索引をみると後半で出てきますが、まだそこまで到達していないです。(今Ch04あたり) 本当は今ならObj-C 2.0をやるべきなのでしょうけれど、実行環境がまだTigerなので1.0でないとたぶん本のサンプルが動かないと思うので1.0の本を使っています。
220 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 01:05:12 ] >>219 なるほど。まあ日進月歩の世界で本はすぐに古くなるけど、がんばってね!
221 名前:sage [2009/08/16(日) 08:09:19 ] >>218 シンプルにコンソールに出力するならprintfでいいと思うけど。 GUIなアプリケーションの動作ログという意味なら、NSLogだが。
222 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 15:51:21 ] 正直どっちでもいいけど、 %@ を後々使うかも、と考えると 最初からNSLogにしておいた方がいいかなって思う。
223 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 15:58:09 ] 時間がコンソールに出力されるのが邪魔な時はprintfだけど、大体はNSLogかな
224 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 17:15:58 ] Obj-Cとは直接関係はないかもしれないけれど、 荻原本1.0で関数やメッセージ送信の実行速度を求めるサンプルプログラムで 出て来るターミナルのtimeコマンドの結果が違うので教えてください。 荻原本ではtimeコマンドを実行すると 0.990u 0.040s 0:01.04 99% 0+0k 0+1io 0pf+0w というふうにかえって来て、0.990uがCPUの時間らしいのですが、 実際にTiger(10.4.11)で実行すると real 0m0.055s user 0m0.028s sys 0m0.008s と、かえって来てしまい、どれがCPU時間か分かりません。
225 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 18:28:03 ] u=user s=sys
226 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 19:21:53 ] つまり見やすくなったんだね
227 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 20:30:49 ] >>225 thx これで実行時間の比較が出来ます。
228 名前:デフォルトの名無しさん [2009/08/27(木) 12:18:22 ] クラス変数のような振る舞い試してるのですが static NSString *value = [NSString stringWithString:@"hoge"]; @interface A2 : NSObject + (void) value: (NSString *) val; - (void) printMessage; @end valueの宣言のところで error: initializer element is not constant というエラーが出ます。 static NSString *value = @"hoge"; static int value = 1; この二つは期待通り動きました。 staicな変数の初期化って定数?じゃないとできないとかですか?全インスタンスに共通なオブジェクトを持たせるにはどうすればいいのでしょうか?
229 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 12:27:20 ] Cでは定数じゃないと初期化できないはず。 最初に使うときに初期化すりゃいいんじゃね?
230 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 12:32:14 ] クラス変数をその方法で持たせることは出来る。 このクラス変数はnullで初期化しておいて、 最初のインスタンス生成(init)のときにnullかどうかみて 初期化するのが普通かな。
231 名前:228 [2009/08/27(木) 12:37:36 ] いろいろいじってて違うのペーストしたみたいです。初期化のところは static NSString *value = [[NSString alloc] init]; でした。 すいません。お願いします
232 名前:228 [2009/08/27(木) 12:39:27 ] >>229 ,230 あ、そうか initilizeでしたっけ?あれで初期化すればいいんですね ありがとうございます
233 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 14:24:36 ] +initializeな。
234 名前:デフォルトの名無しさん [2009/09/02(水) 17:44:00 ] あるクラスのメッセージの中で(strはメンバ変数) - (void) doSomethig{ NSLog(@"count %d", [str retainCount]); [str release]; NSLog(@"count %d", [str retainCount] ); } 最初のログで2だと二番目で1になるのは問題ないのですが最初で1の時に2番目でもメッセージが送れて1が帰るのですがどうしてでしょうか?retainCountが1のオブジェクトにreleaseを送信後メッセージを送るとランタイムエラーになるんじゃなかったでしたっけ?
235 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 17:57:49 ] retainCount の値なんか気にしているやつはアホです
236 名前:234 [2009/09/02(水) 18:00:27 ] すいません、上と同じことだと思うのですが int main(){ NSObject *obj = [[NSMutableString alloc] init]; NSLog(@"count = %d", [obj retainCount]); [obj retain]; NSLog(@"count = %d", [obj retainCount]); [obj release]; NSLog(@"count = %d", [obj retainCount]); [obj release]; NSLog(@"count = %d", [obj retainCount]); return 0; } これも0にならないですね。NSObjectにすると0になって最後のログでエラーが出ます。これはどうしてでしょうか?お願いします。
237 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 18:36:47 ] プールはどこにある
238 名前:234 [2009/09/02(水) 19:04:07 ] >>237 ありがとうございます。 プール? retainCountはNSObjectのメンバ変数で allocでインスタンス作った時は関係ないんですよね? つまり自分自身にどれだけ参照されてるかの数を持っていて releaseが呼ばれて0になったときdeallocが呼ばれると。 プールが関係あるのはautoreleaseを自分でした時とそれを呼び出してるような コンストラクタを呼び出したときですよね? もしかしてなんか間違って勉強進めてます?
239 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 19:21:05 ] dealloc された object (のアドレス)に retainCount を送ったところで、 まともな結果が戻ってるわけがない。 > retainCountが1のオブジェクトにreleaseを送信後メッセージを送るとランタイムエラーになるんじゃなかったでしたっけ? そんな仕様はない。
240 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 20:41:49 ] >>236 最後のNSLogで存在しない(解放済み)オブジェクトにメッセージを送っているからエラーが出る。
241 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 20:44:55 ] retainCountなんてメンバ変数は存在しないし NSMutableStringはtoll free bridgeになってるから実体はCFMutableStringでしょ。
242 名前:234 [2009/09/02(水) 21:22:08 ] >>239 236をNSObjectでやると objc[2322]: FREED(id): message retainCount sent to freed object=0x103460 Illegal instruction というエラーがおきます。NSMutableStringでやるとobjectがないはずのところで1が返ります。これは特に決まった動き(NSMutableStringだからとか)ではなく何がおこるかわからないということなんでしょうか? >>240 質問がおかしかったですね。すいません。エラーが起きないのはなんででしょうか?と聞きたかったのです。 >>241 retainCountはメソッドでしたね。たしか_rcとかいうメンバだったような。 「NSMutableStringはtoll free bridgeになってるから実体はCFMutableString」というのはわかるのですが、ないはずのobjectにメッセージが送れてしまうのかとおもったのです。
243 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 22:29:30 ] MacsBugみたいなアセンブリレベルでできるデバッガってしらない? 実行中のコードをデバッグできるやつ。
244 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 22:32:41 ] TMON
245 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 22:59:37 ] TMONが見つからない。 どこにいけばある?
246 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 23:24:56 ] 遠い昔・・・
247 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 23:55:39 ] そんな 少年の日の心の中にいた青春の幻影 では困るのだけど。
248 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 10:07:49 ] >>243 マルチ乙
249 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 12:08:37 ] >>242 [[クラス alloc] init] の結果は retain count が 1 であるとは決まってません。 既に存在するオブジェクトが使い回されることもよくあります。 [NSNumber alloc] initWithInt:1] を何回も呼んで NSNumber をつくったとして、 毎回違うオブジェクトを作る必要は全くないでしょ? だから二回目以降は単にすでにある object をどっかからとってきて、 単に retain して返しているだけかもしれません。 NSString の場合は理由が違って、alloc] init] の段階では class cluster の中のどのクラスが実際に使われるかきまってないので、 NSPlaceholderString というのの唯一のインスタンスが使い回されてるんです。 とにかくそんなことを気にせずに、retain / release をきちんとしていたら 問題はないようになってます。
250 名前:242 mailto:sage [2009/09/05(土) 21:30:20 ] >>249 レスありがとうございます クラスクラスターまでまだ行ってないのですが、NSStringの説明でその言葉は見たことがあったので、なんかそれが関係してるのかな、と思ってました。 とりあえず、先へ進もうと思います。
251 名前:196 mailto:sage [2009/09/06(日) 22:10:26 ] Obj-Cって 継承階層増えるだけでどれくらい オーバーヘッドあるのですか?
252 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 23:16:09 ] 2cmくらい。
253 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 10:47:39 ] それはひょっとしてギャグで言ってるのか
254 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 13:05:58 ] >>251 ランタイムの実装次第じゃない?
255 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 23:50:03 ] >>251 計測してみたら?
256 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 17:48:11 ] >>242 >質問がおかしかったですね。すいません。エラーが起きないのはなんででしょうか?と聞きたかったのです。 とても基本的なことなので覚えておくべきなのですが、 C、 C++、 Objective-C などの言語では解放済みのメモリ領域や オブジェクトに対する操作の結果は決められていません。 そもそも「エラーが起きる」という決まりがないのです。 (処理系によってはデバッグ用のライブラリでは解放後のメモリを 変な数値で埋めるなどして、解放済みのオブジェクトへの操作で エラーが出やすいようにしてくれるような機能もあります)
257 名前:デフォルトの名無しさん [2009/09/10(木) 12:56:51 ] わけあってCとObjCの混在したプログラムを書いているのですが @interface CHoge : NSObject{ void (*_ptr)(); } // _ptrのアクセサを書きたい @end このインスタンス変数を読み書きするためのアクセサをどうやって書けばよいかわかりません。 わかる方教えていただけますでしょうか?
258 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 14:01:44 ] - (void)_ptr{ //関数取得 return (*_ptr)(); } - (void)set_ptr:(void)(*hoge)() //関数セット { void _ptr = hoge } じゃ駄目なの?
259 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 14:02:43 ] ごめん、最後のvoidいらないや。
260 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 17:50:31 ] >>257 @interface CHoge : NSObject{ void (*_ptr)(); } @property (nonatmic, assign) void (*ptr)(); @end と宣言しといて, @synthesize ptr=_ptr; で生成してもらうか、 - (void (*)())ptr { return _ptr; } - (void)setPtr:(void(*)())ptr { _ptr = ptr; } などと自前で書く。
261 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 19:31:49 ] 萩原1.0のコードを本見てコメントまで正確に打ち込んでいたら warning: multi-line comment に嵌った・・・ 能で改行するなよぅ。
262 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 23:27:19 ] 知らんがな
263 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 00:46:33 ] charからNSStringに簡単に変換する方法はないでしょうか?
264 名前:デフォルトの名無しさん [2009/09/12(土) 01:02:59 ] すみません。情報が少なすぎました。 char buf[1024]; で用意したバッファにreadで文字を読み込みます。 その後、NSStringのプロパティを持つやつに label.text = @"buf"; のように受け取った文字をNSStringに変換して代入したいと考えてます。 今のところ、 NSString *str = [[NSString alloc] initWithUTF8String:szStr]; label.text = str; [str release]; のようにやっているのですが、2回目以降はうまく代入できません。
265 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 01:21:14 ] 「うまく代入できません」 ↑ダメな質問の例
266 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 01:45:07 ] >>264 デバッガを使えるようになりましょう。
267 名前:264 mailto:sage [2009/09/12(土) 03:11:05 ] すみません、根本的に何かが違ったようです。 出直してきます。。。
268 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 11:11:44 ] デバッガの使い方ってアップルからドキュメント出てますか?
269 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 15:53:36 ] >>268 >デバッガの使い方ってアップルからドキュメント出てますか? Xcodexのドキュメントに乗ってないか? どこにでもあるようなデバッガ だから、マニュアルなしでも使えるぞ。
270 名前:デフォルトの名無しさん [2009/09/15(火) 01:26:27 ] >>264 label.text = str; のあとにstr releaseすると、label.textもreleaseされちゃわないか?
271 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 03:17:02 ] プロパティのsetter semanticsがassign(デフォルト)だとそうなんのかね?
272 名前:デフォルトの名無しさん mailto:Sage [2009/09/15(火) 13:27:10 ] NSString をプロパティにするときは copy にしなきゃダメだろ、常識的に考えて。
273 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 14:23:09 ] どういう常識?
274 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 14:53:09 ] NSMutableString が渡されたときに外部で書き換えられたらこまるから、GC使ってるときでもcopyにしておいたほうがいい、場合もあるかもしんない。
275 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 16:57:11 ] NSArrayだとどうするんだろう? 自力DeepCopy?
276 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 17:10:05 ] そこは状況に応じてだろJK 参照を保持させたいのか、それともインスタンスを複製して保持させたいのか、だろ?
277 名前:275 mailto:sage [2009/09/15(火) 18:31:34 ] >>272 これに対してだけど?
278 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 19:32:51 ] >>277 そこは状況に応じて、だろ。
279 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 20:42:03 ] >>264 get、setメソッドを使わないと、=だとオブジェクトの参照が 代入されるだけだからなぁ。 そりゃ、[str release];は実質、[label.text release];と同じになるだろうな
280 名前:デフォルトの名無しさん [2009/09/15(火) 20:53:02 ] Cocoaのautorelease poolの解放タイミングがいまいちわからない それとも、もうGC導入されて、あんま使ってない?
281 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 22:40:53 ] >>280 自分で明示的にpool作ってないんならイベントループ終了時にそのループ内でのプールが解放される
282 名前:デフォルトの名無しさん [2009/09/15(火) 22:49:35 ] >>281 そう!まさに、そのイベントループとやらがようわからんのです。。。
283 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 23:16:51 ] >>279 >get、setメソッドを使わないと、=だとオブジェクトの参照が >代入されるだけだからなぁ。 昔はそうだったっけ
284 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 23:22:29 ] >>283 えっ、いまはちがいまするか?
285 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 23:25:23 ] >>284 Objective-C 2.0 以降しか知らないけど、 obj.prop = hoge は [obj setProp:hoge] と同義。
286 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 23:48:58 ] >>285 へー、そうなんだ。 勉強になった。 ただ、知らないと、逆に参照渡ししたいときとかハマったりしそう。。 それとも、プロパティの時に限って、=がアクセッサメソッド呼び出し で実装してくれるのかな?
287 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 00:12:06 ] プロパティでドット構文使った時だけだよ てかなんでみんなCocoaスレでやらないのw
288 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 00:14:30 ] @selector(func_name)って、Cでいう関数ポインタと同じようなもん? (これもCocoaスレでやる話?w)
289 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 00:47:07 ] >>286 いやいやそうじゃなくて、そもそもクラスCにインスタンス変数x があったときに C* c=... c.x= は(xがプロパティでなければ)文法エラーだから。cはポインタだから、やるにしても c->x= でしょ。曖昧さはないです。
290 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 00:54:45 ] >>289 なるほど。 確かにObjective-Cのクラスのメンバにはc.xみたいにはアクセス できないよねprivateメンバじゃなくても c->xになる。 で、ごめん、質問なんだけど、プロパティって何だっけ?w
291 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 09:42:48 ] >>290 ttp://e-words.jp/w/E38397E383ADE38391E38386E382A3.html 質問の内容が低レベルすぎる
292 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 09:56:37 ] >>288 ttp://journal.mycom.co.jp/column/objc/018/index.html
293 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 14:53:14 ] >>288 C でいう関数ポインタは特定の関数の実装を直接指示するでそ(実体はアドレスだし)。 C++ のメンバ関数ポインタは、特定のクラス(とその派生クラス)のオブジェクトの仮想あるいは そうでない関数を間接的にあるいは直接に指示するでそ(実体はvtbl上のオフセットまたはアドレス)。 Objective-C のセレクタは、どのようなクラスあるいはインスタンスのメソッドでも名前で指示する ことができる(実体は文字列)。
294 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 20:03:40 ] >>291 ggrksって感じですまんかった。 んで、プロパティって、つまりはメンバ変数のことだとおもうけど、 そうするとc.xのようにドットで表すのは間違いじゃねって思ったんだけど それは間違い? >>289 が納得できない
295 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 20:18:25 ] まちがい。
296 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 20:26:24 ] >>294 Obj-CのプロパティはC++のメンバ変数じゃないから . で表しても全く問題ない。 最近の言語では当たり前の糖衣構文。C# も同様のシンタックスシュガーを持つ。 とはいえ、foo の bar プロパティが構造体だったとき、foo.bar.baz = 100 で foo.bar.baz が 100 にならないのはみっともないのは確か。
297 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 21:26:55 ] >>296 始めたばかりの頃コレでハマったのはいい思い出。
298 名前:デフォルトの名無しさん [2009/09/17(木) 02:58:22 ] 質問です。 NSDate *now = [NSDate date]; self.lbl.text = [now descriptionWithCalendarFormat:@"%H:%M:%S" timeZone:nil locale:nil]; で、時間を表示させているのですが、この2行目の部分で warning: 'NSDate' may not respond to '-descriptionWithCalendarFormat:timeZone:locale:' (Messages without a matching method signature will be assumed to return 'id' and accept '...' as arguments.) という警告が出るのですが、これはどういう事なのでしょうか?
299 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 04:05:43 ] iPhoneでは-descriptionWithCalendarFormat:timeZone:locale: は梨になった。 NSDateFormatterを使いましょう。Mac側でもやめる気満々なことが書いてあるので できれば移行していった方がよいようだ。
300 名前:デフォルトの名無しさん [2009/09/17(木) 10:57:56 ] >>299 そうでしたか。ありがとうございます! おかげさまで警告なしでビルドできるようになりました。
301 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 01:09:24 ] またもしかするとiPhoneでは無しになったものかもしれないのですが、 NSHost *host = [NSHost hostWithAddress:@"192.168.0.125"]; の部分で、+hostWithAddreassメソッドが見つからないという警告が出てしまいます。 Mac OSX Reference Libraryを参照しながら作ってるので、見つからないはずはないのですが、 iPhoneで実装するとしたら変わりに何を使えばいのでしょうか・・・。 というか、変わりとなるクラスやメソッドってどうやって調べればいいのでしょうか・・・
302 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 09:01:51 ] alloc] initWithAdress:
303 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 18:30:44 ] >>302 それもダメなようです・・・。
304 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 18:57:40 ] >>301 綴りミス? +hostWithAddre[a]ssメソッドが見つからないという警告が出てしまいます
305 名前:デフォルトの名無しさん [2009/09/18(金) 19:03:45 ] >>304 綴りミスです。ごめんなさい。 プログラムの方はちゃんと書いてあります。 警告あっても、正常に動作はするのですが、警告があるままやるのは気持ち悪いですね・・・