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
573 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 10:54:21 ] そこまで来てればあとはコンドーム一枚だぞ
574 名前:572 [2009/11/27(金) 11:05:28 ] >>573 あれ?もしかして id obj = [[cls alloc] init]; でいいんですか? NSLogでのぞくと出来てるっぽいです。 class_createInstanceというのも見つけたけど上ので良いのかな。
575 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 13:05:20 ] いいんです。
576 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 13:57:42 ] こんなのも Class class = NSClassFromString(@"AnClass"); SEL sel = NSSelectorFromString(@"aSelector"); id obj = [[[class alloc] init] autorelease]; [obj performSelector:sel]; プラグイン書くときはNSClassFromStringは便利だよね。 わざわざバンドルローダー指定する必要ないし。 NSSelectorFromStringの方はごくまれにしか使わないね。 AppleEventDispatchの実装部では使いまくってそうだけど。
577 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 16:21:30 ] newとallocの違いが今イチ分からん。
578 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 17:30:29 ] >>577 俺も俺も てか乳って使ったことない。
579 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 00:03:58 ] +newは+alloc -initと同義
580 名前:デフォルトの名無しさん [2009/12/01(火) 18:38:18 ] typedef enum {a,b} defA; といった宣言をヘッダに記述し、これを他のクラスからimportして defA a; のように利用しようとすると、 "expected specifier-qualifier-list before 'c'"とエラーが 起きてしまいます。 どのように定義すれば良いのでしょうか。
581 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 18:43:26 ] enum { a, b, }; typedef NSInteger defA;
582 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 19:24:09 ] >>580 ソース
583 名前:580 mailto:sage [2009/12/01(火) 20:55:30 ] すいませんちょう単純な勘違いしてました。 他のヘッダが邪魔をしていて、importの前に書いたらうごきました。。
584 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 23:11:37 ] Objective-Cって、メソッド名ひとつ考えるのにも英語力を要求してくるな。 こりゃ、そんじょそこらのなんちゃってプログラマに扱えるしろものじゃねーな。
585 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 00:29:56 ] なんちゃってプログラマでも簡単に使えるよ。英語さえわかれば。
586 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 00:50:29 ] >>584 別に日本語ローマ字書きでもいいじゃん
587 名前:デフォルトの名無しさん [2009/12/02(水) 04:06:03 ] 辞書が存在していない時代だったらそう言えるかもしれないね。
588 名前:デフォルトの名無しさん [2009/12/02(水) 05:26:27 ] 辞書の歴史は紙の歴史より古いからなあ。
589 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 19:58:30 ] DataWoTuika:id KonoIchini:idx omake:option
590 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 20:46:14 ] 引数がkonochincoとomekoに見える
591 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 21:10:19 ] けしからん奴じゃ
592 名前:デフォルトの名無しさん [2009/12/03(木) 19:40:15 ] NSStringにHTMLのソースが入ってるんですけど、 そこから<li>〜</li>の部分だけ抜き出したいと考えています。 ただ、それをどうやって実装すればいいのかが良く分からないです・・・。 今頭の中にある感じだと、<li>とマッチする最初の場所と </li>とマッチする最後の場所を探して、その部分を抜き出すという方法なんですけど、 もっと簡単に正規表現みたいな感じでピュッと抜き出したりできないでしょうか?
593 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 20:19:18 ] Google Toolbox for Mac の GTMRegex でも使え。
594 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 21:59:37 ] まさかiPhone初心者スレで聞いてたやつじゃねーだろうな
595 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 22:07:13 ] >>592 とりあえず簡単にやるならスキャナ使えば? NSString *hoge = "hoge <ol><li>foo</li><li>bar</li></ol>"; NSScaner *scanner = [NSScanner scannerWithString:hoge]; while (YES) { NSString* itemString; if (![scanner scanUpToString:@"<li>" intoString:NULL]) break; if (![scanner scanUpToString:@"</li>" intoString:&itemString]) break; NSLog(@"item = %@",itemString); }
596 名前:デフォルトの名無しさん [2009/12/04(金) 00:52:37 ] >>592 NSXML 使って XPath でピョッと
597 名前:デフォルトの名無しさん [2009/12/05(土) 22:45:14 ] なんか、releaseしなきゃならん場合としないでいい場合の違いが良くわからんわ。 本のサンプルとかみても、retainしてるのに、どこにもreleaseがなかったり、allocして autoreleaseも呼んでるのに、deallocでreleaseもしてたりとか、もうわけわかめ。 なんじゃこりゃ、そんなに神経質にならなくてもいいのか?
598 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 23:07:44 ] カウンタ使ってメモリ管理するなら当然覚えないと、意味不明なバグに遭遇することしきり。 自分は Instruments の Leaks 使って、可視化されたメモリリークを見ながら試行錯誤して覚えたけど。
599 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 23:09:06 ] あと初心者は Build & 解析はかなり役に立つんじゃ。
600 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 03:36:39 ] まずは developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/4objc_runtime_overview/chapter_8_section_2.html を読まんといかんよ。 iPhone じゃなくて Mac のプログラムならガーベジコレクション ON にして retain/release 忘れるという方法もあります。 ただ、 >サンプルとかみても、retainしてるのに、どこにもreleaseがなかったり、allocして >autoreleaseも呼んでるのに、deallocでreleaseもしてたりとか、もうわけわかめ。 これは本が間違ってるんじゃないの?何の本かわからんから何とも言えんが。
601 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 06:55:11 ] >>597 そんな本あるなら晒してみろよ
602 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 13:36:42 ] 初期化するインスタンスメソッドの他に、勝手にAutoreleaseするクラスメソッドも あったりするからちょっとややこしい。
603 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 13:45:34 ] (あるクラスの init メソッド内で、インスタンス変数に代入するオブジェクトを)retainしてるのに、 (init 内の)どこにもreleaseがなかったり、 (そのクラスを)allocして autoreleaseも呼んでるのに、 (そのクラスの)deallocで(インスタンス変数を)releaseもしてたり と解釈するとしたら、まったく正しいコードけど
604 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 13:53:05 ] >>601 サンプルはあくまでサンプル。アプリまるごと完全詳解みたいのならともかく。 Obj-Cに限らず、その他言語のO'Reilly本やMSDNでも、 サンプルソースと現実的に推奨されるソースは異なる場合は多い。 参照カウンタの説明でretainしたものをreleaseしてないなら問題だと思うけど、 多分、別の説明で使用されているサンプルがそうなってるんでしょ。 >>602 >勝手にAutoreleaseするクラスメソッド コンビニエンスコンストラクタのこと?
605 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 14:10:04 ] >>604 あぁ多分それ 俺もこの辺、よく迷うわ。propertyの宣下にもretainやassignの指定があるから、 宣言をよく確かめて使わないとかいけないとか気を使うのがちょっと大変。 便乗質問なんだけど、あるクラス(A)で動的にView(B)を作って(alloc & init)、 別のView(C)にaddSubView した場合って、Aで明示的にBをreleaseする必要 があるんだっけ? それとも、Cの解放時にBも勝手にreleaseしてくれる?
606 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 15:11:08 ] 当然あるよ。
607 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 15:34:14 ] >>606 何が当然あるか? Aで明示的にBをreleaseする必要があるという意味あるか?
608 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 15:47:51 ] ないあるよ
609 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 16:09:08 ] hoge = [[Hoge alloc] init]; // 1 [foo addHoge : hoge]; // 2 … [foo release]; // 1 よってメモリリークになる。 だから、autorelease か add 後に [hoge release]; の必要がある、筈。
610 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 16:37:49 ] わかったある。謝謝
611 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 21:00:38 ] >>609 エ?こうしとけばリークにならねえだろ? -(void)dealloc { ... [mHoge release]; // 0 mHoge = nil; ... [super dealloc]; }
612 名前:デフォルトの名無しさん [2009/12/06(日) 21:02:19 ] そうか?
613 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 21:17:35 ] そのdeallocは何をトリガーにして呼ばれるんだっちゅう
614 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 22:15:11 ] >>611 だから、>>609 はそうしろって書いてるじゃん
615 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 22:25:14 ] 自分が 609 だけど、foo が dealloc 時に hoge をリリースするのは、 addHoge: (addSubView:)には retain されてるから当然。 でもそれだと±1で、Hoge alloc init 時のカウント1をリリースされてないから、リークになる。
616 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 22:44:59 ] まぁ、init時にautoreleaseつけとくのが無難かな
617 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 00:14:08 ] 無難とかそういう問題ではなかろう。
618 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 00:45:02 ] >602 >605 initほげほげ、copyほげほげ は retain されて、 それ以外のメソッドは autorelease されたのが返ってくる。 [obj method:a] としたばあいに、obj が a がずっと必要なら method 内部で retain するし、 いらなかったらそんなことはしない だから、自分があるオブジェクト a を release すべきかどうかは、 自分が呼んだメソッド内でどうなっているかとかは気にしなくてよくて、 単に自分がいらなくなった時点で release すればよい。 まあリリース足りなければメモリ食うだけだけど、 リリースしすぎは一瞬でクラッシュするので、 きちんと理解して書くか、NSZombie でチェックするか、 release しすぎないようにしてください。
619 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 01:19:21 ] ウィーッス
620 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 13:31:55 ] >>618 newほげほげも忘れないであげてください
621 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 17:53:50 ] 雑談はスレチだよね。チラ裏すまん。 Objective-Cのオブジェクトの所有権ポリシーって、 (C++におけるメモリ管理と)やることは本質的に同じでありつつ 保守効率が格段に上がる優れた機構ではあるとは思うけど、 Objective-Cってどんなもんだろってちょっとイジってオナりたいとき、 一通り理解するまでとっかかりで苦労するねぇ。 C++慣れしてると、余計なお世話に感じてしまうっていうか。 なんだか好きになれない。
622 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 17:59:43 ] まあ、今はGCがあるし
623 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 20:34:51 ] iPhoneではGCが使えないらしい...ゾ
624 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:15:56 ] Objective-Cのメモリ管理3原則 1. alloc,copy,retain,newしたインスタンスはreleaseする必要あり 2. 1した覚えの無いインスタンスは勝手にrelesaeしてはいけない 3. 1してないインスタンスはどこかでreleaseされるので、保持したい場合はretainかcopy
625 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:28:22 ] add したら直ぐ release して良いのかと思ってたら、そうじゃないんだね
626 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 00:43:52 ] >>621 オブジェクトプール+手動の参照カウントってのは、大昔の手法だよ。 人頼みだとバグが多くなるし、保守効率も下がる。だからメモリ管理コードを 一々書かなくて済むGCやスマートポインタが主流になってる。 模したSmalltalkみたいに最初からGC付きなら無かった機構だから>>622 が正解
627 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 09:22:55 ] でも、iPhoneがGCは無効なんでしょう? ここにいる皆さんは、GC派とリファレンスカウンタ派、どちらが多いのでしょうか?
628 名前:621 mailto:sage [2009/12/08(火) 11:17:45 ] あ、すみません、iPhoneアプリ開発でObjective-C処女喪失したもので。 iPhoneはGC無いです。 (ただ、あったとしてもiPhoneはメモリ極小なので、autoreleaseさえ極力避けるべきと公式で指摘されています。) >>624 の規則だけですが、解れば便利な@propertyと@synthesizeも、 とりあえずちょっとイジってみようレベルの初見だと、 iPhone画面にHelloWorld表示するだけのソースすら、 「@property(nonatomic,retain)何この呪文、この入門書じゃソース解説にも記述無いし、 とりあえず詳細確認は後だな...あれ??実装でretainなんてしてなくね??なんで?? (ポチッ)ちょww動いたwwwけどHelloWorldのソースすらイミフwwww」 みたいな。 結局、入門書はHelloWorldで挫折、とりあえずちょっとイジるだけのつもりが、 公式ドキュメントを片っ端から読み漁って十分理解してから、 入門書のHelloWorldのソースを見直したのはいい思い出。。。 チラ裏に長文、本当にスマンかった。 最後に、InterfaceBuilderについて。 見た目だけでVB.NETくらい優しいお母さん的IDEだろうと思って触ると、火傷するね。
629 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 12:10:55 ] iPhone だと Hello World 如きに property つかわにゃならん訳?
630 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 13:16:01 ] >>628 なんの入門書を読んだか知らんが、それはその入門書があきらかに悪いな iPhone でプログラムやるには、 (古めかしいとか批判はいろいろあるかもしれないが、実際問題として) retain/release ができなきゃ話にならない。 わかったつもりで通過すると絶対に意味不明なクラッシュをはじめて あとで泣く羽目になるのに、説明しないなんてありえない。 とにかく変な入門書を掴んで失敗でしたね。 あなたが公式ドキュメント読める人で良かったですが。 あと、Interface Builder はふつうの(?)と違って、 コントロールダブルクリックしてもメソッド追加できないので、 その辺戸惑うかも知れませんが、ビューとコントローラの独立性が 自然に高まるようになってるのはいいところだと思います。 .Net やさんで iPhone プログラムはじめたひとはみんな そう感じるみたいね。 dotnetaddict.dotnetdevelopersjournal.com/dcacs.htm とか。
631 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 18:47:31 ] 今更だけど、 > オープンソースの現状について、おそらくは予想外の知られざる事実を明らかにした。 > 『Smalltalk』対『Objective-C』では? Smalltalk がほぼ3倍のコード量で勝利している。 japan.internet.com/webtech/20090724/12.html オープンソースの括りだから負けただけだよな?
632 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:41:07 ] >>629 いらないよ。コードなんて1行も書かなくてもHello Worldって表示するぐらいはできる。 完全に入門書が悪いわ。アップルの配布してるPDFのほうが数倍マシ。
633 名前:デフォルトの名無しさん [2009/12/09(水) 22:34:49 ] NSURLでwww.xxx.com/foo/boo/index.html のようなURLから index.htmlを抜き取るようなメソッドってないですかね? スキームやホスト、アンカーなどを返すメソッドは見つかったのですが、 ファイル名を返すのが見つからないです・・・
634 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 23:02:12 ] NSString (NSStringPathExtensions) の - (NSString *)lastPathComponent; でも使え。NSPathUtilities.h に定義されてる。
635 名前:デフォルトの名無しさん [2009/12/09(水) 23:13:06 ] >>634 ありがとうございます。 こんな便利なのがあったんですね。 というか、NSURLにもこのメソッドつけてほしいですねw
636 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 23:14:08 ] 10.6にはついてるみたいよ。
637 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 23:25:55 ] ほんとだ。 - (NSString *)lastPathComponent AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER;
638 名前:デフォルトの名無しさん [2009/12/14(月) 01:49:22 ] NSStringをURLエンコーディングしたいと考えています。 例えば てすと → %A4%C6%A4%B9%A4%C8 のようにしたいのですが NSString *test = @"てすと"; [test stringByAddingPercentEscapesUsingEncoding:NSShiftJISStringEncoding]; NSLog(test); のようにしても、 8C48B78C6 のように表示されてしまいます。これを%A4%C6%A4%B9%A4%C8のように表示するにはどうすればいいのでしょうか?
639 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:58:22 ] NSLogが%をフォーマット文字と解釈して表示しちゃうせいだから気にしない
640 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 02:00:28 ] 1. ソースコード内に日本語文字列 @"にほんご" を書かない。 それによって出来た文字列がどうなるかの動作は未定義です! (うまくうごくときもあるかもしれませんが、コンパイラのデフォルト設定が 次のバージョンでかわると一瞬でおかしくなる可能性があります。) 必ず Localizable.strings を使うようにしてください。 2. NSLog(test) というふうに書かない!NSLog の第一引数は フォーマット文字列です。% があるとフォーマット指示だと解釈されます。 NSString* test = @"%@"; NSLog(test); とすると、NSLog は %@ をフォーマットと解釈するために スタック上に偶然あるポインタの先のオブジェクトっぽいものにアクセスして 異常終了しますよ! 必ず NSLog(@"%@", test) としてください。
641 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 02:02:39 ] NSString *test = @"てすと"; NSLog(@"%@", [test stringByAddingPercentEscapesUsingEncoding:NSShiftJISStringEncoding]); 2009-12-14 02:01:53.361 test[1467:a0f] %82%C4%82%B7%82%C6
642 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 02:03:33 ] なるほどなるほど、勉強になります。 ちゃんと表記したらちゃんと表示されました。 今まで面倒くさがってNSLog(NSString変数)みたいに書いてましたが 今度からちゃんと書こうと思います。ありがとうございました。
643 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 02:09:44 ] >>640 いつもの人乙
644 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 02:20:58 ] >>640 1. だけど、 developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocLanguageSummary.html によると、10.5 からは UTF-16 の文字列も大丈夫って書いてあるよ。 ただ、C のソースコードを何のエンコーディングで保存しているかと、 gcc の -fexec-charset, -finput-charset の設定によるので、 developer.apple.com/mac/library/documentation/DeveloperTools/gcc-4.2.1/gcc/Preprocessor-Options.html 僕は @"にほんご"は怖くて使う気になりませんが。
645 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 02:24:31 ] >>638 というか URL のエンコーディングって ShiftJIS でいいんだっけ? 最近って真っ当なサイトなら UTF-8 じゃない? Wikipedia とか。
646 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 02:26:25 ] RFCではUTF-8である"べき"とされているな
647 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 10:11:57 ] 10.5と10.6は、@"にほんご"は普通に使えてるなぁ。 ソースコードはデフォルトのままUTF-8。
648 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 01:41:01 ] KVC で質問があります。class_addMethod で追加したセッタ、ゲッタが valueForKey: から呼ばれないんですが、なぜでしょう?そういうもの? サンプルコードは以下のとおりです (Obj-C 2 です) #import <Foundation/Foundation.h> #import <objc/runtime.h> @interface Aho:NSObject { } @property(retain) NSString*foo; @end @implementation Aho -(id)getter { NSLog(@"getter:%@",NSStringFromSelector(_cmd)); } -(void)setter:(id)obj { NSLog(@"setter:%@,%@",NSStringFromSelector(_cmd),obj); }
649 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 01:41:49 ] +(void)synthesizeSetterGetter:(NSString*)getterName { NSString*setterName=[NSString stringWithFormat:@"set%@%@:",[[getterName substringToIndex:1] uppercaseString],[getterName substringFromIndex:1]]; IMP getter=class_getMethodImplementation(self, @selector(getter)); class_addMethod(self, NSSelectorFromString(getterName), getter, "@:"); IMP setter=class_getMethodImplementation(self, @selector(setter:)); class_addMethod(self, NSSelectorFromString(setterName), setter, "@:@"); } +(void)load { [self synthesizeSetterGetter:@"foo"]; } @dynamic foo; @end int main(){ NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init]; Aho*aho=[[Aho alloc] init]; [aho foo]; [aho setFoo:@"bar"]; [aho valueForKey:@"foo"]; // ここで例外がでる [aho setValue:@"bar" forKey:@"foo"]; return 0; }
650 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 02:51:37 ] valueForKey: はまずアクセサを探すはずなのにおかしいね。 @synthesize foo; やって、 method_exchangeImplementations(class_getInstanceMethod(self, @selector(foo)), class_getInstanceMethod(self, @selector(getter))); method_exchangeImplementations(class_getInstanceMethod(self, @selector(setFoo:)), class_getInstanceMethod(self, @selector(setter:))); とかやるとちゃんと機能したけど、それは君の望むことじゃないか。
651 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 10:25:12 ] class_addMethod(cls, sel, imp, types) の中の、types が間違ってるから。 typese は(リファレンスで確認してね)、"返り値", "self", "_cmd", "引数..." なので、 class_addMethod(self, NSSelectorFromString(getterName), getter, "@@:"); // ×"@:" class_addMethod(self, NSSelectorFromString(setterName), setter, "v@:@"); // ×"@:@" とやると動く。
652 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 10:38:59 ] ついでに。+load で +synthesizeSetterGetter: を呼ぶとNSAutoreleasePoolがまだ できてないタイミングなので、コンビニエンスコンストラクタを使うとリークする。 setterName = [NSString stringWithFormat:..]; の所。alloc + init + release を 使おう。それか、+load でやる代わりに +initialize で呼ぶとpoolが出来た後なので コンビニエンスコンストラクタが使える。(分かった上でのサンプルならごめんよ)
653 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 11:41:32 ] みなさんありがとうございます、 おかげでうまく行きました。 型のエンコーディングをわかってませんでした。 Pool の件もどうもです。まあ数個ぐらい リークしてもよかんべ という気持ちでしたが、いけませんね。 type encoding は method_getTypeEncoding をつかった方がいいとも 職場で教えてもらいました... マルチポストみたいになってすみません。
654 名前:572 [2009/12/19(土) 15:58:57 ] 質問させてください 中にNSMutableDictionaryのインスタンスを持っている独自クラスがあって その中にどんなキーがあるかは不定です。 でそのインスタンスに対して hoge.foo のようにドットでプロパティを呼び出してNSMutableDictionaryのobjectForKeyにアクセスするようなことって出来ますか? 不定じゃなければそういうプロパティを作ってアクセッサを定義してやればイケそうな気もするけど・・ プロパティはコンパイル時の型チェックがあるのでダメそうな気がするんですが、見逃してることがあったら教えてください。
655 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:53:38 ] できます。コンパイル時にウォーニングはどうしてもでるとおもいますが。 a.foo=b は[a setFoo:b] と、 b=a.foo はb=[a foo] と等価なので、 [a foo] をダイナミックに [a objectForKey:@"foo"] にかえてやればいいですが、 それには forwardInvocation: を使えばいいです。 www.mikeash.com/?page=pyblog/friday-qa-2009-03-27-objective-c-message-forwarding.html とか参照。
656 名前:デフォルトの名無しさん [2009/12/20(日) 01:04:58 ] NSStringの中にxxx:yyyみたいな文字列が入ってます。 これからxxx、またはyyyを返すようなメソッドってないでしょうか? xxxの中には:は含まれず、yyyの中には:が含まれている可能性があります。 要するの最初のコロンと、それ以降に文字を分けたいのです。
657 名前:デフォルトの名無しさん [2009/12/20(日) 01:18:01 ] rangeOfRegexとsubstringWithRangeでどうにかしました・・・
658 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:19:11 ] NSScanner でググると良い
659 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 06:50:02 ] >>658 で?
660 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 07:18:18 ] >656-657と>659って同一人物なのか? 俺も普通にNSScannerでがりがりマッチング取ればいいだけ だと思うんだが。
661 名前:デフォルトの名無しさん [2009/12/20(日) 11:48:34 ] >>660 いえ、同一人物じゃないですw 回答くれた人にそんな失礼な返事しないですよw NSScanner使ったことないので、調べてきます。 Objective-Cというかオブジェクティブ志向のプログラミングは初めて間もないんですが、 結構クラス調べるのは楽しいですね。もっといっぱい知りたい・・・
662 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:01:08 ] いいのかい? 俺はノンケでも構わず食っちまう男なんだぜ
663 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:17:39 ] いいよ
664 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:13:00 ] >>661 NSScanner でももちろん出来るけど、その目的ならNSString の -(NSArray*)componentsSeparatedByString:(NSString*)separator でやる方が楽かと。後ろは、NSArray の -(NSArray*)subArrayWithRange:(NSRange)range で取り出して、 -(NSString*)componentsJoinedByString:(NSString*)separator で戻してやればいい。
665 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 22:04:58 ] >>655 メッセージ式で呼び出すときはウォーニングだけで済むと思うけど、プロパティ構文は静的に解決できないとエラーになると思う。だから、プロパティでやるのは無理なんじゃないかな。メッセージ式で書けばいい話だが。
666 名前:654 [2009/12/20(日) 22:36:59 ] >>655 ありがとうございます 遅レスすいません 別のところ(C言語で文字列の置換)でつまっていて、詳しくテストしてない状況です。ウォーニングはでるけどできるってことですね。試してみます。 リンク先も見てみます。ありがとうございます
667 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 22:46:44 ] キー値コーディングってどんなケースで使うんですかねぇ。 なんか普通のアプリで積極的に使う場面って想像つかないんですけど。 フレームワークの開発とかで使うのかな。
668 名前:デフォルトの名無しさん [2009/12/21(月) 23:13:04 ] 次の人が答えます
669 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 23:14:48 ] KVC はそれほど自分で直接呼ぶもんじゃないと思いますが、 Cocoa のいろんな部分 (KVO,バインディング) でランタイムが統一的に オブジェクトを弄れるための下支えになってます 例えば、ソースコードで -foo と -setFoo: を定義しておくと nib ファイルの中からビューをコントローラのキー foo に バインドできますが、その間の通信は KVC でやってるわけです。
670 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 23:24:18 ] >>667 値が変更された通知が欲しいときに色々と使えるだろ。 たとえば、テキストフィールドが編集されたときに何かをしてみたり。 それから、特定のスクリプトを処理するときに、コードがかなり短くなる。 たとえば、自力でXMLをパースする、みたいなときは、大幅にソースが簡単になる。 まぁ、まずは日本語ドキュメントでも読め。 developer.apple.com/jp/documentation/Cocoa/Conceptual/KeyValueCoding/
671 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 23:31:30 ] 結構奥が深そうですね...ちょっとずづでも探ってみまする。
672 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 23:32:42 ] >>667 一々 IBOutlet と Action をおいてセッターとゲッターを作るより、Interface Builder でどうこう出来る分生産性が上がる。
673 名前:デフォルトの名無しさん [2009/12/22(火) 22:36:38 ] すみませんが、質問になります。 Objective-CからCのqsortを呼ぶ事ってできるのでしょうか? 第4引数をどうすればよいのか、途方にくれてます。 よろしくお願いします。