Objective-C [ObjC pa ..
[2ch|▼Menu]
116:デフォルトの名無しさん
09/06/12 01:00:46
>>115
んなわけねーだろ。retain count を勉強し直してこい。

2chで調べ物をしたい時は「教えてください」って書いても
なかなか教えてもらえない。

そういう時は、知ったかぶり風に間違ったことを自信満々に書く。
そうすると、ものすごい勢いでツッコミを入れてもらえる。


コピペ新聞 - 調べ物のコツ
URLリンク(copipe.info)

ということですか。

117:デフォルトの名無しさん
09/06/12 01:56:44
>>116
そのメソッド頂いたっ!

118:デフォルトの名無しさん
09/06/12 02:29:23
>>114
いやネタっつうか、できるできないで言うならできるという意味で書いた
そりゃ普通こんな書き方はしないけど

119:デフォルトの名無しさん
09/06/12 05:54:02
retain/releaseはObjective-Cと関係ないけどなんでここでやってんの?
Cocoaスレでやれば良いのに。

120:デフォルトの名無しさん
09/06/12 07:04:39
OpenStepで規定されてるしここでいいんでねいの。

121:デフォルトの名無しさん
09/06/12 07:34:48
正しい書き方は一体どれなの?


122:デフォルトの名無しさん
09/06/12 07:56:37
そういう大事なことはこんなところで断片的な情報をかき集めるより書籍かなにかで
体系だった解説をきちんと読むべきだと思う。
Cocoa周りはアップルが出しているリファレンスがしっかりしてるから>>91
リンク先でも読むといいよ。

123:デフォルトの名無しさん
09/06/12 08:42:14
ぶっちゃけOpenStep系以外のObjCフレームワークだってほとんどretain/release採用してるでしょ

124:デフォルトの名無しさん
09/06/12 10:23:46
ここで出てるような単純なサンプルならいいけど、
一般にはオブジェクトを入れてから取り出すまでに、別スレッドからdictionaryをいじられて、別のオブジェクトをreleaseしてしまう可能性がある。
まあ作法として避けておくのが無難。

125:デフォルトの名無しさん
09/06/12 12:34:39
あんなコード書いてたらどうしようもない馬鹿だと思われることは確実。

126:デフォルトの名無しさん
09/06/12 13:14:39
>>96のことな

127:デフォルトの名無しさん
09/06/12 14:30:20
>>126
すまん、初心者でよくわからんのだが、
>>96のやり方だと何がまずいのか教えてくれ。

128:デフォルトの名無しさん
09/06/12 15:34:59
>96 のその部分だけ見れは、前者だろうが後者だろうがメモリリークする

実は前者はこの後のコードでリリースしてます、とか
オーナーシップとかしらね、後でリリースできれば良いんだよ、
とかって言い出さない限り。

129:デフォルトの名無しさん
09/06/12 18:59:21
autoreleaseされたインスタンスを返すfactory methodを作るのが普通の感覚でしょ。
そこに思い至らない時点で実力は推して知るべしだから、GC使うかリークなんて
気にしなくて良いよ。リークが問題になる規模の物はどうせ作れないし、多分他にも
問題山積で誰も気が付かない。

130:デフォルトの名無しさん
09/06/12 23:38:40
OS3.0のiPhoneでも
autoreleaseは果てしなく遅いぞ

131:デフォルトの名無しさん
09/06/13 00:41:02
iPhoneでGCって性能的にやっぱ厳しいのかな


132:デフォルトの名無しさん
09/06/13 10:11:29
OS X でも GC は案外リソース喰う気がします
Core Data で GC つかったフリーウェアつくってますが、使っていると
時々 CPU 使用率があがるのは何故かと問い合わせがあって、
しらべてみたら GC がかなり頑張ってるように見えました。

133:デフォルトの名無しさん
09/06/17 19:24:12
URLリンク(journal.mycom.co.jp)
こちらの方法で、特定のクラスのメソッド一覧を取得しようとしたのですが、
Objective-C 2.0でobjc_method_list構造体の構造が変わってしまっているようで、このままでは取得できませんでした。
Objective-C 2.0における、objc_method_list構造体もしくはそれに変わる構造体について、知っている方居たらよろしくお願いします。

134:デフォルトの名無しさん
09/06/17 20:06:24
>>133
class_copyMetodList(Class cls, unsigned int *outCount)

なおその手のものは、Obj-C 2.0 RuntimeAPIに載ってる。
URLリンク(developer.apple.com)

135:デフォルトの名無しさん
09/06/18 01:06:04
>>134
Runtime Referenceがあることを知りませんでした…
ありがとうございます。


136:デフォルトの名無しさん
09/06/22 21:41:42
OS3.0だとNSOperationQueueにaddしたOperationが2つしか実行されなくなるんだけど実装方法変わったのかな?


137:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/26 14:01:29
setterが失敗って?
予期しないオブジェクトが渡されたって事ならObjCの例外を投げるのが普通。

139:デフォルトの名無しさん
09/06/26 17:29:31
あとはデリゲートで処理とか?(それも含めてならごめん)

140:デフォルトの名無しさん
09/06/26 18:36:08
3. 何もしない
 本当に値がセットされてるかどうか知りたかったら getして比較しろや!

4. exit(3)をコール
 気に食わなければ黙って帰る

5. abort(3)をコール
 そんな話聞いてないです!

141:デフォルトの名無しさん
09/06/27 03:26:10
これじゃだめ?
- (void)setHogeHoge:(Hoge *)aHoge error:(NSError **)error;

142:デフォルトの名無しさん
09/06/27 04:02:09
>>141
KVCしたいってことだからそれじゃ駄目じゃね?

>>137
1.で問題ないんじゃない?Obj-Cのメッソドディスパッチはそんなにヤワじゃないよ。

143:デフォルトの名無しさん
09/06/27 07:10:47
ええかげんなこと書くな。

NSKeyValueCoding Protocol Reference
- (BOOL)validateValue:(id *)ioValue forKey:(NSString *)key error:(NSError **)outError

おまいらまぬある嫁。


144:デフォルトの名無しさん
09/06/27 11:52:18
それだとKVCのときだけしか通用しないよね

145:デフォルトの名無しさん
09/06/27 16:22:38
KVCはNSKeyValueCodingプロトコルですでに定義されてるんだから、
BOOL返したいんなら同等の別のメソッドとして定義すればいいだけじゃん。

KVC準拠のsetterなら戻り値はvoid。
なんとかしたいなら単に例外投げればいい。

146:137
09/06/27 22:24:24
んー、validate???: error:か、validateValue:forKey:error:使うのが、
ルールなんですね。
URLリンク(developer.apple.com)

でも、自動で呼ばれるわけじゃないんで、呼び出し側がvalidateした後にsetするわけですか。
すると、validateとsetの間に他スレッドに割り込まれないようにするためには、
呼び出し側でロックしないといけなくなって、イマイチ。

すると、setterでobjective-cの例外投げたくなるけど、「荻原本」とか、
URLリンク(google-styleguide.googlecode.com)
見ると、objective-c例外は使うな的なことが書かれてて(両者の理由は違うけど)、悩ましい。


147:デフォルトの名無しさん
09/06/28 01:01:34
>>146
Cocoa API 自体が予期せぬ引数を与えられた場合は
頻繁に Obj-C 例外投げるので、
別に自分が投げても大勢に変化ないと思いますが...

148:デフォルトの名無しさん
09/06/28 15:06:59
ちょっとイニシャライザに関して、質問よろしいですか。
URLリンク(wisdom.sakura.ne.jp)
ここのページの指定イニシャライザのサンプルプログラムなんですが

id pt1 = [Point new];
id pt2 = [[Point alloc] initWithPoint:400 int:300];

メイン関数(メソッド)で、pt2にオブジェクトをセットする際に
initが走ってないように思うんですがこれでいいもんなんですか?
[[クラス名 alloc] init]のセットで覚えてきたので、initしなくて
いいのかなっていう疑問なんですが。
※pt1はinitのオーバーライドで[super init]が走ってるからいいとして。

init自体がよく分かってないから、こういう質問してしまってるのかもしれ
ないですが、この方法は正しいのか誤ってるのか、また正しい場合は何故な
のかご教授下さい。

149:デフォルトの名無しさん
09/06/28 16:03:34
init〜ではじまるメッセージは内部でinitを呼んでるはずだから大丈夫。

150:デフォルトの名無しさん
09/06/28 16:28:17
え?逆じゃね?

NSObject +newは、内部的に[[NSObject alloc] init]と等価。

指定Initializerは他のinitから呼ばれる基本部分を含んだ、共用部分。
この例では、
[Point new]
[Point alloc] init]
はどちらも、内部的にinitWithPointを呼んでいるということ。
もちろん引数は初期値を使っている。この場合は0だろうね。


