Objective-C [ObjC part:4];
at TECH
1:デフォルトの名無しさん
09/04/15 00:11:00
Objective-C(オブジェクティブ シー)はプログラミング言語の一種。C言語をベースにSmalltalk型のオブジェクト指向機能を持たせた上位互換言語。
(Wikipedia:Wikipedia項目リンク より)
Objective-C [ObjC part:3];
スレリンク(tech板)
Objective-C
スレリンク(tech板)
Objective-C
URLリンク(pc5.2ch.net)
2:デフォルトの名無しさん
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クラスってないですよね
なんでですか?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5383日前に更新/248 KB
担当:undef