[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 12:16 / Filesize : 248 KB / Number-of Response : 975
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Objective-C [ObjC part:4];



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

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くらい。

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
そう!まさに、そのイベントループとやらがようわからんのです。。。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<248KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef