- 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
- 52 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 00:18:26 ]
- extern "C"
- 53 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 01:42:10 ]
- トン
- 54 名前:デフォルトの名無しさん [2009/05/29(金) 19:54:09 ]
- class Test
{ Test(){} virtual ~Test(){} }; これコンパイルすると、 error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test' ってエラー出ます 何が悪いんですか?
- 55 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 20:17:13 ]
- うちでは問題無かったよ。セミコロン付けろゴルァって事かな?
% cat foo.cpp class Test { Test(){} virtual ~Test(){} }; % g++ -c foo.cpp % ls foo.o foo.o
- 56 名前:デフォルトの名無しさん [2009/06/01(月) 15:46:54 ]
- >>55
いろいろ試しましたが、コンパイル通りません… 自分はiPhoneのOpenGL ESベースのアプリでやっているのですが、それがまずいんでしょうか プロジェクト作成して、Other SourcesフォルダにTest.hを作成して、>>54のコードを記述し、それをmain.mに#importしてるのですが、エラーになります .mmで定義するようにしないといけないのかなと思い、Test.mmを作成してコンストラクタ・デストラクタの定義をそちらに移してもだめでした できればコンパイルを通すまでどのような手順で行っているのか教えてください
- 57 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 16:13:50 ]
- before 'Test'
だから、クラス定義に問題があるんじゃなくて、 その前、恐らく includeファイル内などに問題がありそう。
- 58 名前:デフォルトの名無しさん [2009/06/01(月) 16:33:57 ]
- ヘッダーファイルの「情報を見る」とファイルタイプが.h,.cになっていたので、.h.cppに変えました。
が、それでもダメでした。これでいけると思ったんだけどなあ。 この問題ってXcodeスレで聞いた方がいいんですかね?
- 59 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 17:25:52 ]
- 呼び出し側のmain.mの「情報を見る」でファイルタイプを.c,.objcから.cpp,.objcppに変えたら動きました。
ここら辺説明してるサイトが全然見あたらなかったですよ… 2chのXcodeスレでかろうじて類似の質問があって助かった
- 60 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 21:05:51 ]
- System.Generic.List<T>に相当する
記述方式ってないのでしょうか 毎回毎回別々のオブジェクト書くの面倒です 助けてください
- 61 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:16:13 ]
- >>60
NSArray に突っ込んで、型は気にしないというのが Cocoa 流です。 もしくは Objective-C++ にしてSTL の list を使えばいいと思いますが その場合は retain/release に気をつけてください。 >>59 それはだって Obj-C の問題というよりは、C, C++ では 当然の話だから... いつもはどんな言語で開発してるんですか? C, C++, Obj-C の .h ファイルは、コンパイルの際に どの言語からインクルードされるかわからないので、 XCode 等 IDE で設定するにしても .h に言語を設定しても仕方が無いです。 .h に C++ のクラスがあるなら、 インクルードする側を (Obj-)C++ モードにしないと そりゃあコンパイルが詰まりますよ。
- 62 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:43:19 ]
- >>61
それなんてJavaですかw iPhoneでもObjective-C++できるのですか
- 63 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:44:52 ]
- C++のテンプレートはオブジェクト指向的じゃないとよく批判されるがな
- 64 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:46:14 ]
- >>62
iPhone でも Obj-C++ できますよ というか main.m を cpp モードにした時点で Obj-C++ になってます
- 65 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:52:52 ]
- >>59
まさかgccでコンパイルしてたとか? g++じゃなくて。
- 66 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 23:07:28 ]
- >>65
そういうことだったんじゃないの。XCode (Mac の IDE) からだと ファイルの言語設定でコンパイラが変わるので。 まあ確かにそのあたりはやっている人には当たり前すぎて、 解説書にもつい書き忘れてしまう... ということかも知れない
- 67 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 23:24:34 ]
- GUI以外の部分で
コールバックってどうやって実現すればいいですかね?
- 68 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 23:27:45 ]
- >>67
それだけで貴女以外のひとがなにが聞きたいかわかると本当におもってますか? 僕らはエスパーじゃないよ。
- 69 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 23:29:58 ]
- ネットワーク処理をコールバックで処理したいの
- 70 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 23:33:15 ]
- さっぱり見えてこないんだけど、Objective-Cは関係あるの?
- 71 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 23:39:50 ]
- >>70
C#とC++ならコールバックあるでしょ なんでObjective-Cには無いの? 元のソース移植できないじゃん
- 72 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 23:51:43 ]
- メソッドのポインタ取り出したいってこと?
- 73 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 00:03:39 ]
- >>71
何で無いと思うの? 無い訳無いじゃん。
- 74 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 00:09:42 ]
- じゃあこれと等価の記述を教えていただけないですか?
double g( double x, double (*f)(double) )
- 75 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 00:11:28 ]
- それでいいじゃんw
- 76 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 00:21:34 ]
- >>67
関数ポインタみたいなのが欲しいんでしょ。 developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/3objc_language_overview/chapter_7_section_6.html
- 77 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 00:27:49 ]
- 基本は>>76で、遅いと思ったらこっち。
journal.mycom.co.jp/column/objc/022/index.html でもネットワーク処理なら C で kqueue とか libevent とか使ったら良いのに。
- 78 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 00:32:51 ]
- - (double)g:(double)x callback:(double(*)(double))f;
こういう事かな?
- 79 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 01:01:43 ]
- >>71
いや、C++ のソースがあるなら Obj-C++ つかえば なにひとつ移植しなくて済むでしょ。何を考えているんだ?アホ?
- 80 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 21:16:49 ]
- >>74
それそのまんまで何が問題なんだ?w
- 81 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:54:09 ]
- わかりにくいね
- 82 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:58:03 ]
- typedefすればいいじゃん。
- 83 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:58:09 ]
- Obj-Cって型が解らなくなった場合に
チェックする方法ってありますか?
- 84 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 00:41:19 ]
- 正確には無いと思うよ。
- 85 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 01:24:04 ]
- >>83
[obj class] developer.apple.com/DOCUMENTATION/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/class wwwa.dcns.ne.jp/~nito/OSPT/ObjcOthers.html
- 86 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 01:43:55 ]
- >>83
その型ってのは、変数の型? それとも、オブジェクトのクラス? Objective-Cは変数に型がない(idでかまわない)言語なだけですよ(プリミティブ型は除きますが) 型キャストを許す言語であれば、(変数の)型が分からなくなる事はありえるのでは? 変数の型がどうであれ、オブジェクトが自分自身の型/クラス、もしくは受けられるメッセージを知ってれば問題ないって考え方です
- 87 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 01:51:14 ]
- オブジェクトの型が id なんじゃないの?
プリミティブがそれぞれの型を持っているのと同じで。
- 88 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 04:23:39 ]
- >>87
idは構造体のポインタのtypedefだからそうとも言えるけど、それは変数に型のあるCという言語での実装の話しで...なんというか微妙な感じもする。 idには特別意味もないし、JavaとかC++の縛りのきつい「型/クラス」と、idは別の概念、別のくくりにした方がいいんではないかと。
- 89 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 22:58:35 ]
- 何なのこの投げっぱなし質問
- 90 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 00:15:09 ]
- interface作ったときにメモリ開放メソッドは
どのように記述するのが一般的なのでしょうか
- 91 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 02:39:56 ]
- @interface ... @end内にデストラクタをどう宣言するかという話かな?
普通はNSObjectで宣言されているdeallocメソッドをオーバーライドします。 (だから@interfaceにはとくに何も書きません。) メモリ管理については developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html をどうぞ。
- 92 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 20:48:46 ]
- 独自にObjを定義したとして
[[Obj alloc] initHoge : arg]; allocと組み合わせて利用するinitHogeを定義するとき 定義は以下が一般的なのでしょうか? - (id) initHoge : (NSString *) val;
- 93 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 22:03:25 ]
- XmlTextWriterみたいなクラスってないですか?
- 94 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 00:24:29 ]
- >>93
Obj-C スレにきて、返事をする人が .NET を知っていると仮定するとはいい度胸をしている。読み手のことを考えて、 「.NET ならこれこれができるこれこれというクラスが あるんですけど、(ドキュメントは http:// ... に ...)」とか 質問の際に書けんものかね? とりあえず NSXMLDocument をつかえば規格に準拠した XML データは つくれますよ。かなりメソッド名が冗長だけど。 手で文字列をつなぎ合わせて XML にするよりは断然いいです。 あと、これ以上は Mac 板の iPhone プログラミングスレか Cocoa スレに行ったほうがいいとおもいます。ここは一応 Obj-C 言語に特化した 過疎スレなので。
- 95 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 01:58:33 ]
- >>93みたいな手合いは相手する必要ないよ。
- 96 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:23:27 ]
- NSMutableDictionaryにオブジェクトをつっこむときに
NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; Hoge *hoge = [[Hoge alloc] init]; [dic setObject:hoge forKey:@"hoge"]; とやるのと [dic setObject:[[Hoge alloc] init] forKey:@"hoge"]; とでは、後者はメモリリークするのでしょうか?
- 97 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:19:50 ]
- 何処が違うのかさっぱりわからん
- 98 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:47:19 ]
- >[dic setObject:[[Hoge alloc] init] forKey:@"hoge"];
て書いたら、 setObject:に渡したHogeインスタンスを後でreleaseする手段が無くなるのでは 上の書き方なら [hoge release]て書けるけど。
- 99 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 02:47:32 ]
- >>98
なあにobjectForKey:@"hoge"で取り出してreleaseすればいいさ
- 100 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 07:22:05 ]
- [dic setObject:[[[Hoge alloc] init] autorelease] forKey:@"hoge"];
じゃないとだめ
- 101 名前:デフォルトの名無しさん [2009/06/10(水) 16:29:35 ]
- 改行したいときって何を書けばいいんでしょうか?
\nでも\rでもダメだったんですが。
- 102 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 17:05:39 ]
- (option + ¥) n
- 103 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 18:15:29 ]
- >>102
ありがとうございます
- 104 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:35:38 ]
- >>99
それ今の仕様だとメモリリークするけど?
- 105 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:01:56 ]
- >>104
今の仕様って何? GCのこと?だとしたらGCは仕様じゃなくてオプションだと思うんだが
- 106 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:07:37 ]
- >>105
どっちにしてもコレクションに入れたものを objectForkeyで取り出して開放してもリークするだろ
- 107 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:10:47 ]
- >>106
意味が分からん、説明して #import "Hoge.h" @implementation Hoge - (void) dealloc { NSLog(@"hoge dealloc"); [super dealloc]; } @end #import "AppController.h" #import "Hoge.h" @implementation AppController - (void)awakeFromNib { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setObject:[[Hoge alloc] init] forKey:@"hoge"]; Hoge *hoge = [dict objectForKey:@"hoge"]; [hoge release]; NSLog(@"%d", [hoge retainCount]); // [dict removeObjectForKey:@"hoge"]; [dict release]; } @end これでログ出した時点でhogeのretainCountは1でMutableDictionaryに保持されてるだけの状態。 辞書から取り除くか辞書を解放すればHogeはちゃんとdeallocされるんだけど、どこが違うんだ?
- 108 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:12:36 ]
- なんならHoge取り出さずに
- (void)awakeFromNib { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setObject:[[Hoge alloc] init] forKey:@"hoge"]; [[dict objectForKey:@"hoge"] release]; NSLog(@"%d", [[dict objectForKey:@"hoge"] retainCount]); [dict release]; } これでもちゃんとdeallocされるけど?
- 109 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:14:31 ]
- ふーん
- 110 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:20:05 ]
- >>109
ふーん、じゃなくてさ
- 111 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:25:41 ]
- あーそうかい俺が悪かったよ
謝ればいいんだろゴラぁ
- 112 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:39:43 ]
- 謝ってないんだけど
- 113 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:43:33 ]
- Cocoaが分からないけど興味があるだけの俺みたいなのもいる訳だが、
結局のところ>>107,108が仕様として正しいということでFAですか?
- 114 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 00:02:52 ]
- それ以前に作法として完全に間違っているので気にする必要はありません。
>>99はネタ。
- 115 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 00:04:42 ]
- そもそもNSMutableDictionaryって非推奨のAPIだろ
NSMutableDictionaryに入れるとメモリリークするし
- 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] の形で覚えておけば問題ない所だと 思うのですが。
|

|