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
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で呼び出せるのはその一つ前でいいんですよね。
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くらい。