09/04/15 00:11:50
*** プログラム技術板 ***
【マック】Macintoshプログラミング質問箱
スレリンク(tech板)
Mac OS Xでの開発環境はどれがイイ?
スレリンク(tech板)
*** 新・mac板 ***
Cocoaはさっぱり!!! version.12
スレリンク(mac板)
Macでプログラミング{9}
スレリンク(mac板)
Xcode part7
スレリンク(mac板)
iPod touch/iPhone ネイティブアプリ製作 ver.10
スレリンク(mac板)
3:デフォルトの名無しさん
09/04/15 00:12:29
*** 本家 ***
Objective-C 2.0 プログラミング言語
URLリンク(developer.apple.com)
Introduction to The Objective-C 2.0 Programming Language
URLリンク(developer.apple.com)
そのほか英語
URLリンク(developer.apple.com)
*** 書籍 ***
荻原本
URLリンク(www.amazon.co.jp)
HMDTダイナミック本
URLリンク(www.amazon.co.jp)
4:デフォルトの名無しさん
09/04/15 00:48:05
乙!でもどうでもいいが アマゾンのリンクは、
URLリンク(www.amazon.com)数字 だけでいいんで、
来年ぐらいに次にスレたてする人はよろしく。
荻原本
URLリンク(www.amazon.co.jp)
HMDT ダイナミック本
URLリンク(www.amazon.co.jp)
ダイナミック Objective-C サイト
URLリンク(journal.mycom.co.jp)
Apple のランタイムのソースコード (10.5.6)
URLリンク(www.opensource.apple.com)
英語のサイトだけど
Objective-C 入門
URLリンク(cocoadevcentral.com)
Objective-C Style 1, 2 (変数名のつけかた等)
URLリンク(cocoadevcentral.com)
URLリンク(cocoadevcentral.com)
Mike Ash さん(Audio Hijack の中の人)のブログ、
Obj-C のランタイムの話が良く出る
URLリンク(mikeash.com)
C++ と Objective-C の文法の比較
URLリンク(ktd.club.fr)
5:デフォルトの名無しさん
09/04/15 14:26:33
ハムスターの Obj-C 講座もおもろい。偶然きのう更新されてた。
URLリンク(www.sealiesoftware.com)
6:3
09/04/15 23:38:19
>>4
>URLリンク(www.amazon.com)数字 だけでいい
知らんかった。以後そうする
7:デフォルトの名無しさん
09/04/16 04:58:57
URLリンク(amazon.jp)
URLリンク(amazon.jp)
で良いよ、coもwwwも要らない
8:デフォルトの名無しさん
09/04/17 14:02:41
短い URL かっこいい
9:デフォルトの名無しさん
09/04/17 18:35:08
じゃもうぜんぶTinyURLで。
10:デフォルトの名無しさん
09/04/17 21:19:18
あれはかっこわるい
11:デフォルトの名無しさん
09/04/18 10:24:27
Cのヘッダファイル#importしたら、idって名前のメンバがある構造体でエラーになった。
これはしょうがないのか…。
12:デフォルトの名無しさん
09/04/18 16:10:41
エラーにならんよ。
13:デフォルトの名無しさん
09/04/18 18:05:10
#import <objc/objc.h>
14:デフォルトの名無しさん
09/04/19 22:09:48
Windowsで動く処理系ってありますか?
有ったら触って見たいです。
15:デフォルトの名無しさん
09/04/19 22:51:36
これかな...
URLリンク(www.gnu.org)
日本語ではあまり新しい資料はないかもしれん。とりあえず
URLリンク(journal.mycom.co.jp)
16:デフォルトの名無しさん
09/04/19 23:20:09
>>15
ありがとう御座います><
早速試してみます^^
17:デフォルトの名無しさん
09/04/19 23:26:10
MinGW/GCCじゃだめ?
18:デフォルトの名無しさん
09/04/20 00:43:25
>>17
>>15 のリンク先は MinGW ベース。
他には、Yellow Box for Windows というのを Apple が昔作ってたから、
ebay とかで粘ってると手に入るかもしれません。
URLリンク(www.shawcomputing.net)
Rhapsody DR2 もしくは WebObjects 4.5 というのに付いてきます。
19:デフォルトの名無しさん
09/04/20 01:23:36
Cocotron は?
20:デフォルトの名無しさん
09/04/20 01:32:35
Cocotron は XCode でのクロスコンパイルが前提の気がする...
つかったことなくてサイトの説明を読んだだけなので何とも言えませんが。
21:デフォルトの名無しさん
09/04/20 02:27:54
>>20
俺も採用例FileMagnetのWinクライアントぐらいしか知らないな
用途によってはREALBasicとかも検討すべし>>14
ただ遊びたいなら話は別だが
22:デフォルトの名無しさん
09/04/20 02:55:55
>>21
>用途によってはREALBasicとかも検討すべし
REALBasic は Objective-C ではないのでは???
23:デフォルトの名無しさん
09/04/20 10:30:20
>>22
WIn/Mac両対応のソフトウェアを作るという前提での話
どうももう一回読んでみると>>14はただObjective-Cの処理系で遊びたかっただけのようだから的外れな指摘だな
たしかLinux系にはgccでobjective-cのコンパイラは提供されていたような...
数度インストールオプションで見た覚えがある
24:デフォルトの名無しさん
09/04/20 10:42:47
荻原本買って勉強中だけどこれが初プログラムだからどーにもな~。
やり始めて2週間だからしゃーなか
25:デフォルトの名無しさん
09/04/20 15:58:31
初プログラミングなら、荻原本でいきなりObjective-C叩くより、
楽しいCocoa辺りのコードを特に理解せず書いて動かして学んでいく方が進み早いんじゃないかな
26:デフォルトの名無しさん
09/04/20 18:59:56
Dynamic-ObjectiveC を勉強中です。IMP 呼び出しについて教えて下さい。
オブジェクトを返すようなメソッドはそのままのものが返ってきましたが、
値を返すようなメソッドの場合、どうやって返ってくるのですか?
@interfae Bar: NSObject { double num; }
@property(readwrite) double num;
@end
@implementation Bar
@synthesize num;
@end
として、Bar のインスタンス hoge を作り、numを適当に設定し、
IMP numImp = [[Bar class] instanceMethodForSelector:@selector(num)];
id num = numImp(hoge, @selector(num));
としたところ、num には hoge が入っていました。method_copyReturnType()
では、d が返ってくるのですが…よろしくお願いします。
27:デフォルトの名無しさん
09/04/20 20:16:26
ええと追記です。id だからオブジェクトを返すものしか駄目なのか、とも考えた
のですが、double を試す前にBar の変数に char *name とした場合には、
設定したchar* が返って来たので、やってみた次第です。
int の場合にも設定した値が返ってきました。で、今floatでやってみたのですが、
double と同様、駄目でした。float なら値が返ってくる事を期待したのですが…
28:デフォルトの名無しさん
09/04/20 20:48:49
キャストしたらどうよ?
double(*numImp)(id,SEL) = [Bar instanceMethodForSelector:@selector(num)];
double num = (*numImp)(hoge, @selector(num));
29:デフォルトの名無しさん
09/04/20 21:06:51
それが正解だよね
IMP の定義は typedef id (*IMP)(id, SEL, ...);
だから、id 以外を返す場合はキャストして使わないといけない。
30:デフォルトの名無しさん
09/04/20 21:16:19
>>28
できました!なるほどー、IMPをさらに関数ポインタにしてしまえば良いんですね。
勉強になりました、ありがとうございます。
あと>26の「num には hoge が入っていた」というのはたまたま入っていた
だけのようでしたので訂正します(汗
31:デフォルトの名無しさん
09/04/20 21:26:59
>>29
ありがとうございます。キャストが必要だろうと思い、そのまま
double value = (double) numImp(hoge, @selector(num));
とかやっていたので、コンパイラに怒られていたんです。Cそのものの経験が
無いのでよく分からずにやってました。関数ポインタのキャスト、ってのが
目から鱗でして (^^;;
32:デフォルトの名無しさん
09/04/21 14:35:51
>>25
楽しいCocoa買ってみます
ありがと
33:デフォルトの名無しさん
09/04/22 17:11:46
KVC準拠を意識して組んでる人いる?
34:デフォルトの名無しさん
09/04/22 22:32:46
普通に書いてればそうならない?
35:デフォルトの名無しさん
09/04/23 13:08:57
GUIならバインディング使うだろ
バインディング使うにはKVCで書くだろ
普通に書いてりゃkvcで書くと思う
36:デフォルトの名無しさん
09/04/23 13:20:20
>>33 は他の言語からうつってきたばかりで、
つい getter を -(NSHage*)hoge でなくて
-(NSHage*)getHoge とかいてしまうからそう思うんではなかろうか。
37:デフォルトの名無しさん
09/04/23 22:17:46
getだったら
- (void)getHoge:(NSHoge *)
とか言う形? 違和感有るけど
38:デフォルトの名無しさん
09/04/24 08:08:48
>>37
-(void)getHoge:(NSHoge**)
でないと駄目だとおもう
39:デフォルトの名無しさん
09/04/28 01:03:12
Apple gcc で -fconstant-string-class オプションが期待道理動かないんだけどなぜでしょう?
Linux で GNU の runtime 使ってると動くんですが…
#import <objc/Object.h>
#import <stdio.h>
@interface MyString : Object
{
char *bytes;
unsigned int numBytes;
}
- (const char *)cString;
- (unsigned int)length;
@end
@implementation MyString
- (const char *)cString { return bytes; }
- (unsigned int)length { return numBytes; }
@end
int main(int argc, char* argv[]) {
id s = @"Hello, World";
fprintf(stderr, "<%s:%p>\n", [s name], s);
return 0;
}
% gcc -g -fconstant-string-class=MyString -o main main.m -lobjc
main.m: In function ‘main’:
main.m:19: error: cannot find reference tag for class ‘MyString’
make: *** [main] Error 1
40:デフォルトの名無しさん
09/04/28 11:04:51
Obj-C 2 だとこんなかんじになります。
#import <Foundation/Foundation.h>
// copied from objc/runtime.h
// because objc_class is opaque in Obj-C 2
struct objc_class_fake {
Class isa;
Class super_class;
const char *name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars;
struct objc_method_list **methodLists;
struct objc_cache *cache;
struct objc_protocol_list *protocols;
} ;
@interface MyString : NSObject
{
char *bytes;
unsigned int numBytes;
}
- (const char *)cString;
- (unsigned int)length;
@end
struct objc_class_fake _MyStringClassReference;
つづく
41:デフォルトの名無しさん
09/04/28 11:05:37
@implementation MyString
+(void)load
{
memcpy(&_MyStringClassReference,self,sizeof(_MyStringClassReference));
}
- (const char *)cString { return bytes; }
- (unsigned int)length { return numBytes; }
@end
int main(int argc, char* argv[]) {
[[NSAutoreleasePool alloc] init];
id s = @"Hello, World";
fprintf(stderr, "<%s:%s>¥n", [[[s class] description] UTF8String],[s cString]);
return 0;
}
42:デフォルトの名無しさん
09/04/28 11:08:43
コンパイルは
gcc -fno-constant-cfstrings -fconstant-string-class=MyString hogehoge.m -framework Foundation
とかしてください。
ポイントは、Apple runtime だと、
1. no-constant-cfstring で CFString の特殊処理をやめさせてやる
2. constant-string-class=HogeString だと、isa ポインタが
struct objc_class _HogeStringClassReference というシンボルを指します。
だからそれを初期化してやらないといけないです。
URLリンク(lists.apple.com)
を参照してください。
43:39
09/04/28 12:28:19
>>42
Thx! 試してみます.
44:39
09/04/28 18:26:09
#import <objc/Object.h>
#import <stdio.h>
#import <string.h>
#if (defined __APPLE__) && (defined __MACH__)
# import <objc/objc-runtime.h>
struct objc_class _MyStringClassReference;
#endif
@interface MyString : Object {
char *bytes;
unsigned int numBytes;
}
- (const char *)cString;
- (unsigned int)length;
@end
@implementation MyString
#if (defined __APPLE__) && (defined __MACH__)
+ load {
memcpy(&_MyStringClassReference, self, sizeof(_MyStringClassReference));
}
#endif
- (const char *)cString { return bytes; }
- (unsigned int)length { return numBytes; }
@end
int main(int argc, char* argv[]) {
id s = @"Hello, World";
fprintf(stderr, "<%s:%p> : \"%s\"\n", [s name], s, [s cString]);
return 0;
}
45:39
09/04/28 18:28:24
Apple % gcc -fno-constant-cfstrings -fconstant-string-class=MyString -o main main.m -lobjc
GNU % gcc -fconstant-string-class=MyString -o main main.m -lobjc
って感じで両方でコンパイル成功して期待した通り動いた.ありがとう >>42
46:デフォルトの名無しさん
09/05/13 08:16:25
オブジェクト自分で作ったら、リリースせんといかんと思うけど、
そのとき、例えば、AppleのCocoaだと、
NSObject obj = [[NSObject alloc] init];
[obj autorelease];
って出来るよね?
このautoreleaseって、要するにGCみたいなもんなの?
47:デフォルトの名無しさん
09/05/13 11:26:33
ちがう。autorelease は NSAutoreleasePool に登録する際に使う。
NSAutoreleasePool は drain/release を受けたときに登録してある
インスタンス全てに release を送るだけ。受けなければそのまま放置。
とりあえず、メモリ管理プログラミングガイドを理解しよう。
URLリンク(developer.apple.com)
それでも分からないなら、新Mac板 Cocoaはさっぱりスレ の方へどぞ。
スレリンク(mac板)
48:デフォルトの名無しさん
09/05/13 13:50:54
>>46
C言語の自動変数に近い。イベントループ開始でAutoreleasePoolが確保
されて、autoreleaseにするとそこに登録される。イベントループ終了で
AutoreleasePoolが解放されて、autoreleaseで登録したオブジェクトは
全てreleaseされる。だから自分でreleaseの手間が省ける。
GCはどこからも参照されていないオブジェクトを見つけて勝手に解放する
機能
49:デフォルトの名無しさん
09/05/13 20:21:28
メモリ管理プログラミングガイドは日本語版もあるよ
URLリンク(developer.apple.com)
50:デフォルトの名無しさん
09/05/13 20:43:38
あ、日本語のはログインしないと見れないのかな、ごめん
51:デフォルトの名無しさん
09/05/16 23:51:15
Xcode で、Objective-c (*.m)のクラスから 別の C++(*.cpp) ファイルの
グローバル関数を呼ぼうとすると、下記のようなエラーが出てしまいます。
Linking xxx/xxx
-[xxx xxx:] in xxx.o
Objective-Cのクラスから、C++のグローバル関数を呼べなかったようです。
*.m ファイル内に作ったローカル関数は呼べたのだけど・・・
52:デフォルトの名無しさん
09/05/17 00:18:26
extern "C"
53:デフォルトの名無しさん
09/05/17 01:42:10
トン
54:デフォルトの名無しさん
09/05/29 19:54:09
class Test
{
Test(){}
virtual ~Test(){}
};
これコンパイルすると、
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test'
ってエラー出ます
何が悪いんですか?
55:デフォルトの名無しさん
09/05/29 20:17:13
うちでは問題無かったよ。セミコロン付けろゴルァって事かな?
% cat foo.cpp
class Test
{
Test(){}
virtual ~Test(){}
};
% g++ -c foo.cpp
% ls foo.o
foo.o
56:デフォルトの名無しさん
09/06/01 15:46:54
>>55
いろいろ試しましたが、コンパイル通りません…
自分はiPhoneのOpenGL ESベースのアプリでやっているのですが、それがまずいんでしょうか
プロジェクト作成して、Other SourcesフォルダにTest.hを作成して、>>54のコードを記述し、それをmain.mに#importしてるのですが、エラーになります
.mmで定義するようにしないといけないのかなと思い、Test.mmを作成してコンストラクタ・デストラクタの定義をそちらに移してもだめでした
できればコンパイルを通すまでどのような手順で行っているのか教えてください
57:デフォルトの名無しさん
09/06/01 16:13:50
before 'Test'
だから、クラス定義に問題があるんじゃなくて、
その前、恐らく includeファイル内などに問題がありそう。
58:デフォルトの名無しさん
09/06/01 16:33:57
ヘッダーファイルの「情報を見る」とファイルタイプが.h,.cになっていたので、.h.cppに変えました。
が、それでもダメでした。これでいけると思ったんだけどなあ。
この問題ってXcodeスレで聞いた方がいいんですかね?
59:デフォルトの名無しさん
09/06/01 17:25:52
呼び出し側のmain.mの「情報を見る」でファイルタイプを.c,.objcから.cpp,.objcppに変えたら動きました。
ここら辺説明してるサイトが全然見あたらなかったですよ…
2chのXcodeスレでかろうじて類似の質問があって助かった
60:デフォルトの名無しさん
09/06/01 21:05:51
System.Generic.List<T>に相当する
記述方式ってないのでしょうか
毎回毎回別々のオブジェクト書くの面倒です
助けてください
61:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/01 22:43:19
>>61
それなんてJavaですかw
iPhoneでもObjective-C++できるのですか
63:デフォルトの名無しさん
09/06/01 22:44:52
C++のテンプレートはオブジェクト指向的じゃないとよく批判されるがな
64:デフォルトの名無しさん
09/06/01 22:46:14
>>62
iPhone でも Obj-C++ できますよ
というか main.m を cpp モードにした時点で Obj-C++ になってます
65:デフォルトの名無しさん
09/06/01 22:52:52
>>59
まさかgccでコンパイルしてたとか?
g++じゃなくて。
66:デフォルトの名無しさん
09/06/01 23:07:28
>>65
そういうことだったんじゃないの。XCode (Mac の IDE) からだと
ファイルの言語設定でコンパイラが変わるので。
まあ確かにそのあたりはやっている人には当たり前すぎて、
解説書にもつい書き忘れてしまう... ということかも知れない
67:デフォルトの名無しさん
09/06/02 23:24:34
GUI以外の部分で
コールバックってどうやって実現すればいいですかね?
68:デフォルトの名無しさん
09/06/02 23:27:45
>>67
それだけで貴女以外のひとがなにが聞きたいかわかると本当におもってますか?
僕らはエスパーじゃないよ。
69:デフォルトの名無しさん
09/06/02 23:29:58
ネットワーク処理をコールバックで処理したいの
70:デフォルトの名無しさん
09/06/02 23:33:15
さっぱり見えてこないんだけど、Objective-Cは関係あるの?
71:デフォルトの名無しさん
09/06/02 23:39:50
>>70
C#とC++ならコールバックあるでしょ
なんでObjective-Cには無いの?
元のソース移植できないじゃん
72:デフォルトの名無しさん
09/06/02 23:51:43
メソッドのポインタ取り出したいってこと?
73:デフォルトの名無しさん
09/06/03 00:03:39
>>71
何で無いと思うの? 無い訳無いじゃん。
74:デフォルトの名無しさん
09/06/03 00:09:42
じゃあこれと等価の記述を教えていただけないですか?
double g( double x, double (*f)(double) )
75:デフォルトの名無しさん
09/06/03 00:11:28
それでいいじゃんw
76:デフォルトの名無しさん
09/06/03 00:21:34
>>67
関数ポインタみたいなのが欲しいんでしょ。
URLリンク(developer.apple.com)
77:デフォルトの名無しさん
09/06/03 00:27:49
基本は>>76で、遅いと思ったらこっち。
URLリンク(journal.mycom.co.jp)
でもネットワーク処理なら C で kqueue とか libevent とか使ったら良いのに。
78:デフォルトの名無しさん
09/06/03 00:32:51
- (double)g:(double)x callback:(double(*)(double))f;
こういう事かな?
79:デフォルトの名無しさん
09/06/03 01:01:43
>>71
いや、C++ のソースがあるなら Obj-C++ つかえば
なにひとつ移植しなくて済むでしょ。何を考えているんだ?アホ?
80:デフォルトの名無しさん
09/06/03 21:16:49
>>74
それそのまんまで何が問題なんだ?w
81:デフォルトの名無しさん
09/06/03 23:54:09
わかりにくいね
82:デフォルトの名無しさん
09/06/03 23:58:03
typedefすればいいじゃん。
83:デフォルトの名無しさん
09/06/03 23:58:09
Obj-Cって型が解らなくなった場合に
チェックする方法ってありますか?
84:デフォルトの名無しさん
09/06/04 00:41:19
正確には無いと思うよ。
85:デフォルトの名無しさん
09/06/04 01:24:04
>>83
[obj class]
URLリンク(developer.apple.com)
URLリンク(wwwa.dcns.ne.jp)
86:デフォルトの名無しさん
09/06/04 01:43:55
>>83
その型ってのは、変数の型? それとも、オブジェクトのクラス?
Objective-Cは変数に型がない(idでかまわない)言語なだけですよ(プリミティブ型は除きますが)
型キャストを許す言語であれば、(変数の)型が分からなくなる事はありえるのでは?
変数の型がどうであれ、オブジェクトが自分自身の型/クラス、もしくは受けられるメッセージを知ってれば問題ないって考え方です
87:デフォルトの名無しさん
09/06/04 01:51:14
オブジェクトの型が id なんじゃないの?
プリミティブがそれぞれの型を持っているのと同じで。
88:デフォルトの名無しさん
09/06/04 04:23:39
>>87
idは構造体のポインタのtypedefだからそうとも言えるけど、それは変数に型のあるCという言語での実装の話しで...なんというか微妙な感じもする。
idには特別意味もないし、JavaとかC++の縛りのきつい「型/クラス」と、idは別の概念、別のくくりにした方がいいんではないかと。
89:デフォルトの名無しさん
09/06/04 22:58:35
何なのこの投げっぱなし質問
90:デフォルトの名無しさん
09/06/06 00:15:09
interface作ったときにメモリ開放メソッドは
どのように記述するのが一般的なのでしょうか
91:デフォルトの名無しさん
09/06/06 02:39:56
@interface ... @end内にデストラクタをどう宣言するかという話かな?
普通はNSObjectで宣言されているdeallocメソッドをオーバーライドします。
(だから@interfaceにはとくに何も書きません。)
メモリ管理については
URLリンク(developer.apple.com)
をどうぞ。
92:デフォルトの名無しさん
09/06/06 20:48:46
独自にObjを定義したとして
[[Obj alloc] initHoge : arg];
allocと組み合わせて利用するinitHogeを定義するとき
定義は以下が一般的なのでしょうか?
- (id) initHoge : (NSString *) val;
93:デフォルトの名無しさん
09/06/06 22:03:25
XmlTextWriterみたいなクラスってないですか?
94:デフォルトの名無しさん
09/06/07 00:24:29
>>93
Obj-C スレにきて、返事をする人が .NET を知っていると仮定するとはいい度胸をしている。読み手のことを考えて、
「.NET ならこれこれができるこれこれというクラスが
あるんですけど、(ドキュメントは http:// ... に ...)」とか
質問の際に書けんものかね?
とりあえず NSXMLDocument をつかえば規格に準拠した XML データは
つくれますよ。かなりメソッド名が冗長だけど。
手で文字列をつなぎ合わせて XML にするよりは断然いいです。
あと、これ以上は Mac 板の iPhone プログラミングスレか
Cocoa スレに行ったほうがいいとおもいます。ここは一応 Obj-C 言語に特化した
過疎スレなので。
95:デフォルトの名無しさん
09/06/07 01:58:33
>>93みたいな手合いは相手する必要ないよ。
96:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/09 23:19:50
何処が違うのかさっぱりわからん
98:デフォルトの名無しさん
09/06/09 23:47:19
>[dic setObject:[[Hoge alloc] init] forKey:@"hoge"];
て書いたら、 setObject:に渡したHogeインスタンスを後でreleaseする手段が無くなるのでは
上の書き方なら [hoge release]て書けるけど。
99:デフォルトの名無しさん
09/06/10 02:47:32
>>98
なあにobjectForKey:@"hoge"で取り出してreleaseすればいいさ
100:デフォルトの名無しさん
09/06/10 07:22:05
[dic setObject:[[[Hoge alloc] init] autorelease] forKey:@"hoge"];
じゃないとだめ
101:デフォルトの名無しさん
09/06/10 16:29:35
改行したいときって何を書けばいいんでしょうか?
\nでも\rでもダメだったんですが。
102:デフォルトの名無しさん
09/06/10 17:05:39
(option + ¥) n
103:デフォルトの名無しさん
09/06/10 18:15:29
>>102
ありがとうございます
104:デフォルトの名無しさん
09/06/10 23:35:38
>>99
それ今の仕様だとメモリリークするけど?
105:デフォルトの名無しさん
09/06/11 00:01:56
>>104
今の仕様って何?
GCのこと?だとしたらGCは仕様じゃなくてオプションだと思うんだが
106:デフォルトの名無しさん
09/06/11 00:07:37
>>105
どっちにしてもコレクションに入れたものを
objectForkeyで取り出して開放してもリークするだろ
107:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/11 01:14:31
ふーん
110:デフォルトの名無しさん
09/06/11 01:20:05
>>109
ふーん、じゃなくてさ
111:デフォルトの名無しさん
09/06/11 22:25:41
あーそうかい俺が悪かったよ
謝ればいいんだろゴラぁ
112:デフォルトの名無しさん
09/06/11 22:39:43
謝ってないんだけど
113:デフォルトの名無しさん
09/06/11 22:43:33
Cocoaが分からないけど興味があるだけの俺みたいなのもいる訳だが、
結局のところ>>107,108が仕様として正しいということでFAですか?
114:デフォルトの名無しさん
09/06/12 00:02:52
それ以前に作法として完全に間違っているので気にする必要はありません。
>>99はネタ。
115:デフォルトの名無しさん
09/06/12 00:04:42
そもそもNSMutableDictionaryって非推奨のAPIだろ
NSMutableDictionaryに入れるとメモリリークするし
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で実装するとしたら変わりに何を使えばいのでしょうか・・・。
というか、変わりとなるクラスやメソッドってどうやって調べればいいのでしょうか・・・
302:デフォルトの名無しさん
09/09/18 09:01:51
alloc] initWithAdress:
303:デフォルトの名無しさん
09/09/18 18:30:44
>>302
それもダメなようです・・・。
304:デフォルトの名無しさん
09/09/18 18:57:40
>>301
綴りミス?
+hostWithAddre[a]ssメソッドが見つからないという警告が出てしまいます
305:デフォルトの名無しさん
09/09/18 19:03:45
>>304
綴りミスです。ごめんなさい。
プログラムの方はちゃんと書いてあります。
警告あっても、正常に動作はするのですが、警告があるままやるのは気持ち悪いですね・・・
306:デフォルトの名無しさん
09/09/18 19:16:43
メソッド廃止になったのに使うのは間違い
警告に添え
307:デフォルトの名無しさん
09/09/18 19:19:51
>>306
で、deprecatedでない代替メソッドはなんなの?
308:デフォルトの名無しさん
09/09/18 19:24:25
教えてあげないよ!
309:デフォルトの名無しさん
09/09/18 19:25:59
301≠307ですよ
310:デフォルトの名無しさん
09/09/18 21:57:57
>>301
CFHostCreateWithName()
311:デフォルトの名無しさん
09/09/19 08:50:39
久しぶりにCocoaで遊んじゃお!!わくわく
312:デフォルトの名無しさん
09/09/19 08:52:04
連休だもんな!
313:デフォルトの名無しさん
09/09/19 08:58:08
そうだな!
さて、なに作ろうw
314:デフォルトの名無しさん
09/09/19 10:00:00
連休を有意義に過ごすための予定表アプリを作って連休をつぶすのはどうじゃろか
315:デフォルトの名無しさん
09/09/19 15:33:51
来年のGW用ですね。
316:デフォルトの名無しさん
09/09/20 22:47:54
NSString *message = [NSString stringWithUTF8String:[messageData bytes]];
NSLog(@"%@", message);
[message release];
とある関数の中にこういうコードがあるのですが、
2回目呼び出した時に、メモリ関係のエラーか何かが出てしまいます。
この記述って何か間違ってるのでしょうか?
317:デフォルトの名無しさん
09/09/20 22:50:45
取り敢えずreleaseすんな。
alloc initWith するか NSLog(@"%@", [NSString stringWithUTF8String:[messageData bytes]]); で
318:デフォルトの名無しさん
09/09/20 22:58:01
>>317
ありがとうございます。エラーが消えました!
基本的にreleaseするのはallocした時だけって認識持っといていいんですかね・・・
319:デフォルトの名無しさん
09/09/20 23:09:52
URLリンク(www.google.co.jp)
320:デフォルトの名無しさん
09/09/20 23:31:07
なるほど、ありがとうございます。コンビニエンスコンストラクタは
放っておけば勝手にreleaseされるんですね。
321:デフォルトの名無しさん
09/09/22 13:35:53
本当に糞面倒な言語だな
322:デフォルトの名無しさん
09/09/22 16:47:43
基本、Cだからな
323:デフォルトの名無しさん
09/09/22 21:42:41
言語関係ねえ
324:デフォルトの名無しさん
09/09/23 22:42:16
2009-09-23 22:38:40.195 test[4488:5203] *** _NSAutoreleaseNoPool(): Object 0x101d660 of class NSCFNumber autoreleased with no pool in place - just leaking
Stack: (0x305a2e6f 0x30504682 0x2dc4 0x960b0155 0x960b0012)
ビルドとデバッグをすると、あるところでこういうメッセージが出るのですが、
これって何か問題が起こっているのでしょうか?
その後も特に問題なくアプリは動いているのですが・・・
パッとみた感じだと、NSCFNumberはオートリリースされたってだけで別に問題ない・・・んですかね。。。
325:デフォルトの名無しさん
09/09/23 23:20:20
ちなみに
NSNumber *num = [NSNumber numberWithInt:iRet];
NSLog(...);
[num release];
こういう場所(NSNumberやNSStringの生成や解放を行う場所)で必ず出てくるっぽいです。
326:デフォルトの名無しさん
09/09/23 23:28:10
>>324
問題があるので autorelease pool について勉強してください
327:デフォルトの名無しさん
09/09/23 23:30:13
>>326
問題ありですか・・・。
わかりました、ヒントをありがとうございます!
知らない言葉なのでちょっと勉強してきます
328:デフォルトの名無しさん
09/09/23 23:44:52
今度はObjective-Cの質問です!!
クラスを作るまでもない関数ってどういう風に宣言すればいいのでしょうか・・・?
C言語でいう、ふつうの void swapInt(int a, int b); みたいな感じの関数を作りたいと思ってます。
クラスのメソッドだったら
-(void)showMessage:(NSString *)nsstrMsg flag:(BOOL *)flag
{
...
}
みたいな感じで作るのは分かっているのですが・・・。
それとも、Objective-CはC言語のような関数は基本的になくて、それでも使いたい場合は
クラスを定義して、クラスメソッドを用意するのが普通なのでしょうか?
329:328
09/09/23 23:45:36
すみません、誤爆です。
330:デフォルトの名無しさん
09/09/24 13:23:26
>>328
void swapInt(int a, int b);
じゃだめなの?
331:デフォルトの名無しさん
09/09/24 15:54:11
>>330
今はそのC言語ライクな書き方で対処して正常に動いてるのですが、
なんかObject-Cのソースの中に、Cの記述方法が混ざってるのが気持ち悪くて・・・
332:デフォルトの名無しさん
09/09/24 15:59:03
その感覚がおかしい。
333:デフォルトの名無しさん
09/09/24 16:13:08
いや、Objective-Cの書き方自体も気持ち悪いんだけど、
その書き方で書くならその書き方でソースコードを統一した方が気持ちいいんだもん・・・
334:デフォルトの名無しさん
09/09/24 16:25:44
Objective-Cは言語じゃなくて、C言語のライブラリと、それを使いやすくするためのプリプロセッサだと考えるべき。
335:デフォルトの名無しさん
09/09/24 18:16:44
そんなに気持ち悪いならソースファイル自体をわければいいじゃんか。
336:デフォルトの名無しさん
09/09/24 18:22:03
どうしてもというのなら。
@interface NSObject(StaticMethods)
+ (void)showMessage:(NSString *)nsstrMsg flag:(BOOL *)flag;
@end
@implementation NSObject(StaticMethods)
+ (void)showMessage:(NSString *)nsstrMsg flag:(BOOL *)flag
{
...
}
@end
使用例
[NSObject showMessage:@"hoge" flag:NO];
あなた以外誰も得しませんが。
337:デフォルトの名無しさん
09/09/24 20:45:44
>>333
他人のObjCコード一度読んでみるといいよ
みんな平気で使ってるから
338:デフォルトの名無しさん
09/09/24 21:10:20
>>326
すんません、>>282わかりますか?
339:デフォルトの名無しさん
09/09/24 21:10:41
気持ち悪さで言うなら "nsstrMsg" の方がよっぽど気持ち悪いがな。
340:デフォルトの名無しさん
09/09/24 22:37:19
>>338
NSApplicationMain()を実行するとイベントループという名の無限ループが開始される。
各アプリケーションにはイベントキューというキューがある。
イベントループの最初にNSAutoreleasePoolオブジェクトが確保される。
イベントループはイベントキューにイベントがはいってくるまで寝る。
Mac OS Xはイベントが発生すると該当アプリケーションのイベントキューにイベントを放り込む。
またはアプリケーションが自分のイベントキューにイベントを放り込む。
イベントキューにイベントが入るとイベントループは目を覚ます。
アプリケーションはイベントに応じて動作を起こす。
確保されたNSAutoreleasePoolオブジェクトが解放される。
始めの当たりに戻る。
アプリケーションを終了するとなんとexit(3)を呼び無限ループを吹っ飛ばす!!
余分な情報も混ぜてみました。必要な所だけお読みください。
341:デフォルトの名無しさん
09/09/24 22:44:43
>>338
イベントループ内での autorelease pool は NSPortDelegate の handlePortMessage:
呼び出し前に autorelease pool が作られ、呼び出し後に drain される、と思えばok。
(メインスレッドではこれを勝手にやってくれているのであまり気にしなくてよい)
NSThread 等でワーカスレッドを立ち上げただけでは作ってくれないので、そのときは
ちゃんと自前で作ってやらないとautorelease されるインスタンスが登場する処理
(明示的に使うもの、内部処理で使うもの、のいずれも)が>>324の様にエラーになる。
NSThread NSAutoreleasePool でググればたぶん誰かが何か書いてると思う
御指名の 326 じゃないので嫌なら無視してくれ
342:338
09/09/24 22:45:40
>>340
すばらしい。。。
いままで、いろんな人に訊いてきたけど、ここまで明快に
わかりやすく答えてくれた方はいませんでした。
これで、安心して[obj autorelease];を使えます。
どうもありがとうございました。
343:338
09/09/24 22:50:07
>>341
おお、更なる詳しい説明!
しかしながら、>>340さんの説明までは理解できましたが、
>>341さんの説明は自分の知識不足でちょっと難解です。。。
はぁ。。
せいぜいがんばります。
どうもありがとうございます。
344:デフォルトの名無しさん
09/09/25 23:36:34
URLリンク(www.remus.dti.ne.jp)
このあたりも凄く参考になるぜ
第10-13回らへん
345:デフォルトの名無しさん
09/09/25 23:59:48
MOSAの人は早くテクニカルドキュメント要約ライブラリの作成の仕事に戻るんだ
346:338
09/09/26 00:34:43
>>344
おわっ、これはかなりわかりやすそうな予感
勉強してみます
どうもありがとう!
347:デフォルトの名無しさん
09/09/29 18:33:50
UIButtonのRounded Rectタイプのボタンで,画像を使わず手軽にボタンの色を変える事は出来ないでしょうか?
348:デフォルトの名無しさん
09/09/30 06:42:58
>>347
無理です
あと、ここではなくiPhoneアプリ開発のスレに書きこんだ方がいいかと
349:デフォルトの名無しさん
09/10/09 06:08:24
もの凄い初歩的な質問かもしれないのですが、
とあるサイトに↓のようなコードがありました。
NSMutableArray *anArray = [[NSMutableArray alloc] init];
NSString *str = [[NSString alloc] initWithString:@"文字列"];
[anArray addObject:str];
[str release];
NSStringのstrをNSMutableArrayに追加しているのですが、その直後にstrをreleaseしています。
NSMutableArrayに追加するということは、クラスのインスタンスをコピーして追加するという事なのでしょうか?
addObjectした後は、元のオブジェクトは必要なくなるって認識でいいのでしょうか?
350:デフォルトの名無しさん
09/10/09 06:38:19
URLリンク(stackoverflow.com)
351:デフォルトの名無しさん
09/10/09 08:42:00
>>349
retain/release について勉強してください。その辺わかってないと、
プログラム書いてるといずれ意味不明なクラッシュが多発して
どうしようもなくなりますよ。
URLリンク(developer.apple.com)
release は C++ でいう delete とは違って、即座にオブジェクトを
破壊するわけではないです。retain カウントを減らすだけです。
retain カウントがゼロになれば、自動的に dealloc が呼ばれてオブジェクトが
なくなります。
あるオブジェクトを持っておきたい人は、
retain して retain カウントを増やします。
いらなくなったら、 release して retain カウントを減らします。
誰からもオブジェクトがいらなくなったら、自動的に dealloc されます。
NSMutableArray に addObject すると、NSMutableArray は
そのオブジェクトを保持していたいので、 retain されます。
一方で、>>349 のコードを書いているあなた自身は
もうそのオブジェクトは直接はいらなくなるので、release しちゃっていいです。
インスタンスがコピーされているわけじゃなくて、
NSMutableArray がこのオブジェクトを保持するぜ!と言っているので、
あなたはもうこのオブジェクトを保持している必要がなくなるわけです。
352:デフォルトの名無しさん
09/10/09 14:54:17
>>351
ありがとうございます。もんのすごく分かりやすいです。
一応リンク先の方も読んでおこうと思います。
結構既にメモリまわりのエラーが時々出たりしているので・・・
353:デフォルトの名無しさん
09/10/09 15:06:58
「一応」じゃなくてちゃんと読め。
354:デフォルトの名無しさん
09/10/09 15:11:02
>>353
そうですね、ちゃんと読みます。
リンク先が英語で焦ったのですが、メモリに関する日本語リファレンス探したらあったのでそっちを読みます。
URLリンク(developer.apple.com)
355:デフォルトの名無しさん
09/10/10 18:22:49
>>282
GNUSTEPのソースを追えば、理解できると思う。
356:デフォルトの名無しさん
09/10/11 18:49:15
以下のコードで指定のURLからファイルを取得しようとしているのですが、
bad URLというエラーが返されてしまいます。
NSLogでnssUrlを表示させ、そのURLをコピペしてブラウザから閲覧したら確かに見る事ができるのでURLは間違っていないはずです。
NSString *nssUrl = [NSString stringWithFormat:@"URLリンク(%s)", SERVER_ADDR, DIR_AREA, [semanticList objectAtIndex:i], FILE_SUBJECT];
NSURL *url = [NSURL URLWithString:nssUrl];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
NSURLResponse *resp;
NSError *err;
NSData *result = [NSURLConnection sendSynchronousRequest:req returningResponse:&resp error:&err];
NSLog([err localizedDescription]); //←bad URLと表示される
NSString *subjectData = [[NSString alloc] initWithData:result encoding:NSShiftJISStringEncoding];
[subjectData release];
このコードに何か問題がありますでしょうか?
357:デフォルトの名無しさん
09/10/11 18:56:45
そのコピペしたURLを直接NSStringに nssUrl = @"hoge"ってつっこんだ結果はどうなってるのさ?
358:デフォルトの名無しさん
09/10/11 18:59:50
>>357
あれ?それだとエラーが出てこなくてちゃんと動きます。
謎なんですけど・・・
359:デフォルトの名無しさん
09/10/11 19:03:50
nssUrl を characterAtIndex で unichar 出して中身見ると、変なモンが混ざってると思うぞ。
360:デフォルトの名無しさん
09/10/11 19:09:17
NSLog(@"url=%@",[url absoluteString]);
で url の方にちゃんと入ってるかどうか確認したところ
url = (null)
と表示されました。>>357さんのようにNSStringに直接ぶちこんだ時はちゃんとurlが表示されました。
でも、NSLog(@"nssUrl = %@", nssUrl);でnssUrlの中身を確かめたら、
stringWithFormat:で生成したときもちゃんとURLが表示されます。
NSURL *url = [NSURL URLWithString:nssUrl];
に何か問題があるのでしょうかね・・・
361:デフォルトの名無しさん
09/10/11 19:13:54
>>359
おぉ、ありがとうございます。1文字ずつ表示させていったら
[semanticList objectAtIndex:i]のあとに空白?みたいなのが1つ入ってました。
なんでだろう・・・とりあえず後は自分で原因探してみます。ありがとうございました!
362:デフォルトの名無しさん
09/10/11 19:27:03
あまりスマートじゃないですが、固定長のデータなのでsubstringToIndexで対処しました。
ありがとうございました。
363:デフォルトの名無しさん
09/10/12 00:13:57
char*をNSNumber型に変更するスマートな書き方はありますか?
364:デフォルトの名無しさん
09/10/12 01:29:23
それポインタだろ。cString のことか?
365:デフォルトの名無しさん
09/10/12 02:01:49
ファイルの削除に関する質問です。
NSError *err;
if([[NSFileManager defaultManager] isDeletableFileAtPath:filePath]){
NSLog(@"消すことが可能");
[[NSFileManager defaultManager] removeItemAtPath:filePath error:&err];
NSLog([err localizedDescription]);
}
上のコードを実行すると、NSLogの部分でEXC_BAD_ACCESSが出ます。
そもそものNSErrorの使い方が間違ってるのでしょうか?
366:デフォルトの名無しさん
09/10/12 02:21:12
NSError *err = nil;
ってしてみて
367:デフォルトの名無しさん
09/10/12 02:51:14
>>366
ありがとうございます!
無事エラーが出ないようになりました。
なんかよくわかりませんが、allocもinitもせずに宣言するときはとりあえずnilをぶち込んでおく癖をつけておきます。
368:デフォルトの名無しさん
09/10/12 03:06:32
>>364
そうです。Cの関数から返されたポインタのcharをNSNumberにしたいです。
今はNSStringに変換してからNSNumberに再変換してます。。
369:デフォルトの名無しさん
09/10/12 03:26:11
> NSStringに変換してからNSNumberに再変換
何したいのか分からないから、この処理の部分を書いてみて
370:デフォルトの名無しさん
09/10/12 04:10:56
>>369
char *c = (Cの関数);
NSString *str = [NSString stringWithCString:c];
NSNumber *num = [NSNumber alloc] initWithInt:[str intValue]];
NSStringを介さずNSNumberにしたいです。