151:デフォルトの名無しさん
09/06/28 20:15:22
>>150
>>148はpt2の初期化のことを聞いてるんじゃね?

ちなみに>>148のコードをXcode 3.1.3(gcc 4.0.1)で試したところ、正しく動作した(ただしそのままだとコンパイルも通らないので、本質的でないところは改変した)。
ただ、このサンプルコードはPointのインスタンス変数を読んでprintfしているだけだから上手く動いたのかもしれん。

[super init]がないことに関しては、>>149の言うとおりなのかもしれんが、そうだとするとメソッド呼び出しが循環するし、そうでないとするとObject部分が初期化されていないということになるから、あまり良い実装ではない気がする。

152:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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
09/06/28 23:08:13
ああ理解した。
リンク先のコード見てなかったが、ひどいコードだったのね。

155:デフォルトの名無しさん
09/06/28 23:42:37
148です。

>>153様、レスありがとうございます。
やっぱり>>153様のように[super init]で初期化して判定させた方がいいです
よね。ありがとうございました。

156:デフォルトの名無しさん
09/06/28 23:58:33
ここ読むといいよ
URLリンク(developer.apple.com)

157:デフォルトの名無しさん
09/06/29 00:01:34
>>153
> - (id) initWithPoint:(int)x int:(int)y {
> self->x = x;
> self->y = y;

これってどうなの?

158:デフォルトの名無しさん
09/06/29 00:07:29
銅ではありません。

159:デフォルトの名無しさん
09/06/29 02:14:09
>>148
URLリンク(wisdom.sakura.ne.jp)
は情報が古すぎるから初心者は読まないほうがいい

160:150
09/06/29 07:49:54
インスタンス変数なんだよね?
意味府。

161:デフォルトの名無しさん
09/06/29 08:22:39
148です。やはり、元の情報が古いように感じますね(後に他のページも参照
してみた感想です)。
詳解Objective-C2.0が難しすぎたんで、上記のサイトを参考にしていたんで
すが、誤字脱字が多く、たまにコーディングミスもあったりしてかえって混
乱してしまった、というのが素直な感想です。

余談ですがObjective-cってなんか楽しいですね。感覚的に、ですが。。。

162:デフォルトの名無しさん
09/06/29 15:06:09
>>161
ヒレガス本を買うのが一番おすすめ。最新版の日本語訳って出たんだっけ?
英語が読めれば英語版をかうのがよし。
URLリンク(cocoadevcentral.com)
もわかりやすいよ。英語が読めれば。

163:デフォルトの名無しさん
09/06/29 17:33:45
ヒレガス本の最新版の和訳は、たのみこむあたりに持ち込むしかないのだろうか…

164:デフォルトの名無しさん
09/06/29 20:49:49
またまた148です。>>162様、書籍紹介どうもです。
ヒレガス本調べてみましたが、かなり評判いいみたいですね。
英語は得意ではないですが、読むこと事態に嫌悪感は無いので是非購入してみ
たいと思います。・・・まあ少々お高いのでまた来月にでも。
教えて頂いたサイトも参考にさせて頂きます。さらっと読んでみましたが図が
あって理解し易いですね!

また勉強して戻ってきたいと思います。できればアドバイスする側で!
貴重なお時間を割いて頂き、皆様には感謝致します。

165:デフォルトの名無しさん
09/06/29 21:33:26
>>164
2ページに1枚はスクリーンショットがあるレベルだ。安心していい。
ナイトライダーについてWiki辺りで調べておくとなおいい。

166:デフォルトの名無しさん
09/06/30 00:25:59
>>165
いや、日本人でもナイトライダーしってるだろ...
いまどきの若者はそうでもない?

167:デフォルトの名無しさん
09/06/30 11:45:24
はい、マイケル

168:デフォルトの名無しさん
09/07/01 07:23:05
>> 164
Safari Books Onlineで立ち読みしてみたら?

169:デフォルトの名無しさん
09/07/02 21:27:59
fscanfを使いたいのですが、どうしたらいいですか?

170:デフォルトの名無しさん
09/07/02 21:38:19
そのまま使えば良いんじゃない?

171:デフォルトの名無しさん
09/07/06 23:34:28
Objective-Cは2次元配列を扱えない糞言語である。

172:デフォルトの名無しさん
09/07/06 23:37:59
CとC++は?

173:デフォルトの名無しさん
09/07/07 00:12:11
int x = 20, y = 50;
foo[x][y];

何が不満なの?

174:デフォルトの名無しさん
09/07/08 00:07:26
放っとけ。

175:デフォルトの名無しさん
09/07/08 00:09:45
int hoge[10][10]
こいつをキャストする時って

int(*)[10] get()とかでよかったんだっけ?
C99の仕様と同じ?

176:デフォルトの名無しさん
09/07/08 01:04:37
malloc系使わずに
int x = 20, y = 50;
int hoge[y][x];
ってできる?

177:デフォルトの名無しさん
09/07/08 01:14:16
>>176
できる。C99。

178:デフォルトの名無しさん
09/07/08 16:30:47
URLリンク(code.google.com)

179:デフォルトの名無しさん
09/07/08 19:27:02
blocks って何じゃいと思ったらレキシカルクロージャの事か

URLリンク(www.mikeash.com)
URLリンク(landonf.bikemonkey.org)

180:デフォルトの名無しさん
09/07/09 00:31:15
>>179
Cocoa を Obj-C で組んでいると block が非常に欲しくなるのは事実なのだが、
C レベルで言語仕様を追加するのはいかがなものかという気もしないでもない

181:デフォルトの名無しさん
09/07/16 09:05:12
いつかObjective-C++0xも作られるのかね

182:デフォルトの名無しさん
09/07/16 09:10:34
なんで?
いつかって0xということは今年中なわけだけど
そんな情報入ってないぞ

183:デフォルトの名無しさん
09/07/16 10:28:56
ていうかObjC++ってObjCを普段CとしてコンパイルしてるところをC++としてコンパイルしてるだけだから
gccがC++0xに対応すればその瞬間にObjC内でもC++0xが使えるわけだが

184:デフォルトの名無しさん
09/07/16 11:05:40
>>183

185:デフォルトの名無しさん
09/07/29 00:40:41
Objective-CってQueueクラスってないですよね
なんでですか?

186:デフォルトの名無しさん
09/07/29 05:29:57
NSMutableArrayでまかなうから。
あんま好きじゃないけど


187:デフォルトの名無しさん
09/07/29 07:23:35
>>186
それは性能が激遅になってありえないですね
STLの50分の1しか性能ないのにありえないじゃないですか?

188:デフォルトの名無しさん
09/07/29 09:19:59
>>185
Foundationのコレクションて、アプリケーションドメインで必要なものじゃなくて、
APIとのデータ交換に必要なものでしょ。
アプリ内でパフォーマンスを稼ぎたいなら、stlでもboostでも使えばいい。
データ交換には、タプル、配列、ハッシュの三種があれば十分。

189:150
09/07/29 23:21:15
こんな記事があった。
>URLリンク(homepage.mac.com)

190:デフォルトの名無しさん
09/07/29 23:29:15
自分はCFMutableArrayに構造体のポインタぶちこむだけで
普通に満足なんだけど、STLってそんなに早い?

CFで固めると、void*埋め込めるしオブジェクトのretain/release
すっとばせるし、楽だと思うんだけど。

191:デフォルトの名無しさん
09/07/29 23:39:16
間違えた

NSMutableStringを継承したクラスを作りたいのですが
その中で、initWithString:を継承先のクラスに適合させるには
どうやってラップすればいいれしょうか


192:デフォルトの名無しさん
09/07/30 00:42:23
{ if(self=[super initWithString:string]){} return self; }

193:デフォルトの名無しさん
09/07/30 22:47:45
NSMutableArrayなどのコンテナクラスに
オブジェクトを突っ込んだ後

それを取り出すときに、どうやって型判別するのですか?
たとえばインターフェイスA、B、C、Dのインスタンスをいくつか
追加しているとの想定時、とどのように判断するのがObj-Cだと一般的なのでしょうか?



194:デフォルトの名無しさん
09/07/30 23:01:19
isKindOfClass:とか?

195:デフォルトの名無しさん
09/07/30 23:11:03
>>194
突っ込むインターフェースが増えた場合に、判定する箇所も増えるため、
バグを生みやすくなる(判定箇所の修正忘れ等)

Obj-Cに限らず、コンテナには、同一クラス、または親(先祖)が同一のクラスに制限しておく方が安全と思われます。

どうしても異なるクラス、親、先祖を入れたいのであれば、
全てのクラスにプロトコルを採用し、共通の操作を行える様にするのが落としどころではないでしょうか?


196:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/31 07:57:30
一億回呼ぶのが普通という基準がよくわからん

198:デフォルトの名無しさん
09/07/31 08:03:16
チェックが上手くできず無限ループに入ったって言いたいとか?

199:デフォルトの名無しさん
09/07/31 11:32:36
>>193を読んで初心者だと思い安易な回答をしてしまった俺が悪かったよ

200:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/31 14:45:42
この場合は型判定を使うのが間違いだといってんだろうよ

204:デフォルトの名無しさん
09/07/31 19:43:44
呼び出す側で判定して分岐するより、呼び出される側に共通のプロトコルを採用してポリモーフィズム

205:デフォルトの名無しさん
09/08/01 00:17:53
型判定が最後の手段だというのは極端かもしれないけど、
それにべったり依存して型判定だらけになったプログラムも
オブジェクト指向らしくないと思う。
まずは>>200,204のアプローチで設計し、
どうしようもない時だけ型判定で逃げるのが正道では。

206:デフォルトの名無しさん
09/08/01 01:31:27
>>202
>Obj-C触り始めて間もないのかな?isKindOfClass: は全く、全然、断じて、1_も、
>最後の手段ではない。むしろ型判定の、最初の手段といっても過言ではない。


207:デフォルトの名無しさん
09/08/01 02:53:12
ObjC的なオブジェクト指向の思想ではrespondsToSelector:使うのが自然のように思える。


208:196
09/08/01 13:22:20
>>200
では、基底クラスを設けないで@protocolで
doSomthingを定義し、それを実行するのは
Obj-C的にはどうでしょうか?


>>201
そのようなコードを書いて、これ気持ち悪いコードだと思ったので
ここで質問させてもらいました。

>>207
respondsToSelectorって頻繁に呼び出してもいいものでしょうか?
例えばRSSを解析するなどの用途で何度も何度も呼び出すと
いいのだろうかと疑問に思うのですが



209:デフォルトの名無しさん
09/08/01 15:32:22
>>208
なんで RSS 処理で respondsToSelector とかの高等手段が必要なのか
わからないんですが、どういう処理を書こうとしてるのか教えてください。

あと、respondsToSelector を頻繁に呼び出して良いか、ですが、
人によって「頻繁」の定義が違うので難しいです。
あなたのばあいは一億回とか平然と言うひとなので
頻繁に呼び出しちゃだめです。
最近はパソコン速いので100回や1000回ぐらいどうってことないです。

あと、スピードが気になったら Instrument 等でスピードを実測して、
プログラムのどこの部分で実際に時間がかかっているかチェックしましょう。
自分の勝手な思い込みで、実際には時間がかかってないところを
最適化してもしかたがないので。


210:デフォルトの名無しさん
09/08/01 15:36:01
>では、基底クラスを設けないで@protocolで
>doSomthingを定義し、それを実行するのは
>Obj-C的にはどうでしょうか?
別に基底クラスをつくるのと変わらないです。
R* x のかわりに id<R> x になるだけです。

211:デフォルトの名無しさん
09/08/11 16:06:51
Tiger環境なんだけどインタフェースビルダーが旧式だと知って絶望した…
豹買ってもいいけどもうすぐ雪豹でるし…
でもそうしたら休暇が終わっちまう!

212:デフォルトの名無しさん
09/08/11 18:12:36
情報の豊富な彪で覚えるまで雪豹は暫く放置で良いじゃん。

213:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/14 17:01:01
あ、勘違いしていました。
CのsuperであるBのmethod2で更にsuperであるAを呼び出していました。
継承でoverrideを繰り返してもsuperで呼び出せるのはその一つ前でいいんですよね。

217:デフォルトの名無しさん
09/08/14 17:04:27
>>216
そうだよ。

218:デフォルトの名無しさん
09/08/15 00:30:27
>>213
本題と関係ないが、
#import <Foundation/NSObject.h>
とわざわざ細かく指定するとかえってコンパイルが遅くなりかねないよ。
プリコンパイルドヘッダが使えなくなるので。
#import <Foundation/Foundation.h>
にしておきましょう。

あと printf じゃなくて NSLog(@"hogehoge") をつかうのが一般的じゃないかな。

219:デフォルトの名無しさん
09/08/15 19:15:23
>>218
萩原Obj-C(1.0のやつ)をはじめたばかりで、本のサンプルみながらやっているもので。
NSLogは索引をみると後半で出てきますが、まだそこまで到達していないです。(今Ch04あたり)
本当は今ならObj-C 2.0をやるべきなのでしょうけれど、実行環境がまだTigerなので1.0でないとたぶん本のサンプルが動かないと思うので1.0の本を使っています。

220:デフォルトの名無しさん
09/08/16 01:05:12
>>219
なるほど。まあ日進月歩の世界で本はすぐに古くなるけど、がんばってね!

221:sage
09/08/16 08:09:19
>>218
シンプルにコンソールに出力するならprintfでいいと思うけど。
GUIなアプリケーションの動作ログという意味なら、NSLogだが。

222:デフォルトの名無しさん
09/08/17 15:51:21
正直どっちでもいいけど、
%@ を後々使うかも、と考えると
最初からNSLogにしておいた方がいいかなって思う。

223:デフォルトの名無しさん
09/08/17 15:58:09
時間がコンソールに出力されるのが邪魔な時はprintfだけど、大体はNSLogかな

224:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/23 18:28:03
u=user
s=sys

226:デフォルトの名無しさん
09/08/23 19:21:53
つまり見やすくなったんだね

227:デフォルトの名無しさん
09/08/24 20:30:49
>>225
thx
これで実行時間の比較が出来ます。

228:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/27 12:27:20
Cでは定数じゃないと初期化できないはず。
最初に使うときに初期化すりゃいいんじゃね?

230:デフォルトの名無しさん
09/08/27 12:32:14
クラス変数をその方法で持たせることは出来る。
このクラス変数はnullで初期化しておいて、
最初のインスタンス生成(init)のときにnullかどうかみて
初期化するのが普通かな。



231:228
09/08/27 12:37:36
いろいろいじってて違うのペーストしたみたいです。初期化のところは
static NSString *value = [[NSString alloc] init];
でした。

すいません。お願いします

232:228
09/08/27 12:39:27
>>229,230
あ、そうか
initilizeでしたっけ?あれで初期化すればいいんですね
ありがとうございます


233:デフォルトの名無しさん
09/08/27 14:24:36
+initializeな。

234:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/02 17:57:49
retainCount の値なんか気にしているやつはアホです

236:234
09/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:デフォルトの名無しさん
09/09/02 18:36:47
プールはどこにある

238:234
09/09/02 19:04:07
>>237
ありがとうございます。

プール?

retainCountはNSObjectのメンバ変数で
allocでインスタンス作った時は関係ないんですよね?

つまり自分自身にどれだけ参照されてるかの数を持っていて
releaseが呼ばれて0になったときdeallocが呼ばれると。

プールが関係あるのはautoreleaseを自分でした時とそれを呼び出してるような
コンストラクタを呼び出したときですよね?

もしかしてなんか間違って勉強進めてます?

239:デフォルトの名無しさん
09/09/02 19:21:05
dealloc された object (のアドレス)に retainCount を送ったところで、
まともな結果が戻ってるわけがない。

> retainCountが1のオブジェクトにreleaseを送信後メッセージを送るとランタイムエラーになるんじゃなかったでしたっけ?

そんな仕様はない。

240:デフォルトの名無しさん
09/09/02 20:41:49
>>236
最後のNSLogで存在しない(解放済み)オブジェクトにメッセージを送っているからエラーが出る。

241:デフォルトの名無しさん
09/09/02 20:44:55
retainCountなんてメンバ変数は存在しないし
NSMutableStringはtoll free bridgeになってるから実体はCFMutableStringでしょ。

242:234
09/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:デフォルトの名無しさん
09/09/02 22:29:30
MacsBugみたいなアセンブリレベルでできるデバッガってしらない?
実行中のコードをデバッグできるやつ。

244:デフォルトの名無しさん
09/09/02 22:32:41
TMON

245:デフォルトの名無しさん
09/09/02 22:59:37
TMONが見つからない。
どこにいけばある?

246:デフォルトの名無しさん
09/09/02 23:24:56
遠い昔・・・

247:デフォルトの名無しさん
09/09/02 23:55:39
そんな
少年の日の心の中にいた青春の幻影
では困るのだけど。

248:デフォルトの名無しさん
09/09/03 10:07:49
>>243
マルチ乙

249:デフォルトの名無しさん
09/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
09/09/05 21:30:20
>>249
レスありがとうございます

クラスクラスターまでまだ行ってないのですが、NSStringの説明でその言葉は見たことがあったので、なんかそれが関係してるのかな、と思ってました。

とりあえず、先へ進もうと思います。

251:196
09/09/06 22:10:26
Obj-Cって
継承階層増えるだけでどれくらい
オーバーヘッドあるのですか?


252:デフォルトの名無しさん
09/09/06 23:16:09
2cmくらい。

253:デフォルトの名無しさん
09/09/07 10:47:39
それはひょっとしてギャグで言ってるのか

254:デフォルトの名無しさん
09/09/07 13:05:58
>>251
ランタイムの実装次第じゃない?

255:デフォルトの名無しさん
09/09/07 23:50:03
>>251
計測してみたら?

256:デフォルトの名無しさん
09/09/09 17:48:11
>>242
>質問がおかしかったですね。すいません。エラーが起きないのはなんででしょうか?と聞きたかったのです。

とても基本的なことなので覚えておくべきなのですが、
C、 C++、 Objective-C などの言語では解放済みのメモリ領域や
オブジェクトに対する操作の結果は決められていません。
そもそも「エラーが起きる」という決まりがないのです。

(処理系によってはデバッグ用のライブラリでは解放後のメモリを
変な数値で埋めるなどして、解放済みのオブジェクトへの操作で
エラーが出やすいようにしてくれるような機能もあります)

257:デフォルトの名無しさん
09/09/10 12:56:51
わけあってCとObjCの混在したプログラムを書いているのですが

@interface CHoge : NSObject{ void (*_ptr)(); }
// _ptrのアクセサを書きたい
@end

このインスタンス変数を読み書きするためのアクセサをどうやって書けばよいかわかりません。
わかる方教えていただけますでしょうか?

258:デフォルトの名無しさん
09/09/10 14:01:44
- (void)_ptr{ //関数取得
return (*_ptr)();
}
- (void)set_ptr:(void)(*hoge)() //関数セット
{
void _ptr = hoge
}
じゃ駄目なの?

259:デフォルトの名無しさん
09/09/10 14:02:43
ごめん、最後のvoidいらないや。

260:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/10 19:31:49
萩原1.0のコードを本見てコメントまで正確に打ち込んでいたら
warning: multi-line comment
に嵌った・・・
能で改行するなよぅ。

262:デフォルトの名無しさん
09/09/10 23:27:19
知らんがな

263:デフォルトの名無しさん
09/09/12 00:46:33
charからNSStringに簡単に変換する方法はないでしょうか?

264:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/12 01:21:14
「うまく代入できません」
↑ダメな質問の例

266:デフォルトの名無しさん
09/09/12 01:45:07
>>264
デバッガを使えるようになりましょう。

267:264
09/09/12 03:11:05
すみません、根本的に何かが違ったようです。
出直してきます。。。

268:デフォルトの名無しさん
09/09/12 11:11:44
デバッガの使い方ってアップルからドキュメント出てますか?

269:デフォルトの名無しさん
09/09/12 15:53:36
>>268
>デバッガの使い方ってアップルからドキュメント出てますか?
Xcodexのドキュメントに乗ってないか? どこにでもあるようなデバッガ
だから、マニュアルなしでも使えるぞ。


270:デフォルトの名無しさん
09/09/15 01:26:27
>>264
label.text = str;
のあとにstr releaseすると、label.textもreleaseされちゃわないか?

271:デフォルトの名無しさん
09/09/15 03:17:02
プロパティのsetter semanticsがassign(デフォルト)だとそうなんのかね?

272:デフォルトの名無しさん
09/09/15 13:27:10
NSString をプロパティにするときは copy にしなきゃダメだろ、常識的に考えて。

273:デフォルトの名無しさん
09/09/15 14:23:09
どういう常識?

274:デフォルトの名無しさん
09/09/15 14:53:09
NSMutableString が渡されたときに外部で書き換えられたらこまるから、GC使ってるときでもcopyにしておいたほうがいい、場合もあるかもしんない。

275:デフォルトの名無しさん
09/09/15 16:57:11
NSArrayだとどうするんだろう?
自力DeepCopy?

276:デフォルトの名無しさん
09/09/15 17:10:05
そこは状況に応じてだろJK
参照を保持させたいのか、それともインスタンスを複製して保持させたいのか、だろ?

277:275
09/09/15 18:31:34
>>272
これに対してだけど?

278:デフォルトの名無しさん
09/09/15 19:32:51
>>277
そこは状況に応じて、だろ。

279:デフォルトの名無しさん
09/09/15 20:42:03
>>264
get、setメソッドを使わないと、=だとオブジェクトの参照が
代入されるだけだからなぁ。
そりゃ、[str release];は実質、[label.text release];と同じになるだろうな

280:デフォルトの名無しさん
09/09/15 20:53:02
Cocoaのautorelease poolの解放タイミングがいまいちわからない
それとも、もうGC導入されて、あんま使ってない?

281:デフォルトの名無しさん
09/09/15 22:40:53
>>280
自分で明示的にpool作ってないんならイベントループ終了時にそのループ内でのプールが解放される

282:デフォルトの名無しさん
09/09/15 22:49:35
>>281
そう!まさに、そのイベントループとやらがようわからんのです。。。

283:デフォルトの名無しさん
09/09/15 23:16:51
>>279
>get、setメソッドを使わないと、=だとオブジェクトの参照が
>代入されるだけだからなぁ。

昔はそうだったっけ

284:デフォルトの名無しさん
09/09/15 23:22:29
>>283
えっ、いまはちがいまするか?

285:デフォルトの名無しさん
09/09/15 23:25:23
>>284
Objective-C 2.0 以降しか知らないけど、
obj.prop = hoge は [obj setProp:hoge] と同義。

286:デフォルトの名無しさん
09/09/15 23:48:58
>>285
へー、そうなんだ。
勉強になった。
ただ、知らないと、逆に参照渡ししたいときとかハマったりしそう。。
それとも、プロパティの時に限って、=がアクセッサメソッド呼び出し
で実装してくれるのかな?

287:デフォルトの名無しさん
09/09/16 00:12:06
プロパティでドット構文使った時だけだよ
てかなんでみんなCocoaスレでやらないのw

288:デフォルトの名無しさん
09/09/16 00:14:30
@selector(func_name)って、Cでいう関数ポインタと同じようなもん?
(これもCocoaスレでやる話?w)

289:デフォルトの名無しさん
09/09/16 00:47:07
>>286
いやいやそうじゃなくて、そもそもクラスCにインスタンス変数x があったときに
C* c=...
c.x=
は(xがプロパティでなければ)文法エラーだから。cはポインタだから、やるにしても
c->x=
でしょ。曖昧さはないです。

290:デフォルトの名無しさん
09/09/16 00:54:45
>>289
なるほど。
確かにObjective-Cのクラスのメンバにはc.xみたいにはアクセス
できないよねprivateメンバじゃなくても
c->xになる。

で、ごめん、質問なんだけど、プロパティって何だっけ?w

291:デフォルトの名無しさん
09/09/16 09:42:48
>>290
URLリンク(e-words.jp)

質問の内容が低レベルすぎる

292:デフォルトの名無しさん
09/09/16 09:56:37
>>288
URLリンク(journal.mycom.co.jp)

293:デフォルトの名無しさん
09/09/16 14:53:14
>>288
C でいう関数ポインタは特定の関数の実装を直接指示するでそ(実体はアドレスだし)。
C++ のメンバ関数ポインタは、特定のクラス(とその派生クラス)のオブジェクトの仮想あるいは
そうでない関数を間接的にあるいは直接に指示するでそ(実体はvtbl上のオフセットまたはアドレス)。

Objective-C のセレクタは、どのようなクラスあるいはインスタンスのメソッドでも名前で指示する
ことができる(実体は文字列)。

294:デフォルトの名無しさん
09/09/16 20:03:40
>>291
ggrksって感じですまんかった。
んで、プロパティって、つまりはメンバ変数のことだとおもうけど、
そうするとc.xのようにドットで表すのは間違いじゃねって思ったんだけど
それは間違い?
>>289が納得できない

295:デフォルトの名無しさん
09/09/16 20:18:25
まちがい。

296:デフォルトの名無しさん
09/09/16 20:26:24
>>294
Obj-CのプロパティはC++のメンバ変数じゃないから . で表しても全く問題ない。
最近の言語では当たり前の糖衣構文。C# も同様のシンタックスシュガーを持つ。

とはいえ、foo の bar プロパティが構造体だったとき、foo.bar.baz = 100 で
foo.bar.baz が 100 にならないのはみっともないのは確か。

297:デフォルトの名無しさん
09/09/16 21:26:55
>>296
始めたばかりの頃コレでハマったのはいい思い出。

298:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/17 04:05:43
iPhoneでは-descriptionWithCalendarFormat:timeZone:locale: は梨になった。
NSDateFormatterを使いましょう。Mac側でもやめる気満々なことが書いてあるので
できれば移行していった方がよいようだ。

300:デフォルトの名無しさん
09/09/17 10:57:56
>>299
そうでしたか。ありがとうございます!
おかげさまで警告なしでビルドできるようになりました。

301:デフォルトの名無しさん
09/09/18 01:09:24
またもしかするとiPhoneでは無しになったものかもしれないのですが、
NSHost *host = [NSHost hostWithAddress:@"192.168.0.125"];
の部分で、+hostWithAddreassメソッドが見つからないという警告が出てしまいます。
Mac OSX Reference Libraryを参照しながら作ってるので、見つからないはずはないのですが、
iPhoneで実装するとしたら変わりに何を使えばいのでしょうか・・・。

というか、変わりとなるクラスやメソッドってどうやって調べればいいのでしょうか・・・


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5397日前に更新/248 KB
担当:undef