Objective-C [ObjC part:4];

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
Objective-C(オブジェクティブ シー)はプログラミング言語の一種。C言語をベースにSmalltalk型のオブジェクト指向機能を持たせた上位互換言語。
 (Wikipedia:http://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
2デフォルトの名無しさん:2009/04/15(水) 00:11:50
*** プログラム技術板 ***
【マック】Macintoshプログラミング質問箱
ttp://pc11.2ch.net/test/read.cgi/tech/1113058054/

Mac OS Xでの開発環境はどれがイイ?
ttp://pc11.2ch.net/test/read.cgi/tech/1163314891/

*** 新・mac板 ***
Cocoaはさっぱり!!! version.12
ttp://pc11.2ch.net/test/read.cgi/mac/1231853172/

Macでプログラミング{9}
ttp://pc11.2ch.net/test/read.cgi/mac/1216824430/

Xcode part7
ttp://pc11.2ch.net/test/read.cgi/mac/1218774554/

iPod touch/iPhone ネイティブアプリ製作 ver.10
ttp://pc11.2ch.net/test/read.cgi/mac/1238385226/

3デフォルトの名無しさん:2009/04/15(水) 00:12:29
4デフォルトの名無しさん:2009/04/15(水) 00:48:05
乙!でもどうでもいいが アマゾンのリンクは、
ttp://www.amazon.com/dp/数字 だけでいいんで、
来年ぐらいに次にスレたてする人はよろしく。
荻原本
http://www.amazon.co.jp/dp/4797346809
HMDT ダイナミック本
http://www.amazon.co.jp/dp/4861006414

ダイナミック Objective-C サイト
http://journal.mycom.co.jp/column/objc/

Apple のランタイムのソースコード (10.5.6)
http://www.opensource.apple.com/darwinsource/10.5.6/objc4-371.2/

英語のサイトだけど
Objective-C 入門
http://cocoadevcentral.com/d/learn_objectivec/
Objective-C Style 1, 2 (変数名のつけかた等)
http://cocoadevcentral.com/articles/000082.php
http://cocoadevcentral.com/articles/000083.php
Mike Ash さん(Audio Hijack の中の人)のブログ、
Obj-C のランタイムの話が良く出る
http://mikeash.com/?page=pyblog/
C++ と Objective-C の文法の比較
http://ktd.club.fr/programmation/objective-c.php
5デフォルトの名無しさん:2009/04/15(水) 14:26:33
ハムスターの Obj-C 講座もおもろい。偶然きのう更新されてた。
http://www.sealiesoftware.com/blog/archive/
63:2009/04/15(水) 23:38:19
>>4
>ttp://www.amazon.com/dp/数字 だけでいい

知らんかった。以後そうする
7デフォルトの名無しさん:2009/04/16(木) 04:58:57
http://amazon.jp/dp/4797346809
http://amazon.jp/dp/4861006414

で良いよ、coもwwwも要らない
8デフォルトの名無しさん:2009/04/17(金) 14:02:41
短い URL かっこいい
9デフォルトの名無しさん:2009/04/17(金) 18:35:08
じゃもうぜんぶTinyURLで。
10デフォルトの名無しさん:2009/04/17(金) 21:19:18
あれはかっこわるい
11デフォルトの名無しさん:2009/04/18(土) 10:24:27
Cのヘッダファイル#importしたら、idって名前のメンバがある構造体でエラーになった。
これはしょうがないのか…。
12デフォルトの名無しさん:2009/04/18(土) 16:10:41
エラーにならんよ。
13デフォルトの名無しさん:2009/04/18(土) 18:05:10
#import <objc/objc.h>
14デフォルトの名無しさん:2009/04/19(日) 22:09:48
Windowsで動く処理系ってありますか?
有ったら触って見たいです。
15デフォルトの名無しさん:2009/04/19(日) 22:51:36
これかな...
http://www.gnu.org/software/gnustep/experience/Windows.html
日本語ではあまり新しい資料はないかもしれん。とりあえず
http://journal.mycom.co.jp/special/2004/gnu/006.html
16デフォルトの名無しさん:2009/04/19(日) 23:20:09
>>15
ありがとう御座います><
早速試してみます^^
17デフォルトの名無しさん:2009/04/19(日) 23:26:10
MinGW/GCCじゃだめ?
18デフォルトの名無しさん:2009/04/20(月) 00:43:25
>>17
>>15 のリンク先は MinGW ベース。

他には、Yellow Box for Windows というのを Apple が昔作ってたから、
ebay とかで粘ってると手に入るかもしれません。
http://www.shawcomputing.net/resources/apple/os_pictures/yb2k/
Rhapsody DR2 もしくは WebObjects 4.5 というのに付いてきます。
19デフォルトの名無しさん:2009/04/20(月) 01:23:36
Cocotron は?
20デフォルトの名無しさん:2009/04/20(月) 01:32:35
Cocotron は XCode でのクロスコンパイルが前提の気がする...
つかったことなくてサイトの説明を読んだだけなので何とも言えませんが。
21デフォルトの名無しさん:2009/04/20(月) 02:27:54
>>20
俺も採用例FileMagnetのWinクライアントぐらいしか知らないな
用途によってはREALBasicとかも検討すべし>>14
ただ遊びたいなら話は別だが
22デフォルトの名無しさん:2009/04/20(月) 02:55:55
>>21
>用途によってはREALBasicとかも検討すべし
REALBasic は Objective-C ではないのでは???
23デフォルトの名無しさん:2009/04/20(月) 10:30:20
>>22
WIn/Mac両対応のソフトウェアを作るという前提での話
どうももう一回読んでみると>>14はただObjective-Cの処理系で遊びたかっただけのようだから的外れな指摘だな

たしかLinux系にはgccでobjective-cのコンパイラは提供されていたような...
数度インストールオプションで見た覚えがある
24デフォルトの名無しさん:2009/04/20(月) 10:42:47
荻原本買って勉強中だけどこれが初プログラムだからどーにもな〜。
やり始めて2週間だからしゃーなか
25デフォルトの名無しさん:2009/04/20(月) 15:58:31
初プログラミングなら、荻原本でいきなりObjective-C叩くより、
楽しいCocoa辺りのコードを特に理解せず書いて動かして学んでいく方が進み早いんじゃないかな
26デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/04/20(月) 20:16:26
ええと追記です。id だからオブジェクトを返すものしか駄目なのか、とも考えた
のですが、double を試す前にBar の変数に char *name とした場合には、
設定したchar* が返って来たので、やってみた次第です。
int の場合にも設定した値が返ってきました。で、今floatでやってみたのですが、
double と同様、駄目でした。float なら値が返ってくる事を期待したのですが…
28デフォルトの名無しさん:2009/04/20(月) 20:48:49
キャストしたらどうよ?

double(*numImp)(id,SEL) = [Bar instanceMethodForSelector:@selector(num)];
double num = (*numImp)(hoge, @selector(num));
29デフォルトの名無しさん:2009/04/20(月) 21:06:51
それが正解だよね

IMP の定義は typedef id (*IMP)(id, SEL, ...);
だから、id 以外を返す場合はキャストして使わないといけない。
30デフォルトの名無しさん:2009/04/20(月) 21:16:19
>>28
できました!なるほどー、IMPをさらに関数ポインタにしてしまえば良いんですね。
勉強になりました、ありがとうございます。

あと>26の「num には hoge が入っていた」というのはたまたま入っていた
だけのようでしたので訂正します(汗
31デフォルトの名無しさん:2009/04/20(月) 21:26:59
>>29
ありがとうございます。キャストが必要だろうと思い、そのまま
double value = (double) numImp(hoge, @selector(num));
とかやっていたので、コンパイラに怒られていたんです。Cそのものの経験が
無いのでよく分からずにやってました。関数ポインタのキャスト、ってのが
目から鱗でして (^^;;
32デフォルトの名無しさん:2009/04/21(火) 14:35:51
>>25
楽しいCocoa買ってみます
ありがと
33デフォルトの名無しさん:2009/04/22(水) 17:11:46
KVC準拠を意識して組んでる人いる?
34デフォルトの名無しさん:2009/04/22(水) 22:32:46
普通に書いてればそうならない?
35デフォルトの名無しさん:2009/04/23(木) 13:08:57
GUIならバインディング使うだろ
バインディング使うにはKVCで書くだろ

普通に書いてりゃkvcで書くと思う
36デフォルトの名無しさん:2009/04/23(木) 13:20:20
>>33 は他の言語からうつってきたばかりで、
つい getter を -(NSHage*)hoge でなくて
-(NSHage*)getHoge とかいてしまうからそう思うんではなかろうか。
37デフォルトの名無しさん:2009/04/23(木) 22:17:46
getだったら
- (void)getHoge:(NSHoge *)
とか言う形? 違和感有るけど
38デフォルトの名無しさん:2009/04/24(金) 08:08:48
>>37
-(void)getHoge:(NSHoge**)
でないと駄目だとおもう
39デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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 というシンボルを指します。
だからそれを初期化してやらないといけないです。
http://lists.apple.com/archives/objc-language/2006/Jan/msg00013.html
を参照してください。
4339:2009/04/28(火) 12:28:19
>>42
Thx! 試してみます.
4439:2009/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;
}
4539:2009/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デフォルトの名無しさん:2009/05/13(水) 08:16:25
オブジェクト自分で作ったら、リリースせんといかんと思うけど、
そのとき、例えば、AppleのCocoaだと、

NSObject obj = [[NSObject alloc] init];
[obj autorelease];

って出来るよね?
このautoreleaseって、要するにGCみたいなもんなの?
47デフォルトの名無しさん:2009/05/13(水) 11:26:33
ちがう。autorelease は NSAutoreleasePool に登録する際に使う。
NSAutoreleasePool は drain/release を受けたときに登録してある
インスタンス全てに release を送るだけ。受けなければそのまま放置。
とりあえず、メモリ管理プログラミングガイドを理解しよう。
ttp://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
それでも分からないなら、新Mac板 Cocoaはさっぱりスレ の方へどぞ。
http://pc11.2ch.net/test/read.cgi/mac/1241407525/
48デフォルトの名無しさん:2009/05/13(水) 13:50:54
>>46
C言語の自動変数に近い。イベントループ開始でAutoreleasePoolが確保
されて、autoreleaseにするとそこに登録される。イベントループ終了で
AutoreleasePoolが解放されて、autoreleaseで登録したオブジェクトは
全てreleaseされる。だから自分でreleaseの手間が省ける。
GCはどこからも参照されていないオブジェクトを見つけて勝手に解放する
機能
49デフォルトの名無しさん:2009/05/13(水) 20:21:28
メモリ管理プログラミングガイドは日本語版もあるよ
http://developer.apple.com/jp/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
50デフォルトの名無しさん:2009/05/13(水) 20:43:38
あ、日本語のはログインしないと見れないのかな、ごめん
51デフォルトの名無しさん:2009/05/16(土) 23:51:15
Xcode で、Objective-c (*.m)のクラスから 別の C++(*.cpp) ファイルの
グローバル関数を呼ぼうとすると、下記のようなエラーが出てしまいます。

Linking xxx/xxx
-[xxx xxx:] in xxx.o

Objective-Cのクラスから、C++のグローバル関数を呼べなかったようです。
*.m ファイル内に作ったローカル関数は呼べたのだけど・・・

52デフォルトの名無しさん:2009/05/17(日) 00:18:26
extern "C"
53デフォルトの名無しさん:2009/05/17(日) 01:42:10
トン
54デフォルトの名無しさん:2009/05/29(金) 19:54:09
class Test
{
Test(){}
virtual ~Test(){}
};

これコンパイルすると、
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test'
ってエラー出ます
何が悪いんですか?
55デフォルトの名無しさん:2009/05/29(金) 20:17:13
うちでは問題無かったよ。セミコロン付けろゴルァって事かな?

% cat foo.cpp
class Test
{
Test(){}
virtual ~Test(){}
};
% g++ -c foo.cpp
% ls foo.o
foo.o
56デフォルトの名無しさん:2009/06/01(月) 15:46:54
>>55
いろいろ試しましたが、コンパイル通りません…
自分はiPhoneのOpenGL ESベースのアプリでやっているのですが、それがまずいんでしょうか
プロジェクト作成して、Other SourcesフォルダにTest.hを作成して、>>54のコードを記述し、それをmain.mに#importしてるのですが、エラーになります
.mmで定義するようにしないといけないのかなと思い、Test.mmを作成してコンストラクタ・デストラクタの定義をそちらに移してもだめでした

できればコンパイルを通すまでどのような手順で行っているのか教えてください
57デフォルトの名無しさん:2009/06/01(月) 16:13:50
before 'Test'
だから、クラス定義に問題があるんじゃなくて、
その前、恐らく includeファイル内などに問題がありそう。
58デフォルトの名無しさん:2009/06/01(月) 16:33:57
ヘッダーファイルの「情報を見る」とファイルタイプが.h,.cになっていたので、.h.cppに変えました。
が、それでもダメでした。これでいけると思ったんだけどなあ。
この問題ってXcodeスレで聞いた方がいいんですかね?
59デフォルトの名無しさん:2009/06/01(月) 17:25:52
呼び出し側のmain.mの「情報を見る」でファイルタイプを.c,.objcから.cpp,.objcppに変えたら動きました。
ここら辺説明してるサイトが全然見あたらなかったですよ…
2chのXcodeスレでかろうじて類似の質問があって助かった
60デフォルトの名無しさん:2009/06/01(月) 21:05:51
System.Generic.List<T>に相当する
記述方式ってないのでしょうか

毎回毎回別々のオブジェクト書くの面倒です
助けてください
61デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/01(月) 22:43:19
>>61
それなんてJavaですかw
iPhoneでもObjective-C++できるのですか
63デフォルトの名無しさん:2009/06/01(月) 22:44:52
C++のテンプレートはオブジェクト指向的じゃないとよく批判されるがな
64デフォルトの名無しさん:2009/06/01(月) 22:46:14
>>62
iPhone でも Obj-C++ できますよ
というか main.m を cpp モードにした時点で Obj-C++ になってます
65デフォルトの名無しさん:2009/06/01(月) 22:52:52
>>59
まさかgccでコンパイルしてたとか?
g++じゃなくて。
66デフォルトの名無しさん:2009/06/01(月) 23:07:28
>>65
そういうことだったんじゃないの。XCode (Mac の IDE) からだと
ファイルの言語設定でコンパイラが変わるので。
まあ確かにそのあたりはやっている人には当たり前すぎて、
解説書にもつい書き忘れてしまう... ということかも知れない
67デフォルトの名無しさん:2009/06/02(火) 23:24:34
GUI以外の部分で
コールバックってどうやって実現すればいいですかね?
68デフォルトの名無しさん:2009/06/02(火) 23:27:45
>>67
それだけで貴女以外のひとがなにが聞きたいかわかると本当におもってますか?
僕らはエスパーじゃないよ。
69デフォルトの名無しさん:2009/06/02(火) 23:29:58
ネットワーク処理をコールバックで処理したいの
70デフォルトの名無しさん:2009/06/02(火) 23:33:15
さっぱり見えてこないんだけど、Objective-Cは関係あるの?
71デフォルトの名無しさん:2009/06/02(火) 23:39:50
>>70
C#とC++ならコールバックあるでしょ
なんでObjective-Cには無いの?

元のソース移植できないじゃん
72デフォルトの名無しさん:2009/06/02(火) 23:51:43
メソッドのポインタ取り出したいってこと?
73デフォルトの名無しさん:2009/06/03(水) 00:03:39
>>71
何で無いと思うの? 無い訳無いじゃん。
74デフォルトの名無しさん:2009/06/03(水) 00:09:42
じゃあこれと等価の記述を教えていただけないですか?

double g( double x, double (*f)(double) )
75デフォルトの名無しさん:2009/06/03(水) 00:11:28
それでいいじゃんw
76デフォルトの名無しさん:2009/06/03(水) 00:21:34
77デフォルトの名無しさん:2009/06/03(水) 00:27:49
基本は>>76で、遅いと思ったらこっち。

http://journal.mycom.co.jp/column/objc/022/index.html

でもネットワーク処理なら C で kqueue とか libevent とか使ったら良いのに。
78デフォルトの名無しさん:2009/06/03(水) 00:32:51
- (double)g:(double)x callback:(double(*)(double))f;

こういう事かな?
79デフォルトの名無しさん:2009/06/03(水) 01:01:43
>>71
いや、C++ のソースがあるなら Obj-C++ つかえば
なにひとつ移植しなくて済むでしょ。何を考えているんだ?アホ?
80デフォルトの名無しさん:2009/06/03(水) 21:16:49
>>74
それそのまんまで何が問題なんだ?w
81デフォルトの名無しさん:2009/06/03(水) 23:54:09
わかりにくいね
82デフォルトの名無しさん:2009/06/03(水) 23:58:03
typedefすればいいじゃん。
83デフォルトの名無しさん:2009/06/03(水) 23:58:09
Obj-Cって型が解らなくなった場合に
チェックする方法ってありますか?
84デフォルトの名無しさん:2009/06/04(木) 00:41:19
正確には無いと思うよ。
85デフォルトの名無しさん:2009/06/04(木) 01:24:04
86デフォルトの名無しさん:2009/06/04(木) 01:43:55
>>83
その型ってのは、変数の型? それとも、オブジェクトのクラス?
Objective-Cは変数に型がない(idでかまわない)言語なだけですよ(プリミティブ型は除きますが)
型キャストを許す言語であれば、(変数の)型が分からなくなる事はありえるのでは?
変数の型がどうであれ、オブジェクトが自分自身の型/クラス、もしくは受けられるメッセージを知ってれば問題ないって考え方です
87デフォルトの名無しさん:2009/06/04(木) 01:51:14
オブジェクトの型が id なんじゃないの?
プリミティブがそれぞれの型を持っているのと同じで。
88デフォルトの名無しさん:2009/06/04(木) 04:23:39
>>87
idは構造体のポインタのtypedefだからそうとも言えるけど、それは変数に型のあるCという言語での実装の話しで...なんというか微妙な感じもする。
idには特別意味もないし、JavaとかC++の縛りのきつい「型/クラス」と、idは別の概念、別のくくりにした方がいいんではないかと。
89デフォルトの名無しさん:2009/06/04(木) 22:58:35
何なのこの投げっぱなし質問
90デフォルトの名無しさん:2009/06/06(土) 00:15:09
interface作ったときにメモリ開放メソッドは
どのように記述するのが一般的なのでしょうか

91デフォルトの名無しさん:2009/06/06(土) 02:39:56
@interface ... @end内にデストラクタをどう宣言するかという話かな?
普通はNSObjectで宣言されているdeallocメソッドをオーバーライドします。
(だから@interfaceにはとくに何も書きません。)
メモリ管理については
http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html
をどうぞ。
92デフォルトの名無しさん:2009/06/06(土) 20:48:46
独自にObjを定義したとして
[[Obj alloc] initHoge : arg];

allocと組み合わせて利用するinitHogeを定義するとき
定義は以下が一般的なのでしょうか?

- (id) initHoge : (NSString *) val;
93デフォルトの名無しさん:2009/06/06(土) 22:03:25
XmlTextWriterみたいなクラスってないですか?
94デフォルトの名無しさん:2009/06/07(日) 00:24:29
>>93
Obj-C スレにきて、返事をする人が .NET を知っていると仮定するとはいい度胸をしている。読み手のことを考えて、
「.NET ならこれこれができるこれこれというクラスが
あるんですけど、(ドキュメントは http:// ... に ...)」とか
質問の際に書けんものかね?

とりあえず NSXMLDocument をつかえば規格に準拠した XML データは
つくれますよ。かなりメソッド名が冗長だけど。
手で文字列をつなぎ合わせて XML にするよりは断然いいです。

あと、これ以上は Mac 板の iPhone プログラミングスレか
Cocoa スレに行ったほうがいいとおもいます。ここは一応 Obj-C 言語に特化した
過疎スレなので。
95デフォルトの名無しさん:2009/06/07(日) 01:58:33
>>93みたいな手合いは相手する必要ないよ。
96デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/09(火) 23:19:50
何処が違うのかさっぱりわからん
98デフォルトの名無しさん:2009/06/09(火) 23:47:19
>[dic setObject:[[Hoge alloc] init] forKey:@"hoge"];
て書いたら、 setObject:に渡したHogeインスタンスを後でreleaseする手段が無くなるのでは
上の書き方なら [hoge release]て書けるけど。
99デフォルトの名無しさん:2009/06/10(水) 02:47:32
>>98
なあにobjectForKey:@"hoge"で取り出してreleaseすればいいさ
100デフォルトの名無しさん:2009/06/10(水) 07:22:05
[dic setObject:[[[Hoge alloc] init] autorelease] forKey:@"hoge"];
じゃないとだめ
101デフォルトの名無しさん:2009/06/10(水) 16:29:35
改行したいときって何を書けばいいんでしょうか?
\nでも\rでもダメだったんですが。
102デフォルトの名無しさん:2009/06/10(水) 17:05:39
(option + ¥) n
103デフォルトの名無しさん:2009/06/10(水) 18:15:29
>>102
ありがとうございます
104デフォルトの名無しさん:2009/06/10(水) 23:35:38
>>99
それ今の仕様だとメモリリークするけど?
105デフォルトの名無しさん:2009/06/11(木) 00:01:56
>>104
今の仕様って何?
GCのこと?だとしたらGCは仕様じゃなくてオプションだと思うんだが
106デフォルトの名無しさん:2009/06/11(木) 00:07:37
>>105
どっちにしてもコレクションに入れたものを
objectForkeyで取り出して開放してもリークするだろ
107デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/11(木) 01:14:31
ふーん
110デフォルトの名無しさん:2009/06/11(木) 01:20:05
>>109
ふーん、じゃなくてさ
111デフォルトの名無しさん:2009/06/11(木) 22:25:41
あーそうかい俺が悪かったよ

謝ればいいんだろゴラぁ
112デフォルトの名無しさん:2009/06/11(木) 22:39:43
謝ってないんだけど
113デフォルトの名無しさん:2009/06/11(木) 22:43:33
Cocoaが分からないけど興味があるだけの俺みたいなのもいる訳だが、
結局のところ>>107,108が仕様として正しいということでFAですか?
114デフォルトの名無しさん:2009/06/12(金) 00:02:52
それ以前に作法として完全に間違っているので気にする必要はありません。
>>99はネタ。
115デフォルトの名無しさん:2009/06/12(金) 00:04:42
そもそもNSMutableDictionaryって非推奨のAPIだろ
NSMutableDictionaryに入れるとメモリリークするし
116デフォルトの名無しさん:2009/06/12(金) 01:00:46
>>115
んなわけねーだろ。retain count を勉強し直してこい。

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

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


コピペ新聞 - 調べ物のコツ
http://copipe.info/archives/9084

ということですか。
117デフォルトの名無しさん:2009/06/12(金) 01:56:44
>>116
そのメソッド頂いたっ!
118デフォルトの名無しさん:2009/06/12(金) 02:29:23
>>114
いやネタっつうか、できるできないで言うならできるという意味で書いた
そりゃ普通こんな書き方はしないけど
119デフォルトの名無しさん:2009/06/12(金) 05:54:02
retain/releaseはObjective-Cと関係ないけどなんでここでやってんの?
Cocoaスレでやれば良いのに。
120デフォルトの名無しさん:2009/06/12(金) 07:04:39
OpenStepで規定されてるしここでいいんでねいの。
121デフォルトの名無しさん:2009/06/12(金) 07:34:48
正しい書き方は一体どれなの?
122デフォルトの名無しさん:2009/06/12(金) 07:56:37
そういう大事なことはこんなところで断片的な情報をかき集めるより書籍かなにかで
体系だった解説をきちんと読むべきだと思う。
Cocoa周りはアップルが出しているリファレンスがしっかりしてるから>>91
リンク先でも読むといいよ。
123デフォルトの名無しさん:2009/06/12(金) 08:42:14
ぶっちゃけOpenStep系以外のObjCフレームワークだってほとんどretain/release採用してるでしょ
124デフォルトの名無しさん:2009/06/12(金) 10:23:46
ここで出てるような単純なサンプルならいいけど、
一般にはオブジェクトを入れてから取り出すまでに、別スレッドからdictionaryをいじられて、別のオブジェクトをreleaseしてしまう可能性がある。
まあ作法として避けておくのが無難。
125デフォルトの名無しさん:2009/06/12(金) 12:34:39
あんなコード書いてたらどうしようもない馬鹿だと思われることは確実。
126デフォルトの名無しさん:2009/06/12(金) 13:14:39
>>96のことな
127デフォルトの名無しさん:2009/06/12(金) 14:30:20
>>126
すまん、初心者でよくわからんのだが、
>>96のやり方だと何がまずいのか教えてくれ。
128デフォルトの名無しさん:2009/06/12(金) 15:34:59
>96 のその部分だけ見れは、前者だろうが後者だろうがメモリリークする

実は前者はこの後のコードでリリースしてます、とか
オーナーシップとかしらね、後でリリースできれば良いんだよ、
とかって言い出さない限り。
129デフォルトの名無しさん:2009/06/12(金) 18:59:21
autoreleaseされたインスタンスを返すfactory methodを作るのが普通の感覚でしょ。
そこに思い至らない時点で実力は推して知るべしだから、GC使うかリークなんて
気にしなくて良いよ。リークが問題になる規模の物はどうせ作れないし、多分他にも
問題山積で誰も気が付かない。
130デフォルトの名無しさん:2009/06/12(金) 23:38:40
OS3.0のiPhoneでも
autoreleaseは果てしなく遅いぞ
131デフォルトの名無しさん:2009/06/13(土) 00:41:02
iPhoneでGCって性能的にやっぱ厳しいのかな
132デフォルトの名無しさん:2009/06/13(土) 10:11:29
OS X でも GC は案外リソース喰う気がします
Core Data で GC つかったフリーウェアつくってますが、使っていると
時々 CPU 使用率があがるのは何故かと問い合わせがあって、
しらべてみたら GC がかなり頑張ってるように見えました。
133デフォルトの名無しさん:2009/06/17(水) 19:24:12
http://journal.mycom.co.jp/column/objc/019/index.html
こちらの方法で、特定のクラスのメソッド一覧を取得しようとしたのですが、
Objective-C 2.0でobjc_method_list構造体の構造が変わってしまっているようで、このままでは取得できませんでした。
Objective-C 2.0における、objc_method_list構造体もしくはそれに変わる構造体について、知っている方居たらよろしくお願いします。
134デフォルトの名無しさん:2009/06/17(水) 20:06:24
>>133
class_copyMetodList(Class cls, unsigned int *outCount)

なおその手のものは、Obj-C 2.0 RuntimeAPIに載ってる。
ttp://developer.apple.com/DOCUMENTATION/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html
135デフォルトの名無しさん:2009/06/18(木) 01:06:04
>>134
Runtime Referenceがあることを知りませんでした…
ありがとうございます。
136デフォルトの名無しさん:2009/06/22(月) 21:41:42
OS3.0だとNSOperationQueueにaddしたOperationが2つしか実行されなくなるんだけど実装方法変わったのかな?
137デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/26(金) 14:01:29
setterが失敗って?
予期しないオブジェクトが渡されたって事ならObjCの例外を投げるのが普通。
139デフォルトの名無しさん:2009/06/26(金) 17:29:31
あとはデリゲートで処理とか?(それも含めてならごめん)
140デフォルトの名無しさん:2009/06/26(金) 18:36:08
3. 何もしない
 本当に値がセットされてるかどうか知りたかったら getして比較しろや!

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

5. abort(3)をコール
 そんな話聞いてないです!
141デフォルトの名無しさん:2009/06/27(土) 03:26:10
これじゃだめ?
- (void)setHogeHoge:(Hoge *)aHoge error:(NSError **)error;
142デフォルトの名無しさん:2009/06/27(土) 04:02:09
>>141
KVCしたいってことだからそれじゃ駄目じゃね?

>>137
1.で問題ないんじゃない?Obj-Cのメッソドディスパッチはそんなにヤワじゃないよ。
143デフォルトの名無しさん:2009/06/27(土) 07:10:47
ええかげんなこと書くな。

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

おまいらまぬある嫁。
144デフォルトの名無しさん:2009/06/27(土) 11:52:18
それだとKVCのときだけしか通用しないよね
145デフォルトの名無しさん:2009/06/27(土) 16:22:38
KVCはNSKeyValueCodingプロトコルですでに定義されてるんだから、
BOOL返したいんなら同等の別のメソッドとして定義すればいいだけじゃん。

KVC準拠のsetterなら戻り値はvoid。
なんとかしたいなら単に例外投げればいい。
146137:2009/06/27(土) 22:24:24
んー、validate???: error:か、validateValue:forKey:error:使うのが、
ルールなんですね。
ttp://developer.apple.com/jp/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/Validation.html

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

すると、setterでobjective-cの例外投げたくなるけど、「荻原本」とか、
ttp://google-styleguide.googlecode.com/svn/trunk/objcguide.xml#Avoid_Throwing_Exceptions
見ると、objective-c例外は使うな的なことが書かれてて(両者の理由は違うけど)、悩ましい。
147デフォルトの名無しさん:2009/06/28(日) 01:01:34
>>146
Cocoa API 自体が予期せぬ引数を与えられた場合は
頻繁に Obj-C 例外投げるので、
別に自分が投げても大勢に変化ないと思いますが...
148デフォルトの名無しさん:2009/06/28(日) 15:06:59
ちょっとイニシャライザに関して、質問よろしいですか。
http://wisdom.sakura.ne.jp/programming/objc/objc7.html
ここのページの指定イニシャライザのサンプルプログラムなんですが

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

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

init自体がよく分かってないから、こういう質問してしまってるのかもしれ
ないですが、この方法は正しいのか誤ってるのか、また正しい場合は何故な
のかご教授下さい。
149デフォルトの名無しさん:2009/06/28(日) 16:03:34
init〜ではじまるメッセージは内部でinitを呼んでるはずだから大丈夫。
150デフォルトの名無しさん:2009/06/28(日) 16:28:17
え?逆じゃね?

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

指定Initializerは他のinitから呼ばれる基本部分を含んだ、共用部分。
この例では、
[Point new]
[Point alloc] init]
はどちらも、内部的にinitWithPointを呼んでいるということ。
もちろん引数は初期値を使っている。この場合は0だろうね。
151デフォルトの名無しさん:2009/06/28(日) 20:15:22
>>150
>>148はpt2の初期化のことを聞いてるんじゃね?

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

[super init]がないことに関しては、>>149の言うとおりなのかもしれんが、そうだとするとメソッド呼び出しが循環するし、そうでないとするとObject部分が初期化されていないということになるから、あまり良い実装ではない気がする。
152デフォルトの名無しさん:2009/06/28(日) 21:07:22
148です。
>>149様,>>150様,>>151様ご回答ありがとうございます。

結局はpt2ではinitを明示していないので疑問に思ったのです。
>>149様が仰っているように、メソッド名にinit〜をつければinitWithPointで
initが自動的に走る、という考えなら納得いきます。

ただ、詳解Objective-C2.0では、サンプルコードのinitWithMinという
メソッド内で[super init]と明示しているので、メソッド名に
init〜を付けただけではinitが走らないとも判断できます。

まあ・・・[クラス名 alloc] init] の形で覚えておけば問題ない所だと
思うのですが。
153デフォルトの名無しさん:2009/06/28(日) 22:43:13
>>148のコードは駄目だな。普通はこうだろう。

- (id) init {
return [self initWithPoint:0 int:0];
}

- (id) initWithPoint:(int)x int:(int)y {
if ((self = [super init])) {
self->x = x;
self->y = y;
}
return self;
}
154150:2009/06/28(日) 23:08:13
ああ理解した。
リンク先のコード見てなかったが、ひどいコードだったのね。
155デフォルトの名無しさん:2009/06/28(日) 23:42:37
148です。

>>153様、レスありがとうございます。
やっぱり>>153様のように[super init]で初期化して判定させた方がいいです
よね。ありがとうございました。
156デフォルトの名無しさん:2009/06/28(日) 23:58:33
157デフォルトの名無しさん:2009/06/29(月) 00:01:34
>>153
> - (id) initWithPoint:(int)x int:(int)y {
> self->x = x;
> self->y = y;

これってどうなの?
158デフォルトの名無しさん:2009/06/29(月) 00:07:29
銅ではありません。
159デフォルトの名無しさん:2009/06/29(月) 02:14:09
>>148
http://wisdom.sakura.ne.jp/programming/objc/objc7.html
は情報が古すぎるから初心者は読まないほうがいい
160150:2009/06/29(月) 07:49:54
インスタンス変数なんだよね?
意味府。
161デフォルトの名無しさん:2009/06/29(月) 08:22:39
148です。やはり、元の情報が古いように感じますね(後に他のページも参照
してみた感想です)。
詳解Objective-C2.0が難しすぎたんで、上記のサイトを参考にしていたんで
すが、誤字脱字が多く、たまにコーディングミスもあったりしてかえって混
乱してしまった、というのが素直な感想です。

余談ですがObjective-cってなんか楽しいですね。感覚的に、ですが。。。
162デフォルトの名無しさん:2009/06/29(月) 15:06:09
>>161
ヒレガス本を買うのが一番おすすめ。最新版の日本語訳って出たんだっけ?
英語が読めれば英語版をかうのがよし。
http://cocoadevcentral.com/
もわかりやすいよ。英語が読めれば。
163デフォルトの名無しさん:2009/06/29(月) 17:33:45
ヒレガス本の最新版の和訳は、たのみこむあたりに持ち込むしかないのだろうか…
164デフォルトの名無しさん:2009/06/29(月) 20:49:49
またまた148です。>>162様、書籍紹介どうもです。
ヒレガス本調べてみましたが、かなり評判いいみたいですね。
英語は得意ではないですが、読むこと事態に嫌悪感は無いので是非購入してみ
たいと思います。・・・まあ少々お高いのでまた来月にでも。
教えて頂いたサイトも参考にさせて頂きます。さらっと読んでみましたが図が
あって理解し易いですね!

また勉強して戻ってきたいと思います。できればアドバイスする側で!
貴重なお時間を割いて頂き、皆様には感謝致します。
165デフォルトの名無しさん:2009/06/29(月) 21:33:26
>>164
2ページに1枚はスクリーンショットがあるレベルだ。安心していい。
ナイトライダーについてWiki辺りで調べておくとなおいい。
166デフォルトの名無しさん:2009/06/30(火) 00:25:59
>>165
いや、日本人でもナイトライダーしってるだろ...
いまどきの若者はそうでもない?
167デフォルトの名無しさん:2009/06/30(火) 11:45:24
はい、マイケル
168デフォルトの名無しさん:2009/07/01(水) 07:23:05
>> 164
Safari Books Onlineで立ち読みしてみたら?
169デフォルトの名無しさん:2009/07/02(木) 21:27:59
fscanfを使いたいのですが、どうしたらいいですか?
170デフォルトの名無しさん:2009/07/02(木) 21:38:19
そのまま使えば良いんじゃない?
171デフォルトの名無しさん:2009/07/06(月) 23:34:28
Objective-Cは2次元配列を扱えない糞言語である。
172デフォルトの名無しさん:2009/07/06(月) 23:37:59
CとC++は?
173デフォルトの名無しさん:2009/07/07(火) 00:12:11
int x = 20, y = 50;
foo[x][y];

何が不満なの?
174デフォルトの名無しさん:2009/07/08(水) 00:07:26
放っとけ。
175デフォルトの名無しさん:2009/07/08(水) 00:09:45
int hoge[10][10]
こいつをキャストする時って

int(*)[10] get()とかでよかったんだっけ?
C99の仕様と同じ?
176デフォルトの名無しさん:2009/07/08(水) 01:04:37
malloc系使わずに
int x = 20, y = 50;
int hoge[y][x];
ってできる?
177デフォルトの名無しさん:2009/07/08(水) 01:14:16
>>176
できる。C99。
178デフォルトの名無しさん:2009/07/08(水) 16:30:47
179デフォルトの名無しさん:2009/07/08(水) 19:27:02
180デフォルトの名無しさん:2009/07/09(木) 00:31:15
>>179
Cocoa を Obj-C で組んでいると block が非常に欲しくなるのは事実なのだが、
C レベルで言語仕様を追加するのはいかがなものかという気もしないでもない
181デフォルトの名無しさん:2009/07/16(木) 09:05:12
いつかObjective-C++0xも作られるのかね
182デフォルトの名無しさん:2009/07/16(木) 09:10:34
なんで?
いつかって0xということは今年中なわけだけど
そんな情報入ってないぞ
183デフォルトの名無しさん:2009/07/16(木) 10:28:56
ていうかObjC++ってObjCを普段CとしてコンパイルしてるところをC++としてコンパイルしてるだけだから
gccがC++0xに対応すればその瞬間にObjC内でもC++0xが使えるわけだが
184デフォルトの名無しさん:2009/07/16(木) 11:05:40
185デフォルトの名無しさん:2009/07/29(水) 00:40:41
Objective-CってQueueクラスってないですよね
なんでですか?
186デフォルトの名無しさん:2009/07/29(水) 05:29:57
NSMutableArrayでまかなうから。
あんま好きじゃないけど
187デフォルトの名無しさん:2009/07/29(水) 07:23:35
>>186
それは性能が激遅になってありえないですね
STLの50分の1しか性能ないのにありえないじゃないですか?
188デフォルトの名無しさん:2009/07/29(水) 09:19:59
>>185
Foundationのコレクションて、アプリケーションドメインで必要なものじゃなくて、
APIとのデータ交換に必要なものでしょ。
アプリ内でパフォーマンスを稼ぎたいなら、stlでもboostでも使えばいい。
データ交換には、タプル、配列、ハッシュの三種があれば十分。
189150:2009/07/29(水) 23:21:15
190デフォルトの名無しさん:2009/07/29(水) 23:29:15
自分はCFMutableArrayに構造体のポインタぶちこむだけで
普通に満足なんだけど、STLってそんなに早い?

CFで固めると、void*埋め込めるしオブジェクトのretain/release
すっとばせるし、楽だと思うんだけど。
191デフォルトの名無しさん:2009/07/29(水) 23:39:16
間違えた

NSMutableStringを継承したクラスを作りたいのですが
その中で、initWithString:を継承先のクラスに適合させるには
どうやってラップすればいいれしょうか
192デフォルトの名無しさん:2009/07/30(木) 00:42:23
{ if(self=[super initWithString:string]){} return self; }
193デフォルトの名無しさん:2009/07/30(木) 22:47:45
NSMutableArrayなどのコンテナクラスに
オブジェクトを突っ込んだ後

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

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

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

どうしても異なるクラス、親、先祖を入れたいのであれば、
全てのクラスにプロトコルを採用し、共通の操作を行える様にするのが落としどころではないでしょうか?
196デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/31(金) 07:57:30
一億回呼ぶのが普通という基準がよくわからん
198デフォルトの名無しさん:2009/07/31(金) 08:03:16
チェックが上手くできず無限ループに入ったって言いたいとか?
199デフォルトの名無しさん:2009/07/31(金) 11:32:36
>>193を読んで初心者だと思い安易な回答をしてしまった俺が悪かったよ
200デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/31(金) 14:45:42
この場合は型判定を使うのが間違いだといってんだろうよ
204デフォルトの名無しさん:2009/07/31(金) 19:43:44
呼び出す側で判定して分岐するより、呼び出される側に共通のプロトコルを採用してポリモーフィズム
205デフォルトの名無しさん:2009/08/01(土) 00:17:53
型判定が最後の手段だというのは極端かもしれないけど、
それにべったり依存して型判定だらけになったプログラムも
オブジェクト指向らしくないと思う。
まずは>>200,204のアプローチで設計し、
どうしようもない時だけ型判定で逃げるのが正道では。
206デフォルトの名無しさん:2009/08/01(土) 01:31:27
>>202
>Obj-C触り始めて間もないのかな?isKindOfClass: は全く、全然、断じて、1_も、
>最後の手段ではない。むしろ型判定の、最初の手段といっても過言ではない。
207デフォルトの名無しさん:2009/08/01(土) 02:53:12
ObjC的なオブジェクト指向の思想ではrespondsToSelector:使うのが自然のように思える。
208196:2009/08/01(土) 13:22:20
>>200
では、基底クラスを設けないで@protocolで
doSomthingを定義し、それを実行するのは
Obj-C的にはどうでしょうか?


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

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

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

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

あと、スピードが気になったら Instrument 等でスピードを実測して、
プログラムのどこの部分で実際に時間がかかっているかチェックしましょう。
自分の勝手な思い込みで、実際には時間がかかってないところを
最適化してもしかたがないので。
210デフォルトの名無しさん:2009/08/01(土) 15:36:01
>では、基底クラスを設けないで@protocolで
>doSomthingを定義し、それを実行するのは
>Obj-C的にはどうでしょうか?
別に基底クラスをつくるのと変わらないです。
R* x のかわりに id<R> x になるだけです。
211デフォルトの名無しさん:2009/08/11(火) 16:06:51
Tiger環境なんだけどインタフェースビルダーが旧式だと知って絶望した…
豹買ってもいいけどもうすぐ雪豹でるし…
でもそうしたら休暇が終わっちまう!
212デフォルトの名無しさん:2009/08/11(火) 18:12:36
情報の豊富な彪で覚えるまで雪豹は暫く放置で良いじゃん。
213デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/08/14(金) 17:01:01
あ、勘違いしていました。
CのsuperであるBのmethod2で更にsuperであるAを呼び出していました。
継承でoverrideを繰り返してもsuperで呼び出せるのはその一つ前でいいんですよね。
217デフォルトの名無しさん:2009/08/14(金) 17:04:27
>>216
そうだよ。
218デフォルトの名無しさん:2009/08/15(土) 00:30:27
>>213
本題と関係ないが、
#import <Foundation/NSObject.h>
とわざわざ細かく指定するとかえってコンパイルが遅くなりかねないよ。
プリコンパイルドヘッダが使えなくなるので。
#import <Foundation/Foundation.h>
にしておきましょう。

あと printf じゃなくて NSLog(@"hogehoge") をつかうのが一般的じゃないかな。
219デフォルトの名無しさん:2009/08/15(土) 19:15:23
>>218
萩原Obj-C(1.0のやつ)をはじめたばかりで、本のサンプルみながらやっているもので。
NSLogは索引をみると後半で出てきますが、まだそこまで到達していないです。(今Ch04あたり)
本当は今ならObj-C 2.0をやるべきなのでしょうけれど、実行環境がまだTigerなので1.0でないとたぶん本のサンプルが動かないと思うので1.0の本を使っています。
220デフォルトの名無しさん:2009/08/16(日) 01:05:12
>>219
なるほど。まあ日進月歩の世界で本はすぐに古くなるけど、がんばってね!
221sage:2009/08/16(日) 08:09:19
>>218
シンプルにコンソールに出力するならprintfでいいと思うけど。
GUIなアプリケーションの動作ログという意味なら、NSLogだが。
222デフォルトの名無しさん:2009/08/17(月) 15:51:21
正直どっちでもいいけど、
%@ を後々使うかも、と考えると
最初からNSLogにしておいた方がいいかなって思う。
223デフォルトの名無しさん:2009/08/17(月) 15:58:09
時間がコンソールに出力されるのが邪魔な時はprintfだけど、大体はNSLogかな
224デフォルトの名無しさん: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デフォルトの名無しさん:2009/08/23(日) 18:28:03
u=user
s=sys
226デフォルトの名無しさん:2009/08/23(日) 19:21:53
つまり見やすくなったんだね
227デフォルトの名無しさん: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デフォルトの名無しさん:2009/08/27(木) 12:27:20
Cでは定数じゃないと初期化できないはず。
最初に使うときに初期化すりゃいいんじゃね?
230デフォルトの名無しさん:2009/08/27(木) 12:32:14
クラス変数をその方法で持たせることは出来る。
このクラス変数はnullで初期化しておいて、
最初のインスタンス生成(init)のときにnullかどうかみて
初期化するのが普通かな。

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

すいません。お願いします
232228:2009/08/27(木) 12:39:27
>>229,230
あ、そうか
initilizeでしたっけ?あれで初期化すればいいんですね
ありがとうございます
233デフォルトの名無しさん: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デフォルトの名無しさん:2009/09/02(水) 17:57:49
retainCount の値なんか気にしているやつはアホです
236234: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デフォルトの名無しさん:2009/09/02(水) 18:36:47
プールはどこにある
238234:2009/09/02(水) 19:04:07
>>237
ありがとうございます。

プール?

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

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

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

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

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

そんな仕様はない。
240デフォルトの名無しさん:2009/09/02(水) 20:41:49
>>236
最後のNSLogで存在しない(解放済み)オブジェクトにメッセージを送っているからエラーが出る。
241デフォルトの名無しさん:2009/09/02(水) 20:44:55
retainCountなんてメンバ変数は存在しないし
NSMutableStringはtoll free bridgeになってるから実体はCFMutableStringでしょ。
242234: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デフォルトの名無しさん:2009/09/02(水) 22:29:30
MacsBugみたいなアセンブリレベルでできるデバッガってしらない?
実行中のコードをデバッグできるやつ。
244デフォルトの名無しさん:2009/09/02(水) 22:32:41
TMON
245デフォルトの名無しさん:2009/09/02(水) 22:59:37
TMONが見つからない。
どこにいけばある?
246デフォルトの名無しさん:2009/09/02(水) 23:24:56
遠い昔・・・
247デフォルトの名無しさん:2009/09/02(水) 23:55:39
そんな
少年の日の心の中にいた青春の幻影
では困るのだけど。
248デフォルトの名無しさん:2009/09/03(木) 10:07:49
>>243
マルチ乙
249デフォルトの名無しさん: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 をきちんとしていたら
問題はないようになってます。
250242:2009/09/05(土) 21:30:20
>>249
レスありがとうございます

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

とりあえず、先へ進もうと思います。
251196:2009/09/06(日) 22:10:26
Obj-Cって
継承階層増えるだけでどれくらい
オーバーヘッドあるのですか?
252デフォルトの名無しさん:2009/09/06(日) 23:16:09
2cmくらい。
253デフォルトの名無しさん:2009/09/07(月) 10:47:39
それはひょっとしてギャグで言ってるのか
254デフォルトの名無しさん:2009/09/07(月) 13:05:58
>>251
ランタイムの実装次第じゃない?
255デフォルトの名無しさん:2009/09/07(月) 23:50:03
>>251
計測してみたら?
256デフォルトの名無しさん: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デフォルトの名無しさん:2009/09/10(木) 14:01:44
- (void)_ptr{ //関数取得
return (*_ptr)();
}
- (void)set_ptr:(void)(*hoge)() //関数セット
{
void _ptr = hoge
}
じゃ駄目なの?
259デフォルトの名無しさん:2009/09/10(木) 14:02:43
ごめん、最後のvoidいらないや。
260デフォルトの名無しさん: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デフォルトの名無しさん:2009/09/10(木) 19:31:49
萩原1.0のコードを本見てコメントまで正確に打ち込んでいたら
warning: multi-line comment
に嵌った・・・
能で改行するなよぅ。
262デフォルトの名無しさん:2009/09/10(木) 23:27:19
知らんがな
263デフォルトの名無しさん: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デフォルトの名無しさん:2009/09/12(土) 01:21:14
「うまく代入できません」
↑ダメな質問の例
266デフォルトの名無しさん:2009/09/12(土) 01:45:07
>>264
デバッガを使えるようになりましょう。
267264:2009/09/12(土) 03:11:05
すみません、根本的に何かが違ったようです。
出直してきます。。。
268デフォルトの名無しさん:2009/09/12(土) 11:11:44
デバッガの使い方ってアップルからドキュメント出てますか?
269デフォルトの名無しさん: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デフォルトの名無しさん:2009/09/15(火) 03:17:02
プロパティのsetter semanticsがassign(デフォルト)だとそうなんのかね?
272デフォルトの名無しさん:2009/09/15(火) 13:27:10
NSString をプロパティにするときは copy にしなきゃダメだろ、常識的に考えて。
273デフォルトの名無しさん:2009/09/15(火) 14:23:09
どういう常識?
274デフォルトの名無しさん:2009/09/15(火) 14:53:09
NSMutableString が渡されたときに外部で書き換えられたらこまるから、GC使ってるときでもcopyにしておいたほうがいい、場合もあるかもしんない。
275デフォルトの名無しさん:2009/09/15(火) 16:57:11
NSArrayだとどうするんだろう?
自力DeepCopy?
276デフォルトの名無しさん:2009/09/15(火) 17:10:05
そこは状況に応じてだろJK
参照を保持させたいのか、それともインスタンスを複製して保持させたいのか、だろ?
277275:2009/09/15(火) 18:31:34
>>272
これに対してだけど?
278デフォルトの名無しさん:2009/09/15(火) 19:32:51
>>277
そこは状況に応じて、だろ。
279デフォルトの名無しさん: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デフォルトの名無しさん:2009/09/15(火) 22:40:53
>>280
自分で明示的にpool作ってないんならイベントループ終了時にそのループ内でのプールが解放される
282デフォルトの名無しさん:2009/09/15(火) 22:49:35
>>281
そう!まさに、そのイベントループとやらがようわからんのです。。。
283デフォルトの名無しさん:2009/09/15(火) 23:16:51
>>279
>get、setメソッドを使わないと、=だとオブジェクトの参照が
>代入されるだけだからなぁ。

昔はそうだったっけ
284デフォルトの名無しさん:2009/09/15(火) 23:22:29
>>283
えっ、いまはちがいまするか?
285デフォルトの名無しさん:2009/09/15(火) 23:25:23
>>284
Objective-C 2.0 以降しか知らないけど、
obj.prop = hoge は [obj setProp:hoge] と同義。
286デフォルトの名無しさん:2009/09/15(火) 23:48:58
>>285
へー、そうなんだ。
勉強になった。
ただ、知らないと、逆に参照渡ししたいときとかハマったりしそう。。
それとも、プロパティの時に限って、=がアクセッサメソッド呼び出し
で実装してくれるのかな?
287デフォルトの名無しさん:2009/09/16(水) 00:12:06
プロパティでドット構文使った時だけだよ
てかなんでみんなCocoaスレでやらないのw
288デフォルトの名無しさん:2009/09/16(水) 00:14:30
@selector(func_name)って、Cでいう関数ポインタと同じようなもん?
(これもCocoaスレでやる話?w)
289デフォルトの名無しさん:2009/09/16(水) 00:47:07
>>286
いやいやそうじゃなくて、そもそもクラスCにインスタンス変数x があったときに
C* c=...
c.x=
は(xがプロパティでなければ)文法エラーだから。cはポインタだから、やるにしても
c->x=
でしょ。曖昧さはないです。
290デフォルトの名無しさん:2009/09/16(水) 00:54:45
>>289
なるほど。
確かにObjective-Cのクラスのメンバにはc.xみたいにはアクセス
できないよねprivateメンバじゃなくても
c->xになる。

で、ごめん、質問なんだけど、プロパティって何だっけ?w
291デフォルトの名無しさん:2009/09/16(水) 09:42:48
>>290
ttp://e-words.jp/w/E38397E383ADE38391E38386E382A3.html

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

Objective-C のセレクタは、どのようなクラスあるいはインスタンスのメソッドでも名前で指示する
ことができる(実体は文字列)。
294デフォルトの名無しさん:2009/09/16(水) 20:03:40
>>291
ggrksって感じですまんかった。
んで、プロパティって、つまりはメンバ変数のことだとおもうけど、
そうするとc.xのようにドットで表すのは間違いじゃねって思ったんだけど
それは間違い?
>>289が納得できない
295デフォルトの名無しさん:2009/09/16(水) 20:18:25
まちがい。
296デフォルトの名無しさん:2009/09/16(水) 20:26:24
>>294
Obj-CのプロパティはC++のメンバ変数じゃないから . で表しても全く問題ない。
最近の言語では当たり前の糖衣構文。C# も同様のシンタックスシュガーを持つ。

とはいえ、foo の bar プロパティが構造体だったとき、foo.bar.baz = 100 で
foo.bar.baz が 100 にならないのはみっともないのは確か。
297デフォルトの名無しさん:2009/09/16(水) 21:26:55
>>296
始めたばかりの頃コレでハマったのはいい思い出。
298デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/09/17(木) 04:05:43
iPhoneでは-descriptionWithCalendarFormat:timeZone:locale: は梨になった。
NSDateFormatterを使いましょう。Mac側でもやめる気満々なことが書いてあるので
できれば移行していった方がよいようだ。
300デフォルトの名無しさん:2009/09/17(木) 10:57:56
>>299
そうでしたか。ありがとうございます!
おかげさまで警告なしでビルドできるようになりました。
301デフォルトの名無しさん:2009/09/18(金) 01:09:24
またもしかするとiPhoneでは無しになったものかもしれないのですが、
NSHost *host = [NSHost hostWithAddress:@"192.168.0.125"];
の部分で、+hostWithAddreassメソッドが見つからないという警告が出てしまいます。
Mac OSX Reference Libraryを参照しながら作ってるので、見つからないはずはないのですが、
iPhoneで実装するとしたら変わりに何を使えばいのでしょうか・・・。

というか、変わりとなるクラスやメソッドってどうやって調べればいいのでしょうか・・・
302デフォルトの名無しさん:2009/09/18(金) 09:01:51
alloc] initWithAdress:
303デフォルトの名無しさん:2009/09/18(金) 18:30:44
>>302
それもダメなようです・・・。
304デフォルトの名無しさん:2009/09/18(金) 18:57:40
>>301
綴りミス?
+hostWithAddre[a]ssメソッドが見つからないという警告が出てしまいます
305デフォルトの名無しさん:2009/09/18(金) 19:03:45
>>304
綴りミスです。ごめんなさい。
プログラムの方はちゃんと書いてあります。

警告あっても、正常に動作はするのですが、警告があるままやるのは気持ち悪いですね・・・
306デフォルトの名無しさん:2009/09/18(金) 19:16:43
メソッド廃止になったのに使うのは間違い
警告に添え
307デフォルトの名無しさん:2009/09/18(金) 19:19:51
>>306
で、deprecatedでない代替メソッドはなんなの?
308デフォルトの名無しさん:2009/09/18(金) 19:24:25
教えてあげないよ!
309デフォルトの名無しさん:2009/09/18(金) 19:25:59
301≠307ですよ
310デフォルトの名無しさん:2009/09/18(金) 21:57:57
>>301
CFHostCreateWithName()
311デフォルトの名無しさん:2009/09/19(土) 08:50:39
久しぶりにCocoaで遊んじゃお!!わくわく
312デフォルトの名無しさん:2009/09/19(土) 08:52:04
連休だもんな!
313デフォルトの名無しさん:2009/09/19(土) 08:58:08
そうだな!
さて、なに作ろうw
314デフォルトの名無しさん:2009/09/19(土) 10:00:00
連休を有意義に過ごすための予定表アプリを作って連休をつぶすのはどうじゃろか
315デフォルトの名無しさん:2009/09/19(土) 15:33:51
来年のGW用ですね。
316デフォルトの名無しさん:2009/09/20(日) 22:47:54
NSString *message = [NSString stringWithUTF8String:[messageData bytes]];
NSLog(@"%@", message);
[message release];

とある関数の中にこういうコードがあるのですが、
2回目呼び出した時に、メモリ関係のエラーか何かが出てしまいます。
この記述って何か間違ってるのでしょうか?
317デフォルトの名無しさん:2009/09/20(日) 22:50:45
取り敢えずreleaseすんな。

alloc initWith するか NSLog(@"%@", [NSString stringWithUTF8String:[messageData bytes]]); で
318デフォルトの名無しさん:2009/09/20(日) 22:58:01
>>317
ありがとうございます。エラーが消えました!
基本的にreleaseするのはallocした時だけって認識持っといていいんですかね・・・
319デフォルトの名無しさん:2009/09/20(日) 23:09:52
320デフォルトの名無しさん:2009/09/20(日) 23:31:07
なるほど、ありがとうございます。コンビニエンスコンストラクタは
放っておけば勝手にreleaseされるんですね。
321デフォルトの名無しさん:2009/09/22(火) 13:35:53
本当に糞面倒な言語だな
322デフォルトの名無しさん:2009/09/22(火) 16:47:43
基本、Cだからな
323デフォルトの名無しさん:2009/09/22(火) 21:42:41
言語関係ねえ
324デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/09/23(水) 23:20:20
ちなみに
NSNumber *num = [NSNumber numberWithInt:iRet];
NSLog(...);
[num release];

こういう場所(NSNumberやNSStringの生成や解放を行う場所)で必ず出てくるっぽいです。
326デフォルトの名無しさん:2009/09/23(水) 23:28:10
>>324
問題があるので autorelease pool について勉強してください
327デフォルトの名無しさん:2009/09/23(水) 23:30:13
>>326
問題ありですか・・・。
わかりました、ヒントをありがとうございます!
知らない言葉なのでちょっと勉強してきます
328デフォルトの名無しさん:2009/09/23(水) 23:44:52
今度はObjective-Cの質問です!!

クラスを作るまでもない関数ってどういう風に宣言すればいいのでしょうか・・・?
C言語でいう、ふつうの void swapInt(int a, int b); みたいな感じの関数を作りたいと思ってます。
クラスのメソッドだったら

-(void)showMessage:(NSString *)nsstrMsg flag:(BOOL *)flag
{
  ...
}

みたいな感じで作るのは分かっているのですが・・・。
それとも、Objective-CはC言語のような関数は基本的になくて、それでも使いたい場合は
クラスを定義して、クラスメソッドを用意するのが普通なのでしょうか?
329328:2009/09/23(水) 23:45:36
すみません、誤爆です。
330デフォルトの名無しさん:2009/09/24(木) 13:23:26
>>328
void swapInt(int a, int b);
じゃだめなの?
331デフォルトの名無しさん:2009/09/24(木) 15:54:11
>>330
今はそのC言語ライクな書き方で対処して正常に動いてるのですが、
なんかObject-Cのソースの中に、Cの記述方法が混ざってるのが気持ち悪くて・・・
332デフォルトの名無しさん:2009/09/24(木) 15:59:03
その感覚がおかしい。
333デフォルトの名無しさん:2009/09/24(木) 16:13:08
いや、Objective-Cの書き方自体も気持ち悪いんだけど、
その書き方で書くならその書き方でソースコードを統一した方が気持ちいいんだもん・・・
334デフォルトの名無しさん:2009/09/24(木) 16:25:44
Objective-Cは言語じゃなくて、C言語のライブラリと、それを使いやすくするためのプリプロセッサだと考えるべき。
335デフォルトの名無しさん:2009/09/24(木) 18:16:44
そんなに気持ち悪いならソースファイル自体をわければいいじゃんか。
336デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/09/24(木) 20:45:44
>>333
他人のObjCコード一度読んでみるといいよ
みんな平気で使ってるから
338デフォルトの名無しさん:2009/09/24(木) 21:10:20
>>326
すんません、>>282わかりますか?
339デフォルトの名無しさん:2009/09/24(木) 21:10:41
気持ち悪さで言うなら "nsstrMsg" の方がよっぽど気持ち悪いがな。
340デフォルトの名無しさん:2009/09/24(木) 22:37:19
>>338
NSApplicationMain()を実行するとイベントループという名の無限ループが開始される。
各アプリケーションにはイベントキューというキューがある。
イベントループの最初にNSAutoreleasePoolオブジェクトが確保される。
イベントループはイベントキューにイベントがはいってくるまで寝る。
Mac OS Xはイベントが発生すると該当アプリケーションのイベントキューにイベントを放り込む。
またはアプリケーションが自分のイベントキューにイベントを放り込む。
イベントキューにイベントが入るとイベントループは目を覚ます。
アプリケーションはイベントに応じて動作を起こす。
確保されたNSAutoreleasePoolオブジェクトが解放される。
始めの当たりに戻る。
アプリケーションを終了するとなんとexit(3)を呼び無限ループを吹っ飛ばす!!

余分な情報も混ぜてみました。必要な所だけお読みください。
341デフォルトの名無しさん:2009/09/24(木) 22:44:43
>>338
イベントループ内での autorelease pool は NSPortDelegate の handlePortMessage:
呼び出し前に autorelease pool が作られ、呼び出し後に drain される、と思えばok。
(メインスレッドではこれを勝手にやってくれているのであまり気にしなくてよい)

NSThread 等でワーカスレッドを立ち上げただけでは作ってくれないので、そのときは
ちゃんと自前で作ってやらないとautorelease されるインスタンスが登場する処理
(明示的に使うもの、内部処理で使うもの、のいずれも)が>>324の様にエラーになる。

NSThread NSAutoreleasePool でググればたぶん誰かが何か書いてると思う

御指名の 326 じゃないので嫌なら無視してくれ
342338:2009/09/24(木) 22:45:40
>>340
すばらしい。。。
いままで、いろんな人に訊いてきたけど、ここまで明快に
わかりやすく答えてくれた方はいませんでした。
これで、安心して[obj autorelease];を使えます。
どうもありがとうございました。
343338:2009/09/24(木) 22:50:07
>>341
おお、更なる詳しい説明!
しかしながら、>>340さんの説明までは理解できましたが、
>>341さんの説明は自分の知識不足でちょっと難解です。。。
はぁ。。
せいぜいがんばります。
どうもありがとうございます。
344デフォルトの名無しさん:2009/09/25(金) 23:36:34
http://www.remus.dti.ne.jp/~yoshiki/cocoa/ed1/index.html
このあたりも凄く参考になるぜ
第10-13回らへん
345デフォルトの名無しさん:2009/09/25(金) 23:59:48
MOSAの人は早くテクニカルドキュメント要約ライブラリの作成の仕事に戻るんだ
346338:2009/09/26(土) 00:34:43
>>344
おわっ、これはかなりわかりやすそうな予感
勉強してみます
どうもありがとう!
347デフォルトの名無しさん:2009/09/29(火) 18:33:50
UIButtonのRounded Rectタイプのボタンで,画像を使わず手軽にボタンの色を変える事は出来ないでしょうか?
348デフォルトの名無しさん:2009/09/30(水) 06:42:58
>>347
無理です
あと、ここではなくiPhoneアプリ開発のスレに書きこんだ方がいいかと
349デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/09(金) 06:38:19
351デフォルトの名無しさん:2009/10/09(金) 08:42:00
>>349
retain/release について勉強してください。その辺わかってないと、
プログラム書いてるといずれ意味不明なクラッシュが多発して
どうしようもなくなりますよ。
http://developer.apple.com/iphone/library/documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html

release は C++ でいう delete とは違って、即座にオブジェクトを
破壊するわけではないです。retain カウントを減らすだけです。
retain カウントがゼロになれば、自動的に dealloc が呼ばれてオブジェクトが
なくなります。

あるオブジェクトを持っておきたい人は、
retain して retain カウントを増やします。
いらなくなったら、 release して retain カウントを減らします。
誰からもオブジェクトがいらなくなったら、自動的に dealloc されます。

NSMutableArray に addObject すると、NSMutableArray は
そのオブジェクトを保持していたいので、 retain されます。
一方で、>>349 のコードを書いているあなた自身は
もうそのオブジェクトは直接はいらなくなるので、release しちゃっていいです。

インスタンスがコピーされているわけじゃなくて、
NSMutableArray がこのオブジェクトを保持するぜ!と言っているので、
あなたはもうこのオブジェクトを保持している必要がなくなるわけです。
352デフォルトの名無しさん:2009/10/09(金) 14:54:17
>>351
ありがとうございます。もんのすごく分かりやすいです。
一応リンク先の方も読んでおこうと思います。
結構既にメモリまわりのエラーが時々出たりしているので・・・
353デフォルトの名無しさん:2009/10/09(金) 15:06:58
「一応」じゃなくてちゃんと読め。
354デフォルトの名無しさん:2009/10/09(金) 15:11:02
>>353
そうですね、ちゃんと読みます。
リンク先が英語で焦ったのですが、メモリに関する日本語リファレンス探したらあったのでそっちを読みます。

https://developer.apple.com/jp/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt
355デフォルトの名無しさん:2009/10/10(土) 18:22:49
>>282
GNUSTEPのソースを追えば、理解できると思う。
356デフォルトの名無しさん:2009/10/11(日) 18:49:15
以下のコードで指定のURLからファイルを取得しようとしているのですが、
bad URLというエラーが返されてしまいます。
NSLogでnssUrlを表示させ、そのURLをコピペしてブラウザから閲覧したら確かに見る事ができるのでURLは間違っていないはずです。

NSString *nssUrl = [NSString stringWithFormat:@"http://%s/%s/%@/%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デフォルトの名無しさん:2009/10/11(日) 18:56:45
そのコピペしたURLを直接NSStringに nssUrl = @"hoge"ってつっこんだ結果はどうなってるのさ?
358デフォルトの名無しさん:2009/10/11(日) 18:59:50
>>357
あれ?それだとエラーが出てこなくてちゃんと動きます。
謎なんですけど・・・
359デフォルトの名無しさん:2009/10/11(日) 19:03:50
nssUrl を characterAtIndex で unichar 出して中身見ると、変なモンが混ざってると思うぞ。
360デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/11(日) 19:13:54
>>359
おぉ、ありがとうございます。1文字ずつ表示させていったら
[semanticList objectAtIndex:i]のあとに空白?みたいなのが1つ入ってました。
なんでだろう・・・とりあえず後は自分で原因探してみます。ありがとうございました!
362デフォルトの名無しさん:2009/10/11(日) 19:27:03
あまりスマートじゃないですが、固定長のデータなのでsubstringToIndexで対処しました。
ありがとうございました。
363デフォルトの名無しさん:2009/10/12(月) 00:13:57
char*をNSNumber型に変更するスマートな書き方はありますか?
364デフォルトの名無しさん:2009/10/12(月) 01:29:23
それポインタだろ。cString のことか?
365デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/12(月) 02:21:12
NSError *err = nil;
ってしてみて
367デフォルトの名無しさん:2009/10/12(月) 02:51:14
>>366
ありがとうございます!
無事エラーが出ないようになりました。
なんかよくわかりませんが、allocもinitもせずに宣言するときはとりあえずnilをぶち込んでおく癖をつけておきます。
368デフォルトの名無しさん:2009/10/12(月) 03:06:32
>>364
そうです。Cの関数から返されたポインタのcharをNSNumberにしたいです。
今はNSStringに変換してからNSNumberに再変換してます。。
369デフォルトの名無しさん:2009/10/12(月) 03:26:11
> NSStringに変換してからNSNumberに再変換

何したいのか分からないから、この処理の部分を書いてみて
370デフォルトの名無しさん:2009/10/12(月) 04:10:56
>>369
char *c = (Cの関数);
NSString *str = [NSString stringWithCString:c];
NSNumber *num = [NSNumber alloc] initWithInt:[str intValue]];

NSStringを介さずNSNumberにしたいです。
371デフォルトの名無しさん:2009/10/12(月) 04:23:25
[NSNumber numberWithInt : atoi(c)];

ってことか。NSString かませる必要ないね。
372デフォルトの名無しさん:2009/10/12(月) 04:41:21
>>371
そんな関数があるんですね、ありがとうございました!
373デフォルトの名無しさん:2009/10/12(月) 07:34:32
>>370
べつにそれでいいでしょう。なんでそれじゃいやなの?

あと、strintWithCString は deprecated なので使わないこと!
文字コードの問題でいずれハマりますよ。
かならず UTF8String か encoding: つきのメソッドをつかってください
374デフォルトの名無しさん:2009/10/12(月) 11:07:42
>>367
「とりあえずnilをぶち込んでおく」とかいう意味のない癖をつけるよりも、
NSErrorに触る前にその処理が成功したのか失敗したのか判断する癖をつけましょう。

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError.html#//apple_ref/doc/uid/TP40001806-CH204-SW2

処理が成功した場合、NSErrorにobjectが代入されていることは保証されていません。
375デフォルトの名無しさん:2009/10/12(月) 21:47:17
意味なく無いだろ
376デフォルトの名無しさん:2009/10/12(月) 22:54:27
>>375
いや、訳も分からずとりあえずnilを入れるのは良くないよ、て言いたいんじゃないの?
377デフォルトの名無しさん:2009/10/13(火) 00:58:25
値が未定義な自動変数がクラッシュの
温床になるって書いて置けばまだ
分かりやすいかな。
378デフォルトの名無しさん:2009/10/13(火) 02:04:19
萩原本にはNSErrorにほ取り敢えずnil入れとく癖を付けろと書いてあったよ。
379デフォルトの名無しさん:2009/10/14(水) 16:51:04
質問です。

クラスAの中でクラスBのオブジェクトを保持したくて、
クラスBの中でクラスAのオブジェクトを保持したいのですが、
それぞれのヘッダファイルの中でimportしようとすると入れ後状態?みたいになって
コンパイルが通りません。こういう場合はどうすればいいのでしょうか。
380デフォルトの名無しさん:2009/10/14(水) 16:58:48
>>379
循環参照が発生してるのかな?
スーパークラスかインターフェイスを作成して、それを保持させるとどうかな?
381デフォルトの名無しさん:2009/10/14(水) 16:59:38
@class
382デフォルトの名無しさん:2009/10/14(水) 17:00:05
>>380
あーなるほど、そういう方法があるんですね。
ありがとうございました!
383デフォルトの名無しさん:2009/10/14(水) 17:13:55
>>380, 382
まてまてまてw
>381 の言う通り、@class をつかえ。
ClassA.h; @class ClassB @interface ClassA : Hoge {ClassB *clsB} @end
ClassA.m; #import "ClassA" #import "ClassB"

ClassB.h; @class ClassA @interface ClassB : Piyo {ClassA *clsA} @end
ClassB.m; #imprt "ClassB" #import "ClassA"
384デフォルトの名無しさん:2009/10/14(水) 17:14:49
しつれい、@class ClassA; ね。";" が抜けた
385デフォルトの名無しさん:2009/10/14(水) 17:59:46
>>383
ぎゃー、すでに変更し始めてました。
ちょっとバックアップファイルから復元して@classでやってみます。
386デフォルトの名無しさん:2009/10/14(水) 18:04:48
>>385
Objective-Cに興味があってこのスレ見てるけど、コードを書いた事が無いのにレスした俺のせいでスマン…
387デフォルトの名無しさん:2009/10/14(水) 18:13:47
@classで一瞬で解決しましたw
ありがとうございました!

>>386
なんという・・・w
388デフォルトの名無しさん:2009/10/14(水) 18:48:20
>>386
>Objective-Cに興味があってこのスレ見てるけど、コードを書いた事が無い
なんだ、俺は他にもいたのか
389デフォルトの名無しさん:2009/10/14(水) 21:15:20
一度くらい書けよw
390デフォルトの名無しさん:2009/10/15(木) 10:51:48
cat > hello.m
#include <stdio.h>
int main(int argc, char*argv[]){printf("Hello world.\n");return 0;}

^D

make hello
./hello

サフックスが.mだからObjCとしてコンパイルされます!
これでObjCプログラマの仲間入りです!
391デフォルトの名無しさん:2009/10/15(木) 11:06:11
それでいいなら俺も書いた事あるぜ!w
392デフォルトの名無しさん:2009/10/16(金) 00:58:07
NSStringの中に文章が入っているのですが、その中にあるURLをリンクに置換したいと考えています。
例えば文章の中に
http://www.google.co.jp/
のようなアドレスがあれば、
<a href="http;//www.google.co.jp/>http;//www.google.co.jp/</a>
のように置換したいのですが・・・やり方がいまいちわかりません。
とりあえずNSStringのメソッドを見る限りだと無理で、NSMutableStringのメソッドを見る限りだと、
replaceOccurrencesOfString:withString:options:range:のようなメソッドがあったのですが、
正規表現が使えるのか不明です。何かいい方法はないでしょうか?
393デフォルトの名無しさん:2009/10/16(金) 01:04:28
regex(3)
394デフォルトの名無しさん:2009/10/16(金) 01:49:26
>>392
ありがとうございます。
RegexでググったらRegkit liteというのがあったのでそれを使いました。
ただ、URLのマッチングが上手くいかないので見ていただけないでしょうか・・・


NSString *searchString = @"I like http://www.google.co.jp/ yeah!!";
NSString *regexString = @"(http://|https://){1}[\\w\\.\\-/:\\#\\?\\=\\&\\;\\%\\~\\+]+";
NSString *replaceWithString = @"<a href=\"$1\">$1</a>";
NSString *replacedString = NULL;
replacedString = [searchString stringByReplacingOccurrencesOfRegex:regexString withString:replaceWithString];

これで置換した結果が、
I like <a href="http://">http://</a> yeah!!
になります。www.google.co.jp/が消えてしまってるのですが、何が間違ってるのでしょうか?

395デフォルトの名無しさん:2009/10/16(金) 02:01:15
謎ですね。http://しかマッチしていないなら
I like <a href="http://">http://</a>google.co.jp yeah!!
になりそうなんですけどね・・・
396デフォルトの名無しさん:2009/10/16(金) 02:05:04
そのライブラリは知らないけど、普通はカッコで囲ってるところしかキャプチャされないのでは?
397デフォルトの名無しさん:2009/10/16(金) 02:25:22
NSString *regexString = @"(https?://[a-zA-Z\.\-\#\?\=\&\;\%\~\+]+)";

でいいんじゃないの
398デフォルトの名無しさん:2009/10/16(金) 02:44:41
括弧で囲ってるところしかキャプチャされないんですか・・・
無事マッチできました。ありがとうございました!
399デフォルトの名無しさん:2009/10/17(土) 05:37:25
次のようなプログラムを動かすと配列0番目を参照してるはずなのに
200が返されます。何故なんでしょうか?

int main(int argc, char *argv[]) {
array = [[NSMutableArray alloc] init];

[self bindInt:0 value:100];
[self bindInt:0 value:200];

Element *h = [array objectAtIndex:0];
printf("value:%d¥n", *(int*)h.p);
}

- (void)bindInt:(int)holderId value:(int)value
{
// Elementクラスにはvoid *p変数のみ定義されてる
Element *holder = [[[Element alloc] init] autorelease];
holder.p = &value;

[array addObject:holder];
}

ちなみにbindIntのhoderId引数自体を外すと0が返されます。
これもよく理由がわかりません。。
400デフォルトの名無しさん:2009/10/17(土) 06:31:06
なんでintのポインタ渡すの? それスグ死ぬやん。
401デフォルトの名無しさん:2009/10/17(土) 06:50:20
>>400
へ、死ぬんですか。
変数pはvoid*にして、様々な型を格納できるようにしたかったのです。

まだあまり理解できていないのかも。
この辺りは何をキーワードに調べれば良いのでしょうか。
402デフォルトの名無しさん:2009/10/17(土) 10:15:22
void * に格納できるのはポインタだけで、「様々な型を格納」できたりはしないぞ。
403デフォルトの名無しさん:2009/10/17(土) 11:45:32
その前に self って誰?
404デフォルトの名無しさん:2009/10/17(土) 14:11:23
プールもないのに autorelease ?
405デフォルトの名無しさん:2009/10/17(土) 14:29:59
>>399
>holder.p = &value;
ここでスタック上に一時的に作られたローカル変数のアドレス取ってるから
ゴミを拾って当たり前
Cの初歩で「ローカル変数のアドレス返しちゃダメ」みたいなトピックあると
思うからその辺から読む事
406デフォルトの名無しさん:2009/10/17(土) 14:54:20
NSImage *backBlock = [[NSImage alloc]
 initWithContentsOfFile:@"./images/Block_0.png"];
のところで、
initializer element is not constant
というエラーが出て途方に暮れています。
何が悪いのか、教えてください。
407デフォルトの名無しさん:2009/10/17(土) 15:13:57
それを
NSImage *backBlock = [[NSImage alloc] initWithData:[NSData dataWithContentsOfFile:@"./images/Block_0.png"]];

とかに変えてもエラーが出るのなら、他の部分が問題。
408デフォルトの名無しさん:2009/10/17(土) 18:26:43
というか、突っ込みどころが多すぎてどこから突っ込んだらいいのやら。
409デフォルトの名無しさん:2009/10/18(日) 05:31:50
とりあえず俺のケツから突っ込んでこいよ
410デフォルトの名無しさん:2009/10/19(月) 07:59:06
次のようなコードでmyNotePadオブジェクトのプロパティの値を変えようと試みているのですが、//Diagnosticsの部分でNSLogの結果が 0 や (null)と表示されてしまいます。

// プロパティnoteTextにコンテントの内容をセット
myNotePad.noteText = tvContent.text;

// プロパティsavedDateに日付をセット
myNotePad.savedDate = [NSDate date];

// プロパティsaveCyclesをインクリメント
myNotePad.saveCycles++;

//////// Diagnostics
NSLog(@"in saveData - tvContent.text - %@", tvContent.text);
// これはちゃんと表示される

NSLog(@"in saveData - noteText - %@", myNotePad.noteText);
// nullと表示される

NSLog(@"in saveData - savedDate - %@", myNotePad.savedDate);
// nullと表示される

NSLog(@"in saveData - saveCycles - %d", myNotePad.saveCycles);
// 0と表示される


初歩的な質問で申し訳ないのですが、どなたか教えていただけますか?
マジで困ってます・・・
411デフォルトの名無しさん:2009/10/19(月) 08:23:33
すみません自己解決しました
412デフォルトの名無しさん:2009/10/19(月) 11:03:58
>>411
自己解決したのはいいとして、何が原因だったかくらい書いたらどうかな?
それを読んで役に立つ人もいるはずだし。

ここでいろいろ助けてもらっても、結果は独り占めして誰にも教えたく無い、
っていう性格なら、まあ強制はしないけどね。
413デフォルトの名無しさん:2009/10/19(月) 12:33:12
変数に入った文字列を=で代入なんてできない。初歩的すぎる。
414デフォルトの名無しさん:2009/10/19(月) 12:47:57
「myNotePadがnilでした」に 3 retainCount かける。

>>413
なんの話をしているの?
415デフォルトの名無しさん:2009/10/19(月) 13:54:51
>>412
そうですね。すみません。
実はメモリをallocしてなかったのが原因でした

>>413
初心者は帰れ!!!!

>>414
そうです。nilでした
416デフォルトの名無しさん:2009/10/19(月) 13:57:45
余計なことを言ったばかりに一気に印象が悪くなる。
417デフォルトの名無しさん:2009/10/19(月) 19:17:41
馬鹿は死ななきゃ治らないから415の罪じゃないさ。
418デフォルトの名無しさん:2009/10/19(月) 21:55:11
malloc: *** error for object 0x4c52320: pointer being reallocated was not allocated
これは一体どういう意味なのでしょうか?
メモリを再確保されたポインタはメモリ確保されませんでした?
いまいちよく分からないのですが、具体的にどういう時に出るエラーなのでしょうか?
419デフォルトの名無しさん:2009/10/19(月) 22:13:15
>>418
/usr/lib/libSystem.B.dylib の szone_realloc() 関数の中で
szone_size() 関数が 0 を返すと発生するエラーだよ。

http://www.opensource.apple.com/source/Libc/Libc-583/gen/scalable_malloc.c
420デフォルトの名無しさん:2009/10/19(月) 22:13:24
>>418
#include <stdlib.h>

int main(int argc, char **argv)
{
char *foo = "abc";
foo = (char *)realloc(foo, sizeof(char) * 4);
return 0;
}
みたいなことをしたときとか。
421デフォルトの名無しさん:2009/10/19(月) 22:14:15
再確保しようとしたポインタは確保されませんでした?
422418:2009/10/19(月) 22:44:28
んー明示的にメモリの再確保してる場所はないんですけどね・・・
NSMutableStringのappendStringあたりで変なことになってるんですかね。
とりあえずどういうエラーなのかは分かったので、地道に問題箇所探していきます。
ありがとうございました!
423デフォルトの名無しさん:2009/10/19(月) 22:46:34
>>414
413 は、OpenStep API が出る前で NSString* が無かった頃の人なんだよ。
というかここは Obj-C スレなので、Foundation があることを
仮定しないのが自然じゃないかな。

あ、でも、property 使う時点で Obj-C 2 か ...
424デフォルトの名無しさん:2009/10/19(月) 23:01:33
NSStringが登場する前だってNXStringとかあったじゃん
425デフォルトの名無しさん:2009/10/19(月) 23:40:46
疑問です。

NSLog(@"%.f", 0.5);
NSLog(@"%.f", 1.5);
NSLog(@"%.f", 2.5);
NSLog(@"%.f", 3.5);
NSLog(@"%.f", 4.5);
NSLog(@"%.f", 5.5);

とした時、四捨五入されて出力結果は
1 2 3 4 5 6
になると思いきや実際には
0 2 2 4 4 6
となりました。偶数時は5以下は切り捨て。奇数時は5以上を繰り上げているようです。
printfでも同様でした。
なぜこうなるのでしょうか?
10.5、10.6、Cocoaアプリケーション、Standard Tool、C89、C99 等いくつか状況を変えて試しましたがいずれも同じ結果でした。
426デフォルトの名無しさん:2009/10/19(月) 23:55:31
>>425
偶数丸め
427デフォルトの名無しさん:2009/10/19(月) 23:56:05
NSURLConnectionを使ってHTTPでデータの差分取得をしたいのですが

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60];
[request addValue:@"Wed, 30 Jul 2008 12:12:12 GMT" forHTTPHeaderField:@"If-Modified-Since"];
[request addValue:@"445-" forHTTPHeaderField:@"Range"];

NSData *data;
NSURLResponse *response;
NSError *error = nil;
data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

とりあえずリファレンスとか見ながら頑張って↑のコード書いたのですが、
結局差分取得はせずに全部ダウンロードしてしまいます。
どうすればいいのでしょうか・・・
428デフォルトの名無しさん:2009/10/20(火) 00:02:33
>>426
ググってみました。ありがとうございます。
429デフォルトの名無しさん:2009/10/20(火) 00:06:39
あー、アホだー
bytes=が抜けてました。死んできます。
430デフォルトの名無しさん:2009/10/20(火) 00:15:00
この様はiPhoneさまさまなのかな。
431デフォルトの名無しさん:2009/10/20(火) 00:59:23
サマーはもう終わりました
432デフォルトの名無しさん:2009/10/20(火) 11:33:53
次のスレのはじめには、ここはあくまで言語仕様のスレで、
Mac / iPhone Cocoa プログラムはそれぞれのスレにいくよう
強調したほうがよいかも
433デフォルトの名無しさん:2009/10/20(火) 16:28:20
別にいいんじゃん?暇だし。
434デフォルトの名無しさん:2009/10/20(火) 16:52:33
まぁね
暇だし
仕事ないし
435デフォルトの名無しさん:2009/10/20(火) 16:53:48
>>434
暇なら仕事みつけろよwww
436デフォルトの名無しさん:2009/10/20(火) 17:01:38
働いたらそこで試合終了だって安西先生が言ってた
437デフォルトの名無しさん:2009/10/20(火) 17:22:02
俺は、親父が残してくれた財産で、
働かずに住んでいるよ。
結局、人生は親の財産次第。

馬鹿な親の子に生まれた子は、一生馬鹿。
438デフォルトの名無しさん:2009/10/20(火) 19:01:23
奇遇だな。俺も2chではそうなんだよ。
相続税のこととか考えると、まったく頭が痛いよ。
439デフォルトの名無しさん:2009/10/20(火) 20:44:08
>>437,438
働かず、暇があるなら税法をやれば良い。
それで今の税法の穴を見つけてこっそり使えばいいんじゃね。
440デフォルトの名無しさん:2009/10/20(火) 21:17:46
スレ違いうざい。
441デフォルトの名無しさん:2009/10/20(火) 22:10:19
そういうスレ違いは許さないんだなw
まぁ当たり前っちゃ当たり前か。スレ違いというか、板すら違うからなw
442デフォルトの名無しさん:2009/10/20(火) 22:42:31
国内のMac信者ってなんでこう雑魚ばっかりなんだろう
443デフォルトの名無しさん:2009/10/20(火) 23:04:20
まぁ荒れる前にこの話題は終わらせちゃおうぜ!!
releaseだ!release!!
444デフォルトの名無しさん:2009/10/20(火) 23:17:59
Cocoa でドットを描くのは NSRectFill(NSMakeRect(x,y,1,1) するのが一般的なの?
難しいな…
445デフォルトの名無しさん:2009/10/21(水) 22:31:28
せっかくだからOpenGL使ったら?
446デフォルトの名無しさん:2009/10/21(水) 22:39:22
なるほど。GL_POINTS を使って点を描く訳ですね。
お絵描きソフトを作ろうと思っているのですが、NSBezierPath 等 Cocoa の API を
使うのと比べてメリットはどんなところがあるでしょうか。
447デフォルトの名無しさん:2009/10/22(木) 09:44:53
他機種向けのソフトを作る時も、流用しやすい
448デフォルトの名無しさん:2009/10/22(木) 19:26:34
クロスプラットフォームなのは嬉しいですね。
ただ今回はプラットフォーム固有の機能をガンガン使って
コーディングするつもりなので、他機種の事は考えていません。
449デフォルトの名無しさん:2009/10/22(木) 19:35:39
>>444みたいな面白いこと言い出す奴にそれは無理だと思うの
450デフォルトの名無しさん:2009/10/22(木) 19:43:08
ん、どうしてそう思ったの?
451デフォルトの名無しさん:2009/10/22(木) 21:46:06
何だ、冷やかしか
452デフォルトの名無しさん:2009/10/22(木) 23:49:37
前々から言おうと思ってたけど、iPhoneアプリ開発スレ行けよ
こっちとマルチすんな
453デフォルトの名無しさん:2009/10/22(木) 23:53:20
前々?マルチ?iPhone?
いったい誰に向かって言ってるんだ?
454デフォルトの名無しさん:2009/10/22(木) 23:59:16
普通の人には見えない何かが見えちゃうと大変だな…
455デフォルトの名無しさん:2009/10/23(金) 00:10:45
>>450-451,453-454
www
456デフォルトの名無しさん:2009/10/23(金) 00:13:51
何がしたいのか全く分からん…
お大事にね
457デフォルトの名無しさん:2009/10/23(金) 00:25:50
で、結局 >>449 は何だったの?
458デフォルトの名無しさん:2009/10/23(金) 00:26:49
君らもうMac板に帰ったら
459デフォルトの名無しさん:2009/10/23(金) 02:43:38
おちつけぢょwww
460デフォルトの名無しさん:2009/10/23(金) 03:14:57
何だ、冷やかしか
461デフォルトの名無しさん:2009/10/23(金) 04:27:21
ひややっこおいしいです
462デフォルトの名無しさん:2009/10/23(金) 16:02:24
NSStringに0123918201とか023384722とかの数字文字が入っているのですが、
それらのNSStringを

if([numString1 intValue] < [numString2 intValue]){ }
else if([numString1 intValue] == [numString2 intValue]){ }
else{ }

のように数値で比較した時、なぜか絶対にイコールのところに入ってしまいます。
NSLogでそれぞれに入っている数字は違う事を確認してるのですが、
それでも==の条件式に当てはまってしまいます。
どういう原因が考えられますか?
463デフォルトの名無しさん:2009/10/23(金) 16:17:41
すみません、調べてみたら、NSStringに入ってる数字は違うのですが、
intValueにしたら全然違う数値になっている事がわかりました。

NSStringに031424045645って入ってるのに
intValueの値は2147483647になってます。
これは何でなんでしょうか・・・?
464デフォルトの名無しさん:2009/10/23(金) 16:27:38
31424045645 → 7 5104 E24D
2147483647 → 7FFF FFFF
465デフォルトの名無しさん:2009/10/23(金) 16:28:45
signed int の最大値 INT_MAX が 2^31-1 = 2147483647 って知らないの?
doubleでも使え
466デフォルトの名無しさん:2009/10/23(金) 16:39:38
あーなるほど・・・。intは4バイトなのでオーバーフローしちゃってるわけですね。
unsigned型でも全然桁がたりませんね。基本的に12桁以下の数値の文字なのですが、
これを数値的に比較するのにいい方法はないでしょうか?
467デフォルトの名無しさん:2009/10/23(金) 16:41:29
long longか__int64
468デフォルトの名無しさん:2009/10/23(金) 16:48:28
>>465
doubleValueだと==を検出できなくなる可能性がありますね。
roundとかで切り捨てれば解決なのかな・・・
ちょっとやってきます。
469デフォルトの名無しさん:2009/10/23(金) 17:15:02
NSLog(@"%ll", [numString1 longlongValue]);
でlong long型が表示出来なかったので、数値が確認できず若干不安ではありますが、
期待通りの動作をしているようなので大丈夫なようです。

ありがとうございました。
470デフォルトの名無しさん:2009/10/23(金) 17:55:21
471デフォルトの名無しさん:2009/10/23(金) 18:01:50
>>470
わぁ、ありがとうございますw
大丈夫だと言い聞かせながらも、もの凄く不安でしたw
念のためちゃんとなってるか調べてきます。
472デフォルトの名無しさん:2009/10/23(金) 18:17:40
NSLog(@"%@ %qi", numStringX, [numStringX longlongValue]);
文字とそれをlonglong型に変換したものの対応表ですが・・・

031423045645 5833744870023364608
031423045646 5833744874318331905
031424045644 5838039833024397314
031424045644 5838039833024397315
031424045645 5838039837319364611
031424045646 5838039841614331908
031425045644 5842334800320397317
031425045644 5842334800320397318
031425045645 5842334804615364614
031425045646 5842334808910331911

全然大丈夫じゃなかったです。一応文字数値が大きいものほど、
longlongの値も大きくなっているので正常に動作はしているのですが、
んー何でこう思った通りに動かないんだろうか(´・ω・`)
どこも間違ってるようには見えないんですけど・・・
473デフォルトの名無しさん:2009/10/23(金) 18:34:11
031423045645      → 7 50F5 A00D
5833744870023364608 →  50F5 A00D 0000 0000

何が起こってるんだろ?
474デフォルトの名無しさん:2009/10/23(金) 18:56:22
031423045646      → 7 50F5 A00E
5833744874318331905 →  50F5 A00E 0000 0001

二つ目に関してはLSBが1になってますね。
んー・・・元のNSStringに何か問題があるんですかね・・・
475デフォルトの名無しさん:2009/10/23(金) 19:53:27
試しに↓をやってみたら
NSString *testString = [NSString stringWithString:@"012345012345"];
NSLog(@"test: %@ - %qi", testString, [testString longLongValue]);

出力が
test: 012345012345 - 12345012345

になってるので、基本的な使い方としては間違ってない感じですね。
numStringの中に入ってるデータに何か罠がありそうな感じですが、
普通にNSLog(numString)で表示させても、特に変な様子は見られないんですけどね・・・
476デフォルトの名無しさん:2009/10/23(金) 20:01:16
ここはお前のメモ帳だ。いいぞもっとやれ。
477デフォルトの名無しさん:2009/10/23(金) 20:02:33
何かついてるんでしょうね。とりあえず、NSScanner で読んでみたら?
NSString *str = [NSString stringWithUTF8String:"031425045646"];
NSScanner *scan = [NSScanner scannerWithString:str];
NSLog(@"%@, %qu", str, [str longLongValue]);
NSLog(@"%qu", value);
//031425045646(, 31425045646
//31425045646
478デフォルトの名無しさん:2009/10/23(金) 20:06:18
あ、ごめん、スキャン部分が抜けてた。
uint64_t value;
[scan scanLongLong:(long long*)&value];
479デフォルトの名無しさん:2009/10/23(金) 20:09:01
NSLog(@"%@ %qi", numStringX, [numStringX longlongValue]);

longlongValue なんて method はないよ。
ほんとうにこのコードで出した対応表なの?
480デフォルトの名無しさん:2009/10/23(金) 20:10:37
ちょっとNSScannerでやってみます

>>479
その部分は手打ちなのでタイプミスしました。
ソースの方はちゃんとlongLongValueになってます
481デフォルトの名無しさん:2009/10/23(金) 20:28:52
NSScannerで確かめて見たら正常に表示されました。
これに関連して、比較用のNSStringを新しくつくって、そこに元のNSStringをぶちこんで
表示させてみたら同様に正常に表示されました。何なんだろう・・・
とりあえず比較用のNSStringを作る事で対処しました。
これで比較部分がようやく安心の動きになるはず・・・
とりあえずありがとうございました!
482デフォルトの名無しさん:2009/10/25(日) 01:24:31
おまえらメソッド定義の開き括弧って別の行にする派?
- (id)fucknglyLongMethodNameContainingThousandsOfCharacters:bar
{
それともメソッド名の行にまとめる派?
- (id)fucknglyLongMethodNameContainingThousandsOfCharacters:bar {

あと、メソッドチェインで右の方まで来ちゃったときって、新しい行でメソッド名始めたりする?
[[omgThisIsTooLongSoThatTheNextMethedHangsAtFarRightPositionWTF foo]
thisIsTheSecondMethodSTFU:bar
multipleArgsAnotherPain:poo];
それとも同じ行に置く?
[[omgThisIsTooLongSoThatTheNextMethedHangsAtFarRightPositionWTF foo] thisIsTheSecondMethodSTFU:bar
multipleArgsAnotherPain:poo];
483デフォルトの名無しさん:2009/10/25(日) 02:17:55
-(void)括弧は同じ行にする {
[[そんなに長いメソッド名 付けたりはしないけど] 基本的には同じ行かな];
id hoge = [コード見やすい方が気分がいいので あんまりにも右に長くなっちゃう場合は];
[hoge コードを分けちゃいますね];
}
484デフォルトの名無しさん:2009/10/25(日) 12:50:09
WikipediaでCの例文見ると
関数宣言は改行で
void a
{
}
条件式は
if () {
}
while () {
}
改行してるみたい。
485デフォルトの名無しさん:2009/10/25(日) 13:09:58
>>484
Wikipediaは例として好ましくありません。
例として引用する場合は、Wikipediaが参照・参考にしている一次情報を引用しましょう。

括弧を次の行におくのはGNUコーディング規約で推奨されています。
同じ行に置く形もどこか有名な団体/企業での採用が元だったと思いますが忘れました(Sunだったかな)。

GNUコーディング規約
http://www.gnu.org/prep/standards/standards.html#Formatting
http://www.sra.co.jp/wingnut/standards-j_toc.html

ちなみに私は括弧は同じ行、メソッドチェインは>>483と同様に分割を検討します。
状況によっては新しい行で開始します。同じ行には置かないでしょうね。
486デフォルトの名無しさん:2009/10/25(日) 20:14:08
GNUスタイルは参考にするな、やっちゃダメな例だ
Linuxコーディングスタイルがルールも少なく誰でも従いやすい
でも、objc的にはAppleのコーディングスタイルをまねるのが一番いいのでは
Appleなりの理由があってあのスタイルに落ち着いたんだろうから
あと、Perlベストプラクティスのコーディングスタイルも学ぶところが多かった
487デフォルトの名無しさん:2009/10/25(日) 20:24:09
コーディングスタイルなんて、プロジェクト内で一貫してればなんでもいいべ。
488デフォルトの名無しさん:2009/10/25(日) 20:27:54
いきなりタブ・インデントは8文字とか書いてあるけど……
489デフォルトの名無しさん:2009/10/25(日) 20:35:52
490デフォルトの名無しさん:2009/10/25(日) 20:41:17
基本Appleのサンプルコードを真似する形で。
491デフォルトの名無しさん:2009/10/26(月) 04:47:35
ここで質問すべき事なのかよく分からないのですが、
Macのシステム終了、再起動、をするプログラムを作ろうと思ってます。
で、実装についてなんですが、よく分からないのでsystem関数で
再起動、システム終了のコマンドでも送ってみようかと思います。
shutdown -h now
ですね!でもこれってrootじゃないアカウントからでも効くんでしょうか?
あと、保存していないファイルとかは保存されないまま強制終了しちゃうのでしょうか?
492491:2009/10/26(月) 04:51:26
自分で試す気は無いのでよろしくお願いします。
493デフォルトの名無しさん:2009/10/26(月) 06:39:57
>>492
自分で試せヴォケ
494デフォルトの名無しさん:2009/10/26(月) 06:57:41
>>491
rootじゃなくてもだいじょうぶ
495デフォルトの名無しさん:2009/10/26(月) 10:10:03
>>491
ここで質問すべきことじゃないですが、shutdown -h now だと
かなり強制的に終了するのでよくないです。ファイル保存しますか?
とかのダイアログも出ません。Apple おすすめの方法は
http://developer.apple.com/mac/library/qa/qa2001/qa1134.html
です。
496デフォルトの名無しさん:2009/10/27(火) 07:55:44
既出かもしれんが、
foo.cppにあるint exec()って関数をbar.mのmain()から呼び出すのってなんか宣言必要なの?
ldでexec()のシンボルが見つからないと言われる・・・
497デフォルトの名無しさん:2009/10/27(火) 09:28:44
>>496
foo.cpp 側で extern "C" しとかんと Obj-C からは呼べないだろ、JK
498デフォルトの名無しさん:2009/10/27(火) 21:55:28
>>497
Thx。やってたんだが、どうやらヘッダーファイルで宣言してたのがダメだったらしく、cppファイルに直接externしたら動いた。感謝。

原因まではおってないが‥
499デフォルトの名無しさん:2009/10/29(木) 13:23:39
メインスレッドから実行したスレッドAの処理が終わるまで
メインスレッドを待機させるにはどう書けば良いのでしょうか。
500491:2009/10/29(木) 13:33:31
[self performSelectorOnMainThread:<#(SEL)aSelector#> withObject:<#(id)arg#> waitUntilDone:<#(BOOL)wait#>];

じゃねーの。
501デフォルトの名無しさん:2009/10/29(木) 13:34:15
名前消し忘れてたヨ
502499:2009/10/29(木) 13:36:38
やっぱりperformSelectorOnMainThread使わないといけないんですね。
あまりメソッド増やしたくなかっただけなんですが、どうもです。
503デフォルトの名無しさん:2009/10/29(木) 13:54:21
>>502
「使わないといけない」わけじゃねーよ。
>>500は 物知らずでも使える一番簡単な方法を提示してくれただけだろ。
文句あるなら pthread の関数とか NSCondition でも使ってろ
504デフォルトの名無しさん:2009/11/08(日) 15:04:31
 簡単なxmlを解析するクラスを作ってます。char型のメンバ変数を持たせたいと思ったのですが、うまくいきません。
@interface SimpleXml : NSOperation {
const char *elementName;
}
オブジェクトの初期化のところで
- (id)initWithRequest: (NSURLRequest*)request name: (NSString *)name
{
self = [super init];
if (self) {
elementName = [name UTF8String];
}
return self;
}
こんな風にしてみた。代入直後でNSLogするとちゃんと代入されてるのですが、実際に使いたいメソッドの中では文字化け?のようなおかしなデータになってます。
比較対象がchar*なので最終的にはchar*が欲しいです。メンバ変数をNSStringにして比較するところでUTF8Stringで変換して比較するとうまくいきます。
ただ、xmlの要素分繰り返し呼ばれる部分なので、毎回UTF8Stringを呼び出すくらいならcharで持たせちゃえと思いました。
それほどおかしなことはしてないつもりなのですが、やっぱりポインタの理解が足りてない感じでしょうか?アドバイスお願いします。
505デフォルトの名無しさん:2009/11/08(日) 16:40:23
>>504
-[NSString UTF8String] のドキュメントを読みなさい。
ちゃんと注意が書いてあります。
506デフォルトの名無しさん:2009/11/08(日) 22:17:39
>>504
NSXMLDocument つかえば?
507504:2009/11/09(月) 02:02:48
>>505
ありがとうございます。
もとのNSStringがreleaseされた時点でfreeされちゃうんですね。
うまくできました。

ドキュメントよく読みます。
508デフォルトの名無しさん:2009/11/09(月) 20:32:01
iPhoneの開発で初めてObjective-Cを使ったが、良いねこれ。
最初はメソッド呼び出しの[]がきめぇwwwwって感じだったんだが、
デフォでリフレクションできるのは良い。
C++よりこっちが普及していれば自分のプログラマ人生も幸せだったのかもしれない、
と思う今日この頃。
509デフォルトの名無しさん:2009/11/10(火) 13:06:25
リフレクションって何?
510デフォルトの名無しさん:2009/11/10(火) 13:52:19
RTTIのすげぇやつ
511508:2009/11/10(火) 15:25:49
つくづく思うのがC++のvirtualってナンセンス。
id型に何でもぶちこめるのもイイ。まさかCでこんな風に扱えるとはね。
メソッドのprivate/publicの定義ができなかったり不満もあるけど。
512デフォルトの名無しさん:2009/11/10(火) 15:31:08
それ、Cやない、Objective-Cや
513デフォルトの名無しさん:2009/11/10(火) 15:45:31
C拡張で、ってことでは。
514デフォルトの名無しさん:2009/11/10(火) 16:06:01
virtualがナンセンスだなんて思ったことないわ
515508:2009/11/10(火) 16:40:25
スクリプト言語になれると、基本、親のメソッドはなんでも置き換えられてあたりまえという考えに。
基本クラスが違ってもメソッドの名前と引数の型が一緒なら呼べてしまうのも何気にすごい。
それに甘えて使いまくると死ぬけど。
516デフォルトの名無しさん:2009/11/10(火) 16:58:33
どれもが同じ実装だったら、何も楽しくないじゃん
517デフォルトの名無しさん:2009/11/10(火) 19:21:36
既に C++ が存在しているって事は良い事だよね。
ああいうのが好きな人が楽しめる場所が別にあるから、
お互い邪魔せずに、こっちはこっちで自由にできる。
彼らはどう転んでも Smalltalk 風のオブジェクト指向を
消化できないだろうし、C++0x を見ていると、
対岸の火事で良かったなあと心から思う。
518デフォルトの名無しさん:2009/11/10(火) 20:08:39
無理して語ってる感がすごい
519デフォルトの名無しさん:2009/11/10(火) 20:14:35
ん、そうか?
前世紀から何度も繰り返し語られてる話だけどな。
520デフォルトの名無しさん:2009/11/10(火) 20:17:29
C++のメソッドをCの関数ポインタみたいに実行時バインドしようとすると
virtualのダメさが際立つな。あれはナンセンスと思う
Qtのシグナルスロットとかみたいに言語外の飛び道具が必要になるし
521デフォルトの名無しさん:2009/11/10(火) 20:18:48
いろんなことを混ぜ込めて、結局は何も言ってないみたいな
522デフォルトの名無しさん:2009/11/10(火) 20:22:27
伝わる人に伝われば良いんだよ。別に説得するつもりも無いし。
523デフォルトの名無しさん:2009/11/10(火) 20:26:00
いろんな言語使う人からすると実装の違いがおもしろいんだけどねえ
何か他の言語を否定しがちなのはもったいない感じがする
524デフォルトの名無しさん:2009/11/10(火) 20:26:50
ObjC 一本槍な人間が居るとでも?
525デフォルトの名無しさん:2009/11/10(火) 21:18:48
どんな言語にも欠点はあるし、多少叩かれてもカリカリしなくていいんじゃね
526508:2009/11/11(水) 16:00:50
そもそもobjCってmac、iphone開発くらいにしか使わないし、
WEBプログラミングでrubyかPHPかjava、どれでやるかって話にはならないよね。
で、自分はC++に10年以上お世話になってるが、
歴3ヶ月のobjCのが言語として優れてる気がしている。
なにげに[nil method1]でぬるぽにならないのもいいな。
527デフォルトの名無しさん:2009/11/11(水) 16:08:31
はいはい、もういいから。
528デフォルトの名無しさん:2009/11/11(水) 17:47:21
冷たいな(´・ω・`)
ObjCスレなんだから、もっと激しく愛を語ってもいいじゃないか。
529デフォルトの名無しさん:2009/11/11(水) 18:58:09
今更30年前に Smalltalk で実現されていたものについてだけ語られても反応に困る
.mm で boost:python と混ぜて使うのが最強ですよとかモダンな話をしようよ
530デフォルトの名無しさん:2009/11/11(水) 19:30:20
じゃあ追加して欲しい言語仕様の話でも
531デフォルトの名無しさん:2009/11/11(水) 22:00:46
[hoge method1] でマルチスレッドになりますか?
532デフォルトの名無しさん:2009/11/11(水) 22:01:49
最近 object_getInstanceVariable とかを知って悶絶しそうな程展望が開いて小躍りしてます。
533デフォルトの名無しさん:2009/11/11(水) 22:50:59
>>531
なりません
534デフォルトの名無しさん:2009/11/11(水) 23:17:52
>>532
reflection つきの オブジェクト指向言語なら出来て当たり前だろう
>>531
[hoge performSelectorInBackground:@selector(method1) withObject:nil]
でオッケー
535デフォルトの名無しさん:2009/11/12(木) 00:38:16
昔はこれだけで感動だった。

Smalltalk keys.

Lisp だと apropos とか。
536デフォルトの名無しさん:2009/11/12(木) 05:05:03
>>531
goなら可能
537デフォルトの名無しさん:2009/11/12(木) 08:51:40
Smalltalk で言ったら fork メッセージだな
538デフォルトの名無しさん:2009/11/12(木) 10:12:27
oneway voidなメソッドなら別スレッドで実行されてもいいよな
OSXのランタイムはそういう実装にはなってないけど
539デフォルトの名無しさん:2009/11/12(木) 12:00:19
>>538
APIが全て thread-safe な理想郷ならそれでもいいけど、
とつぜんあるメソッドが別スレッドで走られると困る事もあるよ

10.5 では NSOperation の concurrent オペレーションは
メインスレッドで動いてたのに、10.6 からそれも別スレッドで
走るようになったので嵌まったのでそういうのはこわいです。
540デフォルトの名無しさん:2009/11/13(金) 00:28:16
プロパティのデフォルトアクセサは nonatomic を指定しないかぎり
スレッドセーフだから多少のオーバヘッドには目をつむって自クラス内でも
インスタンス変数は常にプロパティ経由で触るみたいなスタイルが今後は
主流になるのかもね
541デフォルトの名無しさん:2009/11/13(金) 14:03:00
個々のインスタンス変数やプロパティの読み書きだけスレッドセーフにしても
あんまり意味ないから、主流にはならないと思う。
542デフォルトの名無しさん:2009/11/19(木) 17:25:51
iPhoneのSDKがらみの質問もここでしてよいのかな。
本体の傾きを求めるとかそういう話だが。
543デフォルトの名無しさん:2009/11/19(木) 17:49:22
だめ。↓辺りでやれ、

[SDK]iPhoneアプリ開発初心者質問箱3[touch]
http://pc11.2ch.net/test/read.cgi/mac/1254325417/
544542:2009/11/19(木) 18:49:07
mac板にあったんだ、iphoneじゃなくて・・・どもです
545デフォルトの名無しさん:2009/11/21(土) 20:36:11
ブロック構文ってなんじゃらほい。
546デフォルトの名無しさん:2009/11/21(土) 20:37:49
547デフォルトの名無しさん:2009/11/22(日) 21:09:36
NSStringの文字列"0"をASCIIコード10進数の48に変換するにはどう書けば良いのでしょうか?
548547:2009/11/22(日) 22:30:21
すいません、間違えました。
ASCIIコードの48をcharもしくはNSStringの0に変換するには
どう書けば良いのでしょうか。
549デフォルトの名無しさん:2009/11/22(日) 22:34:08
なんだこのゴミは
550デフォルトの名無しさん:2009/11/23(月) 02:56:15
>>549
まあまあ。将来有望な小学生が来たのかもしれんじゃないか。

>>548
で、その48は何で表されてんのかな?
551デフォルトの名無しさん:2009/11/23(月) 04:40:12
char c[128]={0};
c[0] = 48;
sprintf(c, "%c", 48);
NSString *nss = [[NSString alloc] initWithFormat:@"%c", 48];
552デフォルトの名無しさん:2009/11/23(月) 06:05:21
>>551
オイコラ、char c[128]ってどういうつもりだ。これだから最近の若いもんは・・・。
553デフォルトの名無しさん:2009/11/23(月) 06:29:27
>>552
えっ、何かマズいっすかね・・・
自分まだ初めて2ヶ月くらいなんです・・・
554デフォルトの名無しさん:2009/11/23(月) 07:34:23
Mac関連スレってどこも変な物言いのおっさんばっかりなんだよな
555デフォルトの名無しさん:2009/11/23(月) 08:34:48
>>553
>>551の2行目のようにchar型のデータが欲しいだけなら何もすることは無いので char c; c = 48; で十分だ。
もし3行目のように文字列として扱いたい場合でも今の場合なら一文字目 '0' == 48 と二文字目の '\0'
の分だけなので char c[2]; でよい。
それにchar c[2] = {0} のように書いた場合、2要素目以降は言語仕様上不定(実装上はほぼ確実に0にセットされるが)。
556デフォルトの名無しさん:2009/11/23(月) 08:36:27
なんだそんな話か
char c[4096];
とか平気でやってるぞ
557デフォルトの名無しさん:2009/11/23(月) 09:17:42
なんと愚かな!
558デフォルトの名無しさん:2009/11/23(月) 10:41:38
>>555
なーるほど。そういうことなら問題なっすぃん。
なんか48 61 65 71みたいな数値を文字列に直すのかなーとか思って多めにとっただけっすぃん。
559デフォルトの名無しさん:2009/11/23(月) 11:04:11
>555
悪意がないことを先にいっておく
>char c[2] = {0} のように書いた場合、2要素目以降は言語仕様上不定
なる理由はどこから
気になったので、規格書があればそのセクションをお願いします
560デフォルトの名無しさん:2009/11/23(月) 11:54:05
>>559
俺も気になったんで見たんだけど、
C99?だと、静的変数と同様の暗黙の初期化になるみたい。
それ以前のは規格書が見れない。
http://www.jisc.go.jp/
JISX3010のPDF96ページ辺り。
561デフォルトの名無しさん:2009/11/23(月) 12:36:40
>560
確認しました
確かに静的記憶域と同じと書いてありますね
562デフォルトの名無しさん:2009/11/23(月) 15:43:49
American National Standard Programming Language C
3.5.7 Initialization
Semantics
If there are fewer initializers in a list than there are members of
an aggregate, the remainder of the aggregate shall be initialized
implicitly the same as objects that have static storage duration.
563デフォルトの名無しさん:2009/11/24(火) 14:02:14
おまいら静的変数と同じとか遠回しなこと言ってないで、
>>555 は間違いで
char c[2] = {0}の様に書いた場合 2 要素目以降は c 言語の
仕様として 0 にセットされる、とストレートに指摘しろyo
564555:2009/11/25(水) 03:10:05
いい加減なことをいってスマンカッタ。
ヽ(`Д´)ノ ウワァァァン
そんなこと言ったら厳密なObjective-Cの規格書なんて無いんだよう(グチグチ
565デフォルトの名無しさん:2009/11/25(水) 03:10:53
往生際悪すぎ
566デフォルトの名無しさん:2009/11/26(木) 00:04:19
とはいえ、身を委ねたくはない仕様だな。
明示的に初期化しておきたい。
567デフォルトの名無しさん:2009/11/26(木) 00:30:36
明示的に bzero() とか memset() すると冗長だと言って怒る人もいる(いた)から難しいね…
568デフォルトの名無しさん:2009/11/26(木) 15:41:30
こんな基本的な仕様を信用できないなら、ただの代入とかも信用ならんし
関数呼び出しなんて高度なものは余計使えないんじゃないか?
569デフォルトの名無しさん:2009/11/26(木) 18:26:21
コンパイラにバグがあったりするんだよ
そういう経験から、冗長かどうかはともかく
おまじないとして書いている処理というのはある
570デフォルトの名無しさん:2009/11/26(木) 18:28:35
信用うんぬんじゃなくて、知らん人が多くて話がややこしくなるからだろ
みんな知ってりゃいいが >>567 みたいな理不尽なツッコミもありそうだし、
この流れみたいに話がこじれたらかなわん
571デフォルトの名無しさん:2009/11/26(木) 20:48:17
じゃ信用できるコンパイラ先輩が作ってくださいよwwwwww

ってやる夫顔で言ってやればいいんだよ
572デフォルトの名無しさん:2009/11/27(金) 10:52:05
クラス名からそのクラスのインスタンスを生成するにはどうするんでしょうか?
クラスオブジェクトの生成は結構見つかるんですけど、
Class cls = NSClassFromString(@"anyClassName");
クラスのインスタンス自体を生成するやり方を教えてください。

出来ない言語もあるけど、objective-cはいかにも出来そうですよね?
お願いします
573デフォルトの名無しさん:2009/11/27(金) 10:54:21
そこまで来てればあとはコンドーム一枚だぞ
574572:2009/11/27(金) 11:05:28
>>573
あれ?もしかして
id obj = [[cls alloc] init];
でいいんですか?
NSLogでのぞくと出来てるっぽいです。

class_createInstanceというのも見つけたけど上ので良いのかな。
575デフォルトの名無しさん:2009/11/27(金) 13:05:20
いいんです。
576デフォルトの名無しさん:2009/11/27(金) 13:57:42
こんなのも

Class class = NSClassFromString(@"AnClass");
SEL sel = NSSelectorFromString(@"aSelector");
id obj = [[[class alloc] init] autorelease];
[obj performSelector:sel];


プラグイン書くときはNSClassFromStringは便利だよね。
わざわざバンドルローダー指定する必要ないし。
NSSelectorFromStringの方はごくまれにしか使わないね。
AppleEventDispatchの実装部では使いまくってそうだけど。
577デフォルトの名無しさん:2009/11/27(金) 16:21:30
newとallocの違いが今イチ分からん。
578デフォルトの名無しさん:2009/11/27(金) 17:30:29
>>577
俺も俺も
てか乳って使ったことない。
579デフォルトの名無しさん:2009/11/28(土) 00:03:58
+newは+alloc -initと同義
580デフォルトの名無しさん:2009/12/01(火) 18:38:18
typedef enum {a,b} defA;

といった宣言をヘッダに記述し、これを他のクラスからimportして
defA a;

のように利用しようとすると、
"expected specifier-qualifier-list before 'c'"とエラーが
起きてしまいます。
どのように定義すれば良いのでしょうか。
581デフォルトの名無しさん:2009/12/01(火) 18:43:26
enum {
a,
b,
};
typedef NSInteger defA;
582デフォルトの名無しさん:2009/12/01(火) 19:24:09
>>580
ソース
583580:2009/12/01(火) 20:55:30
すいませんちょう単純な勘違いしてました。
他のヘッダが邪魔をしていて、importの前に書いたらうごきました。。
584デフォルトの名無しさん:2009/12/01(火) 23:11:37
Objective-Cって、メソッド名ひとつ考えるのにも英語力を要求してくるな。
こりゃ、そんじょそこらのなんちゃってプログラマに扱えるしろものじゃねーな。
585デフォルトの名無しさん:2009/12/02(水) 00:29:56
なんちゃってプログラマでも簡単に使えるよ。英語さえわかれば。
586デフォルトの名無しさん:2009/12/02(水) 00:50:29
>>584
別に日本語ローマ字書きでもいいじゃん
587デフォルトの名無しさん:2009/12/02(水) 04:06:03
辞書が存在していない時代だったらそう言えるかもしれないね。
588デフォルトの名無しさん:2009/12/02(水) 05:26:27
辞書の歴史は紙の歴史より古いからなあ。
589デフォルトの名無しさん:2009/12/02(水) 19:58:30
DataWoTuika:id KonoIchini:idx omake:option
590デフォルトの名無しさん:2009/12/02(水) 20:46:14
引数がkonochincoとomekoに見える
591デフォルトの名無しさん:2009/12/02(水) 21:10:19
けしからん奴じゃ
592デフォルトの名無しさん:2009/12/03(木) 19:40:15
NSStringにHTMLのソースが入ってるんですけど、
そこから<li>〜</li>の部分だけ抜き出したいと考えています。
ただ、それをどうやって実装すればいいのかが良く分からないです・・・。

今頭の中にある感じだと、<li>とマッチする最初の場所と
</li>とマッチする最後の場所を探して、その部分を抜き出すという方法なんですけど、
もっと簡単に正規表現みたいな感じでピュッと抜き出したりできないでしょうか?
593デフォルトの名無しさん:2009/12/03(木) 20:19:18
Google Toolbox for Mac の GTMRegex でも使え。
594デフォルトの名無しさん:2009/12/03(木) 21:59:37
まさかiPhone初心者スレで聞いてたやつじゃねーだろうな
595デフォルトの名無しさん:2009/12/03(木) 22:07:13
>>592
とりあえず簡単にやるならスキャナ使えば?

NSString *hoge = "hoge <ol><li>foo</li><li>bar</li></ol>";
NSScaner *scanner = [NSScanner scannerWithString:hoge];
while (YES) {
 NSString* itemString;
 if (![scanner scanUpToString:@"<li>" intoString:NULL]) break;
 if (![scanner scanUpToString:@"</li>" intoString:&itemString]) break;
 NSLog(@"item = %@",itemString);
}
596デフォルトの名無しさん:2009/12/04(金) 00:52:37
>>592
NSXML 使って XPath でピョッと
597デフォルトの名無しさん:2009/12/05(土) 22:45:14
なんか、releaseしなきゃならん場合としないでいい場合の違いが良くわからんわ。
本のサンプルとかみても、retainしてるのに、どこにもreleaseがなかったり、allocして
autoreleaseも呼んでるのに、deallocでreleaseもしてたりとか、もうわけわかめ。
なんじゃこりゃ、そんなに神経質にならなくてもいいのか?
598デフォルトの名無しさん:2009/12/05(土) 23:07:44
カウンタ使ってメモリ管理するなら当然覚えないと、意味不明なバグに遭遇することしきり。
自分は Instruments の Leaks 使って、可視化されたメモリリークを見ながら試行錯誤して覚えたけど。
599デフォルトの名無しさん:2009/12/05(土) 23:09:06
あと初心者は Build & 解析はかなり役に立つんじゃ。
600デフォルトの名無しさん:2009/12/06(日) 03:36:39
まずは
http://developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/4objc_runtime_overview/chapter_8_section_2.html
を読まんといかんよ。

iPhone じゃなくて Mac のプログラムならガーベジコレクション ON
にして retain/release 忘れるという方法もあります。

ただ、
>サンプルとかみても、retainしてるのに、どこにもreleaseがなかったり、allocして
>autoreleaseも呼んでるのに、deallocでreleaseもしてたりとか、もうわけわかめ。
これは本が間違ってるんじゃないの?何の本かわからんから何とも言えんが。
601デフォルトの名無しさん:2009/12/06(日) 06:55:11
>>597
そんな本あるなら晒してみろよ
602デフォルトの名無しさん:2009/12/06(日) 13:36:42
初期化するインスタンスメソッドの他に、勝手にAutoreleaseするクラスメソッドも
あったりするからちょっとややこしい。
603デフォルトの名無しさん:2009/12/06(日) 13:45:34
(あるクラスの init メソッド内で、インスタンス変数に代入するオブジェクトを)retainしてるのに、
(init 内の)どこにもreleaseがなかったり、
(そのクラスを)allocして autoreleaseも呼んでるのに、
(そのクラスの)deallocで(インスタンス変数を)releaseもしてたり

と解釈するとしたら、まったく正しいコードけど
604デフォルトの名無しさん:2009/12/06(日) 13:53:05
>>601
サンプルはあくまでサンプル。アプリまるごと完全詳解みたいのならともかく。
Obj-Cに限らず、その他言語のO'Reilly本やMSDNでも、
サンプルソースと現実的に推奨されるソースは異なる場合は多い。
参照カウンタの説明でretainしたものをreleaseしてないなら問題だと思うけど、
多分、別の説明で使用されているサンプルがそうなってるんでしょ。

>>602
>勝手にAutoreleaseするクラスメソッド
コンビニエンスコンストラクタのこと?
605デフォルトの名無しさん:2009/12/06(日) 14:10:04
>>604 あぁ多分それ
俺もこの辺、よく迷うわ。propertyの宣下にもretainやassignの指定があるから、
宣言をよく確かめて使わないとかいけないとか気を使うのがちょっと大変。

便乗質問なんだけど、あるクラス(A)で動的にView(B)を作って(alloc & init)、
別のView(C)にaddSubView した場合って、Aで明示的にBをreleaseする必要
があるんだっけ? それとも、Cの解放時にBも勝手にreleaseしてくれる?

606デフォルトの名無しさん:2009/12/06(日) 15:11:08
当然あるよ。
607デフォルトの名無しさん:2009/12/06(日) 15:34:14
>>606
何が当然あるか? Aで明示的にBをreleaseする必要があるという意味あるか?
608デフォルトの名無しさん:2009/12/06(日) 15:47:51
ないあるよ
609デフォルトの名無しさん:2009/12/06(日) 16:09:08
hoge = [[Hoge alloc] init]; // 1
[foo addHoge : hoge]; // 2



[foo release]; // 1

よってメモリリークになる。
だから、autorelease か add 後に [hoge release]; の必要がある、筈。
610デフォルトの名無しさん:2009/12/06(日) 16:37:49
わかったある。謝謝
611デフォルトの名無しさん:2009/12/06(日) 21:00:38
>>609
エ?こうしとけばリークにならねえだろ?
-(void)dealloc {
...
 [mHoge release]; // 0
 mHoge = nil;
...
 [super dealloc];
}
612デフォルトの名無しさん:2009/12/06(日) 21:02:19
そうか?
613デフォルトの名無しさん:2009/12/06(日) 21:17:35
そのdeallocは何をトリガーにして呼ばれるんだっちゅう
614デフォルトの名無しさん:2009/12/06(日) 22:15:11
>>611
だから、>>609はそうしろって書いてるじゃん
615デフォルトの名無しさん:2009/12/06(日) 22:25:14
自分が 609 だけど、foo が dealloc 時に hoge をリリースするのは、
addHoge: (addSubView:)には retain されてるから当然。

でもそれだと±1で、Hoge alloc init 時のカウント1をリリースされてないから、リークになる。
616デフォルトの名無しさん:2009/12/06(日) 22:44:59
まぁ、init時にautoreleaseつけとくのが無難かな
617デフォルトの名無しさん:2009/12/07(月) 00:14:08
無難とかそういう問題ではなかろう。
618デフォルトの名無しさん:2009/12/07(月) 00:45:02
>602 >605
initほげほげ、copyほげほげ は retain されて、
それ以外のメソッドは autorelease されたのが返ってくる。

[obj method:a]
としたばあいに、obj が a がずっと必要なら method 内部で retain するし、
いらなかったらそんなことはしない

だから、自分があるオブジェクト a を release すべきかどうかは、
自分が呼んだメソッド内でどうなっているかとかは気にしなくてよくて、
単に自分がいらなくなった時点で release すればよい。

まあリリース足りなければメモリ食うだけだけど、
リリースしすぎは一瞬でクラッシュするので、
きちんと理解して書くか、NSZombie でチェックするか、
release しすぎないようにしてください。
619デフォルトの名無しさん:2009/12/07(月) 01:19:21
ウィーッス
620デフォルトの名無しさん:2009/12/07(月) 13:31:55
>>618
newほげほげも忘れないであげてください
621デフォルトの名無しさん:2009/12/07(月) 17:53:50
雑談はスレチだよね。チラ裏すまん。

Objective-Cのオブジェクトの所有権ポリシーって、
(C++におけるメモリ管理と)やることは本質的に同じでありつつ
保守効率が格段に上がる優れた機構ではあるとは思うけど、

Objective-Cってどんなもんだろってちょっとイジってオナりたいとき、
一通り理解するまでとっかかりで苦労するねぇ。
C++慣れしてると、余計なお世話に感じてしまうっていうか。
なんだか好きになれない。
622デフォルトの名無しさん:2009/12/07(月) 17:59:43
まあ、今はGCがあるし
623デフォルトの名無しさん:2009/12/07(月) 20:34:51
iPhoneではGCが使えないらしい...ゾ
624デフォルトの名無しさん:2009/12/07(月) 22:15:56
Objective-Cのメモリ管理3原則
1. alloc,copy,retain,newしたインスタンスはreleaseする必要あり
2. 1した覚えの無いインスタンスは勝手にrelesaeしてはいけない
3. 1してないインスタンスはどこかでreleaseされるので、保持したい場合はretainかcopy
625デフォルトの名無しさん:2009/12/07(月) 22:28:22
add したら直ぐ release して良いのかと思ってたら、そうじゃないんだね
626デフォルトの名無しさん:2009/12/08(火) 00:43:52
>>621
オブジェクトプール+手動の参照カウントってのは、大昔の手法だよ。
人頼みだとバグが多くなるし、保守効率も下がる。だからメモリ管理コードを
一々書かなくて済むGCやスマートポインタが主流になってる。
模したSmalltalkみたいに最初からGC付きなら無かった機構だから>>622が正解
627デフォルトの名無しさん:2009/12/08(火) 09:22:55
でも、iPhoneがGCは無効なんでしょう?
ここにいる皆さんは、GC派とリファレンスカウンタ派、どちらが多いのでしょうか?
628621:2009/12/08(火) 11:17:45
あ、すみません、iPhoneアプリ開発でObjective-C処女喪失したもので。
iPhoneはGC無いです。
(ただ、あったとしてもiPhoneはメモリ極小なので、autoreleaseさえ極力避けるべきと公式で指摘されています。)

>>624の規則だけですが、解れば便利な@propertyと@synthesizeも、
とりあえずちょっとイジってみようレベルの初見だと、
iPhone画面にHelloWorld表示するだけのソースすら、
「@property(nonatomic,retain)何この呪文、この入門書じゃソース解説にも記述無いし、
とりあえず詳細確認は後だな...あれ??実装でretainなんてしてなくね??なんで??
(ポチッ)ちょww動いたwwwけどHelloWorldのソースすらイミフwwww」
みたいな。

結局、入門書はHelloWorldで挫折、とりあえずちょっとイジるだけのつもりが、
公式ドキュメントを片っ端から読み漁って十分理解してから、
入門書のHelloWorldのソースを見直したのはいい思い出。。。

チラ裏に長文、本当にスマンかった。
最後に、InterfaceBuilderについて。
見た目だけでVB.NETくらい優しいお母さん的IDEだろうと思って触ると、火傷するね。
629デフォルトの名無しさん:2009/12/08(火) 12:10:55
iPhone だと Hello World 如きに property つかわにゃならん訳?
630デフォルトの名無しさん:2009/12/08(火) 13:16:01
>>628
なんの入門書を読んだか知らんが、それはその入門書があきらかに悪いな
iPhone でプログラムやるには、
(古めかしいとか批判はいろいろあるかもしれないが、実際問題として)
retain/release ができなきゃ話にならない。
わかったつもりで通過すると絶対に意味不明なクラッシュをはじめて
あとで泣く羽目になるのに、説明しないなんてありえない。

とにかく変な入門書を掴んで失敗でしたね。
あなたが公式ドキュメント読める人で良かったですが。

あと、Interface Builder はふつうの(?)と違って、
コントロールダブルクリックしてもメソッド追加できないので、
その辺戸惑うかも知れませんが、ビューとコントローラの独立性が
自然に高まるようになってるのはいいところだと思います。

.Net やさんで iPhone プログラムはじめたひとはみんな
そう感じるみたいね。
http://dotnetaddict.dotnetdevelopersjournal.com/dcacs.htm
とか。
631デフォルトの名無しさん:2009/12/08(火) 18:47:31
今更だけど、

> オープンソースの現状について、おそらくは予想外の知られざる事実を明らかにした。
> 『Smalltalk』対『Objective-C』では? Smalltalk がほぼ3倍のコード量で勝利している。
http://japan.internet.com/webtech/20090724/12.html

オープンソースの括りだから負けただけだよな?
632デフォルトの名無しさん:2009/12/09(水) 12:41:07
>>629
いらないよ。コードなんて1行も書かなくてもHello Worldって表示するぐらいはできる。
完全に入門書が悪いわ。アップルの配布してるPDFのほうが数倍マシ。
633デフォルトの名無しさん:2009/12/09(水) 22:34:49
NSURLでhttp://www.xxx.com/foo/boo/index.htmlのようなURLから
index.htmlを抜き取るようなメソッドってないですかね?
スキームやホスト、アンカーなどを返すメソッドは見つかったのですが、
ファイル名を返すのが見つからないです・・・
634デフォルトの名無しさん:2009/12/09(水) 23:02:12
NSString (NSStringPathExtensions) の
- (NSString *)lastPathComponent;

でも使え。NSPathUtilities.h に定義されてる。
635デフォルトの名無しさん:2009/12/09(水) 23:13:06
>>634
ありがとうございます。
こんな便利なのがあったんですね。
というか、NSURLにもこのメソッドつけてほしいですねw
636デフォルトの名無しさん:2009/12/09(水) 23:14:08
10.6にはついてるみたいよ。
637デフォルトの名無しさん:2009/12/09(水) 23:25:55
ほんとだ。
- (NSString *)lastPathComponent AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER;
638デフォルトの名無しさん:2009/12/14(月) 01:49:22
NSStringをURLエンコーディングしたいと考えています。
例えば
てすと → %A4%C6%A4%B9%A4%C8
のようにしたいのですが

NSString *test = @"てすと";
[test stringByAddingPercentEscapesUsingEncoding:NSShiftJISStringEncoding];
NSLog(test);

のようにしても、
8C48B78C6
のように表示されてしまいます。これを%A4%C6%A4%B9%A4%C8のように表示するにはどうすればいいのでしょうか?
639デフォルトの名無しさん:2009/12/14(月) 01:58:22
NSLogが%をフォーマット文字と解釈して表示しちゃうせいだから気にしない
640デフォルトの名無しさん:2009/12/14(月) 02:00:28
1. ソースコード内に日本語文字列 @"にほんご" を書かない。
それによって出来た文字列がどうなるかの動作は未定義です!
(うまくうごくときもあるかもしれませんが、コンパイラのデフォルト設定が
次のバージョンでかわると一瞬でおかしくなる可能性があります。)
必ず Localizable.strings を使うようにしてください。

2. NSLog(test) というふうに書かない!NSLog の第一引数は
フォーマット文字列です。% があるとフォーマット指示だと解釈されます。
NSString* test = @"%@";
NSLog(test);
とすると、NSLog は %@ をフォーマットと解釈するために
スタック上に偶然あるポインタの先のオブジェクトっぽいものにアクセスして
異常終了しますよ!
必ず NSLog(@"%@", test)
としてください。
641デフォルトの名無しさん:2009/12/14(月) 02:02:39

NSString *test = @"てすと";
NSLog(@"%@", [test stringByAddingPercentEscapesUsingEncoding:NSShiftJISStringEncoding]);

2009-12-14 02:01:53.361 test[1467:a0f] %82%C4%82%B7%82%C6
642デフォルトの名無しさん:2009/12/14(月) 02:03:33
なるほどなるほど、勉強になります。
ちゃんと表記したらちゃんと表示されました。
今まで面倒くさがってNSLog(NSString変数)みたいに書いてましたが
今度からちゃんと書こうと思います。ありがとうございました。
643デフォルトの名無しさん:2009/12/14(月) 02:09:44
>>640
いつもの人乙
644デフォルトの名無しさん:2009/12/14(月) 02:20:58
>>640
1. だけど、
http://developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocLanguageSummary.html
によると、10.5 からは UTF-16 の文字列も大丈夫って書いてあるよ。
ただ、C のソースコードを何のエンコーディングで保存しているかと、
gcc の -fexec-charset, -finput-charset の設定によるので、
http://developer.apple.com/mac/library/documentation/DeveloperTools/gcc-4.2.1/gcc/Preprocessor-Options.html
僕は @"にほんご"は怖くて使う気になりませんが。
645デフォルトの名無しさん:2009/12/14(月) 02:24:31
>>638
というか URL のエンコーディングって ShiftJIS でいいんだっけ?
最近って真っ当なサイトなら UTF-8 じゃない? Wikipedia とか。
646デフォルトの名無しさん:2009/12/14(月) 02:26:25
RFCではUTF-8である"べき"とされているな
647デフォルトの名無しさん:2009/12/14(月) 10:11:57
10.5と10.6は、@"にほんご"は普通に使えてるなぁ。
ソースコードはデフォルトのままUTF-8。
648デフォルトの名無しさん:2009/12/15(火) 01:41:01
KVC で質問があります。class_addMethod で追加したセッタ、ゲッタが
valueForKey: から呼ばれないんですが、なぜでしょう?そういうもの?

サンプルコードは以下のとおりです (Obj-C 2 です)

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface Aho:NSObject
{
}
@property(retain) NSString*foo;
@end
@implementation Aho
-(id)getter
{
NSLog(@"getter:%@",NSStringFromSelector(_cmd));
}
-(void)setter:(id)obj
{
NSLog(@"setter:%@,%@",NSStringFromSelector(_cmd),obj);
}
649デフォルトの名無しさん:2009/12/15(火) 01:41:49
+(void)synthesizeSetterGetter:(NSString*)getterName
{
NSString*setterName=[NSString stringWithFormat:@"set%@%@:",[[getterName substringToIndex:1] uppercaseString],[getterName substringFromIndex:1]];
IMP getter=class_getMethodImplementation(self, @selector(getter));
class_addMethod(self, NSSelectorFromString(getterName), getter, "@:");
IMP setter=class_getMethodImplementation(self, @selector(setter:));
class_addMethod(self, NSSelectorFromString(setterName), setter, "@:@");
}
+(void)load
{
[self synthesizeSetterGetter:@"foo"];
}
@dynamic foo;
@end
int main(){
NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init];
Aho*aho=[[Aho alloc] init];
[aho foo];
[aho setFoo:@"bar"];
[aho valueForKey:@"foo"]; // ここで例外がでる
[aho setValue:@"bar" forKey:@"foo"];
return 0;
}
650デフォルトの名無しさん:2009/12/15(火) 02:51:37
valueForKey: はまずアクセサを探すはずなのにおかしいね。

@synthesize foo;
やって、

method_exchangeImplementations(class_getInstanceMethod(self, @selector(foo)), class_getInstanceMethod(self, @selector(getter)));
method_exchangeImplementations(class_getInstanceMethod(self, @selector(setFoo:)), class_getInstanceMethod(self, @selector(setter:)));

とかやるとちゃんと機能したけど、それは君の望むことじゃないか。
651デフォルトの名無しさん:2009/12/15(火) 10:25:12
class_addMethod(cls, sel, imp, types) の中の、types が間違ってるから。
typese は(リファレンスで確認してね)、"返り値", "self", "_cmd", "引数..." なので、
class_addMethod(self, NSSelectorFromString(getterName), getter, "@@:"); // ×"@:"
class_addMethod(self, NSSelectorFromString(setterName), setter, "v@:@"); // ×"@:@"
とやると動く。
652デフォルトの名無しさん:2009/12/15(火) 10:38:59
ついでに。+load で +synthesizeSetterGetter: を呼ぶとNSAutoreleasePoolがまだ
できてないタイミングなので、コンビニエンスコンストラクタを使うとリークする。
setterName = [NSString stringWithFormat:..]; の所。alloc + init + release を
使おう。それか、+load でやる代わりに +initialize で呼ぶとpoolが出来た後なので
コンビニエンスコンストラクタが使える。(分かった上でのサンプルならごめんよ)
653デフォルトの名無しさん:2009/12/15(火) 11:41:32
みなさんありがとうございます、
おかげでうまく行きました。
型のエンコーディングをわかってませんでした。
Pool の件もどうもです。まあ数個ぐらい
リークしてもよかんべ
という気持ちでしたが、いけませんね。

type encoding は method_getTypeEncoding
をつかった方がいいとも
職場で教えてもらいました...
マルチポストみたいになってすみません。

654572:2009/12/19(土) 15:58:57
質問させてください

中にNSMutableDictionaryのインスタンスを持っている独自クラスがあって
その中にどんなキーがあるかは不定です。

でそのインスタンスに対して
hoge.foo
のようにドットでプロパティを呼び出してNSMutableDictionaryのobjectForKeyにアクセスするようなことって出来ますか?

不定じゃなければそういうプロパティを作ってアクセッサを定義してやればイケそうな気もするけど・・

プロパティはコンパイル時の型チェックがあるのでダメそうな気がするんですが、見逃してることがあったら教えてください。
655デフォルトの名無しさん:2009/12/19(土) 16:53:38
できます。コンパイル時にウォーニングはどうしてもでるとおもいますが。
a.foo=b は[a setFoo:b] と、
b=a.foo はb=[a foo] と等価なので、
[a foo] をダイナミックに [a objectForKey:@"foo"] にかえてやればいいですが、
それには forwardInvocation: を使えばいいです。
http://www.mikeash.com/?page=pyblog/friday-qa-2009-03-27-objective-c-message-forwarding.html
とか参照。
656デフォルトの名無しさん:2009/12/20(日) 01:04:58
NSStringの中にxxx:yyyみたいな文字列が入ってます。
これからxxx、またはyyyを返すようなメソッドってないでしょうか?
xxxの中には:は含まれず、yyyの中には:が含まれている可能性があります。
要するの最初のコロンと、それ以降に文字を分けたいのです。
657デフォルトの名無しさん:2009/12/20(日) 01:18:01
rangeOfRegexとsubstringWithRangeでどうにかしました・・・
658デフォルトの名無しさん:2009/12/20(日) 01:19:11
NSScanner でググると良い
659デフォルトの名無しさん:2009/12/20(日) 06:50:02
>>658
で?
660デフォルトの名無しさん:2009/12/20(日) 07:18:18
>656-657と>659って同一人物なのか?

俺も普通にNSScannerでがりがりマッチング取ればいいだけ
だと思うんだが。
661デフォルトの名無しさん:2009/12/20(日) 11:48:34
>>660
いえ、同一人物じゃないですw
回答くれた人にそんな失礼な返事しないですよw

NSScanner使ったことないので、調べてきます。
Objective-Cというかオブジェクティブ志向のプログラミングは初めて間もないんですが、
結構クラス調べるのは楽しいですね。もっといっぱい知りたい・・・
662デフォルトの名無しさん:2009/12/20(日) 12:01:08
いいのかい?
俺はノンケでも構わず食っちまう男なんだぜ
663デフォルトの名無しさん:2009/12/20(日) 12:17:39
いいよ
664デフォルトの名無しさん:2009/12/20(日) 17:13:00
>>661
NSScanner でももちろん出来るけど、その目的ならNSString の
-(NSArray*)componentsSeparatedByString:(NSString*)separator
でやる方が楽かと。後ろは、NSArray の
-(NSArray*)subArrayWithRange:(NSRange)range で取り出して、
-(NSString*)componentsJoinedByString:(NSString*)separator で戻してやればいい。
665デフォルトの名無しさん:2009/12/20(日) 22:04:58
>>655
メッセージ式で呼び出すときはウォーニングだけで済むと思うけど、プロパティ構文は静的に解決できないとエラーになると思う。だから、プロパティでやるのは無理なんじゃないかな。メッセージ式で書けばいい話だが。
666654:2009/12/20(日) 22:36:59
>>655
ありがとうございます
遅レスすいません

別のところ(C言語で文字列の置換)でつまっていて、詳しくテストしてない状況です。ウォーニングはでるけどできるってことですね。試してみます。

リンク先も見てみます。ありがとうございます
667デフォルトの名無しさん:2009/12/21(月) 22:46:44
キー値コーディングってどんなケースで使うんですかねぇ。
なんか普通のアプリで積極的に使う場面って想像つかないんですけど。
フレームワークの開発とかで使うのかな。
668デフォルトの名無しさん:2009/12/21(月) 23:13:04
次の人が答えます
669デフォルトの名無しさん:2009/12/21(月) 23:14:48
KVC はそれほど自分で直接呼ぶもんじゃないと思いますが、
Cocoa のいろんな部分 (KVO,バインディング) でランタイムが統一的に
オブジェクトを弄れるための下支えになってます
例えば、ソースコードで -foo と -setFoo: を定義しておくと
nib ファイルの中からビューをコントローラのキー foo に
バインドできますが、その間の通信は KVC でやってるわけです。
670デフォルトの名無しさん:2009/12/21(月) 23:24:18
>>667
値が変更された通知が欲しいときに色々と使えるだろ。
たとえば、テキストフィールドが編集されたときに何かをしてみたり。

それから、特定のスクリプトを処理するときに、コードがかなり短くなる。
たとえば、自力でXMLをパースする、みたいなときは、大幅にソースが簡単になる。

まぁ、まずは日本語ドキュメントでも読め。
http://developer.apple.com/jp/documentation/Cocoa/Conceptual/KeyValueCoding/
671デフォルトの名無しさん:2009/12/21(月) 23:31:30
結構奥が深そうですね...ちょっとずづでも探ってみまする。
672デフォルトの名無しさん:2009/12/21(月) 23:32:42
>>667
一々 IBOutlet と Action をおいてセッターとゲッターを作るより、Interface Builder でどうこう出来る分生産性が上がる。
673デフォルトの名無しさん:2009/12/22(火) 22:36:38
すみませんが、質問になります。
Objective-CからCのqsortを呼ぶ事ってできるのでしょうか?
第4引数をどうすればよいのか、途方にくれてます。
よろしくお願いします。
674デフォルトの名無しさん:2009/12/22(火) 22:57:53
Cそのまんまだろ。それとも オブジェクトのメソッドでも突っ込む気か?
その場合は関数でラッパーすれば良いだけだけど。
675デフォルトの名無しさん:2009/12/22(火) 23:18:33
qsort_b って関数もあるぞ
676デフォルトの名無しさん:2009/12/22(火) 23:52:54
>>673
C の配列をソートするのなら、C そのままでしょ。
Objective-C のオブジェクトは、C配列にいれないほうがいいです。
NSString* a[10]; とか余程でなければ誰も使わないと思います... よね。
NSArray つかって、ソートするときは、
sortedArray... とかいうメソッドが一杯あるので。
677デフォルトの名無しさん:2009/12/22(火) 23:58:01
>>674
ありがとうございます。そのまんまなんですね。
関数へのポインタを@selectorでとかやってたら、混乱してしまいました。

>>676
そうですか。Objective-Cが独特なんで、なるべく標準を使いたいと思ったりするんですけど、
やっぱり駄目ですかねー。
678デフォルトの名無しさん:2009/12/23(水) 00:03:51
IMP とかそこら辺を学ぶと幸せになれるかも。
679デフォルトの名無しさん:2009/12/23(水) 00:06:47
iPhone様々ですか?
680デフォルトの名無しさん:2009/12/23(水) 00:08:51
>>877
Objective-C は C のスーパーセットだから。
C++ だって C でできる事はそのまま何でも出来るでしょ。

>そうですか。Objective-Cが独特なんで、なるべく標準を使いたいと思ったりするんですけど、やっぱり駄目ですかねー。
う〜ん、他の環境から Mac へ GUI だけ移植してるんなら、そういうのも判らなくないですが、
Mac / iPhone 用に一から書いてるなら諦めて Cocoa の使い方覚えたほうがいいと思います。
どうせ method の引数に文字列なら NSString, 配列なら NSArray を渡さないといけない事が
しばしばあるので、どうせ使い方覚えないといけなくなりますし。
681654:2009/12/24(木) 02:08:22
すいません。すれ違いなんですけど,
多分ここの人が詳しそうなんで、質問させてください。
xcodeでC言語の勉強をしてて、日本語の処理でつまったので教えてください。
#include <wchar.h>
int main(void)
{
wchar_t str[] = L"日本語だよ";
printf("%s\n", str);
printf("%S\n", str);
printf("%c\n", str);
printf("%C\n", str);
wprintf(L"%s\n", str);
wprintf(L"%S\n", str);
wprintf(L"%c\n", str);
wprintf(L"%C\n", str);

return 0;
}printfでマルチバイトのも文字列をあつかうにはどうすれば良いのでしょうか?上のコードは全部文字化けか出力できませんでした。xcodeのコンパイラって基本的にはgccなんですよね?その辺の情報を調べて上のように試してみたんですけど。

基本的にはNSStringをつかうので必要ないといわれればそれまでなのですが。
お願いいたします
682デフォルトの名無しさん:2009/12/24(木) 04:05:53
なんでココなんだよ。
自分でスレ違いって分かってるんだからC言語のスレ行けよw
そっちじゃいけない理由でもあるのか?
683デフォルトの名無しさん:2009/12/24(木) 07:43:02
gcc の設定の問題で、Obj-C とも Mac と関係ない話だから、適切なところへ行ってくれ
684デフォルトの名無しさん:2009/12/24(木) 12:58:46
はあ・・・低能さんって・・・
685デフォルトの名無しさん:2009/12/29(火) 20:32:37
なんだか文法がいちいち長ったらしくて萎えるんですけど..
文字列比較すんのに
if ([a compare:b] != NSOrderedAscending) {
 :
}
とか、めんどくせーし、英語に慣れてないとぱっとみどう比較してんのかわからんちゅーの。
VBだったら
if a >= b then
 :
end if
ちょーシンプル。ほんと萎えるよ。英語が分る人には読み易いのかもしんないけどさ。はぁ...挫折しそ
686デフォルトの名無しさん:2009/12/29(火) 20:45:32
>>685
そのVBの記述だとエンコーディング考慮出来ないじゃんw

C Stringで出来る所はそうすればいいし。そうでないところは
Foundationでやればいい。どちらも取れるんだから。
687デフォルトの名無しさん:2009/12/30(水) 02:16:37
>>685
英語の勉強になると思って頑張ってください。
物事こころの持ちようですよ。
挫折したければ挫折しても良いんだし。
688デフォルトの名無しさん:2010/01/11(月) 16:13:44
例えばオブジェクトAがあるオブジェクトBを中で生成(alloc)して帰す場合、そのオブジェクトBをreleaseするのはオブジェクトAの責任なんですよね?

で、そのオブジェクトBを配列で返すようなメソッドを書く場合
return [[NSArray alloc] initWithObjects:objectB, nil];
としてしまうと、だれが、このNSArrayをreleaseするのかってなっちゃいますよね?

つまり、この場合NSArrayもオブジェクトAのメンバ変数に保持しないといけないってことでしょうか?
689デフォルトの名無しさん:2010/01/11(月) 18:31:22
つ autorelease
690デフォルトの名無しさん:2010/01/14(木) 19:55:11
return [[[NSArray alloc] initWithObjects:objevtB, nil] autorelease];
とするか、
return [NSArray arrayWithObjects:objectB, nil];
とすべき。
691デフォルトの名無しさん:2010/01/15(金) 08:48:56
関係ないけど、s無し単数形の -[NSArray initWithObject:]もあるよ。
692デフォルトの名無しさん:2010/01/16(土) 21:17:35
最近 Objective-C 2.0 を始めたんですが、ガベコレについて質問です。

ガベコレって retainCount が 0 になったインスタンスを自動的に解放してくれるだけで、
retain, release によるメモリ管理は必要なんですよね?
NSAutoReleasePool でメモリ管理をしないでよくなった、という理解で良いでしょうか。
693デフォルトの名無しさん:2010/01/16(土) 21:35:39
全然違う。

ルートとなるNSAppから芋づる式に参照されてる(到達可能な)オブジェクトを保持し、
関連が無くなったオブジェクトを自動的に始末するシステムです。

http://journal.mycom.co.jp/special/2007/objectivec/002.html

参照カウントは使ってない。
694デフォルトの名無しさん:2010/01/16(土) 21:39:39
C++は0xとか模索されてて鋭意進化中だけど、Objective-C は 3.0 が出来るとしたら、どんな拡張になるのかな?
695デフォルトの名無しさん:2010/01/16(土) 22:34:26
特にこれといって欲しい機能もないしなあ。
名前空間くらいか。
696デフォルトの名無しさん:2010/01/17(日) 00:17:01
無名関数、ラムダ式、ジェネリックは欲しい。

ちゅうかC++ 0x のコンパイラなんぞ実装するベンダーあるのかね。
IDE込みで考えると、かなり大変そうだけ。
697デフォルトの名無しさん:2010/01/17(日) 00:21:47
詳しくは知らんのだが、ブロック構文はラムダ式の代わりにはならんの?
698デフォルトの名無しさん:2010/01/17(日) 00:27:04
>>696
>無名関数、ラムダ式、

無名関数とラムダって違うの?
Blocks のクロージャじゃダメなの?
699デフォルトの名無しさん:2010/01/17(日) 00:48:20
クロージャなんてものがあるのか。知らなかった。これ使いまくろ。
700デフォルトの名無しさん:2010/01/17(日) 00:52:45
>>696
>ジェネリック

動的束縛な言語にジェネリックって必要か?
701デフォルトの名無しさん:2010/01/17(日) 00:55:07
ジェネリック・プログラミングも、カテゴリを利用して出来るんじゃないの?
702デフォルトの名無しさん:2010/01/17(日) 00:55:52
Blocksなんて機能あったんだ? 荻原本にも書いてないやんけ!
703デフォルトの名無しさん:2010/01/17(日) 00:59:03
Dyna本にも書いてないよな、何故か知らないけど。
704デフォルトの名無しさん:2010/01/17(日) 06:02:50
本にのってないのは、block は snow leopard からの機能だからでしょ。

Objective-C の拡張というよりは C そのものの拡張という
位置づけにしたいらしいよ、Apple は。
まあ多分ほかにどこも採用しないから、
実質 Objective-C の機能という認識になるとおもわれるが...
705デフォルトの名無しさん:2010/01/17(日) 12:29:38
>696
フル実装はしばらくかかるかもしれないけど gcc も VC も既に機能の取り込みを始めてるし、
C99 と比べれば段違いだと思われ。
706デフォルトの名無しさん:2010/01/17(日) 12:30:28
木下本が出たのは雪豹後だったはず。
707デフォルトの名無しさん:2010/01/17(日) 13:17:37
>>706
違う。
708デフォルトの名無しさん:2010/01/17(日) 13:19:15
>>706
あれは マイコミジャーナルに長期連載されてたのを
まとめただけだから仕方がないね

せめて 2.0 ランタイムについて一章だけでも付け加えてくれたらよかったんだが、
あれを買って 10.6 で実際にやってみようとしてはまってるひとが
ときどきこのスレやら新 mac 板の Cocoa スレにでますね
709デフォルトの名無しさん:2010/01/18(月) 15:54:05
あるクラスが持つプロパティの属性をassignにするべきか、retainにするべきか、copyにするべきかで悩んでしまいます。
結局わからないから、とりあえずassignにしとけってことが多いです。
独立性の高いクラスの場合はretainで保持した方がいいのかなと思ったりするんですが...

何か指針みたいなものってあるんでしょうか? それとも経験的な勘でみなさん決めてらっしゃるんでしょうか?
710デフォルトの名無しさん:2010/01/18(月) 16:28:23
最終的にどのタイミングで release されるか、を考えておくべき。
711デフォルトの名無しさん:2010/01/18(月) 18:22:22
やっぱりオブジェクト型のプロパティはretainしてdeallocでreleaseしといた方が確実なんですかねぇ。
autoreleaseされたプロパティを渡される可能性もあるし。
となるとassignの使いどころって、数値型や文字列とかのプリミティブ型に対してってことになっちゃいますかねぇ...
copyは...ゔーん、まいっか。
712デフォルトの名無しさん:2010/01/18(月) 18:31:54
>>711
delegate や target など、 retain にすると循環参照でリークする人が
出そうなものは少し考えたうえで assign にしたりする。

知らぬ間に内容を変更されたくないオブジェクトで、 retain で受けると
mutable string を渡したあとで中身を変更する人がいるかもしれないな、
などと心配する暇があるときは copy。

面倒なときはどっちも retain にしといて使う側が気を付けることにする。
713デフォルトの名無しさん:2010/01/18(月) 19:08:42
あぁdelegateね、これは確かにサンプルとかみてもassignにしてあるのが多いですね。
まだ覚束ないですが、少し自分なりに整理できそうです。ありがとうございしました。
714デフォルトの名無しさん:2010/01/23(土) 21:09:44
Xcodeって「¥」と「¥」(バックスラッシュ)って区別されてんのね。どおりで¥n入れても改行せんわけだわ。
715デフォルトの名無しさん:2010/01/24(日) 00:09:40
XCode が、じゃなくて、標準のユニコードがそうなだけ
716デフォルトの名無しさん:2010/01/24(日) 17:01:56
C と c は区別したーい
717デフォルトの名無しさん:2010/01/27(水) 08:38:46
>>709
Google の Style Guide だと NSString なプロパティはとりあえず copy にしとけってことになってる
http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml?showone=Properties#Properties
718デフォルトの名無しさん:2010/01/27(水) 13:16:24
Google は最早 Apple の敵だが、参考にしよう。
719デフォルトの名無しさん:2010/01/27(水) 18:17:39
敵判定って空しくなるだけ。
720デフォルトの名無しさん:2010/01/28(木) 20:30:17
Googleは、アップル製品をアク禁できるんだから、Googleに戦う気があったら勝負にならない。
721デフォルトの名無しさん:2010/01/30(土) 18:30:28
- (int)hoge:(int)a;
みたいなメソッドを、performSelector:withObject: のように(SEL)と引数を与えて動かす方法ってないのかな?
int を NSNumber にするしかない?
722デフォルトの名無しさん:2010/01/30(土) 19:31:34
>>721
面倒くさいが、NSInvocation を作って動かすとか。
id invocation = [NSInvocation invocationWithMethodSignature:
 [piyo methodSignatureForSelector:@selector(hoge:)]];
int arg = 1;
[invocation setArgument:&arg atIndex:2];
[invocation invoke];
int rtn;
[invocation getReturnValue:&rtn];
723デフォルトの名無しさん:2010/01/30(土) 19:34:24
ターゲット設定してなかった。[invocation setTarget:piyo] をやるか、
[invocation invokeWithTarget:piyo];
724デフォルトの名無しさん:2010/01/31(日) 17:59:29
>>722-723
NSInvocation って以前見かけて、結局使い道が分からなくて放置してたクラスだけど、色々調べてみます。
ありがとう。
725デフォルトの名無しさん:2010/01/31(日) 23:32:14
>>720
Macユーザのシェアがごっそりなくなるから無理だろうな。
726デフォルトの名無しさん:2010/02/01(月) 22:47:01
それはぶっちゃけ言うほど痛くない
727デフォルトの名無しさん:2010/02/02(火) 02:14:29
Google使えなくなったら大部分は乗り換えるだけ。
728デフォルトの名無しさん:2010/02/02(火) 04:10:35

Google社員にもMac愛好家くさるほどいんのにそんな誰得の展開になるわけないだろ
使えなくしたらグーグルの勝ち〜とか発想が幼稚すぎるわ

おまえらなんでそんなに頭悪いの
とてもプログラミングできるような頭じゃないと思うんだがなんでこのスレにいんの
 
729デフォルトの名無しさん:2010/02/02(火) 05:14:53
キミ凄いね
730デフォルトの名無しさん:2010/02/02(火) 07:58:20
社員の趣味と企業戦略を一緒くたにして話す奴も大概頭悪いと思う
731デフォルトの名無しさん:2010/02/02(火) 21:09:37

なんでプログラマやデザイナやミュージシャンとかクリエイティブなやつらにMac使いが多いか考えたことないだろ
Macを除外する企業戦略とかニートや低脳厨房の発想
 
732デフォルトの名無しさん:2010/02/02(火) 21:20:13
理由は唯一つ
お洒落だからですが何か
733デフォルトの名無しさん:2010/02/02(火) 21:55:20
プログラマはねーよww
734デフォルトの名無しさん:2010/02/02(火) 22:03:39
(クリエイティブな)ブログラマってことだろ
735デフォルトの名無しさん:2010/02/02(火) 22:54:44
>>731
デザイナーとミュージシャンにMacが多い理由は、割れの巣窟だったから。
写真屋とか、9割が違法コピーって言われてた。
736デフォルトの名無しさん:2010/02/02(火) 22:57:15
開発環境がそっくり入ったUNIXマシンなんだからプログラマが選んでも
何の不思議も無いと思うが
737デフォルトの名無しさん:2010/02/02(火) 23:39:43
Googleの中の人とか、Ruby on Railsの人とか、イケテルプログラマはMac使いが多いね。
738デフォルトの名無しさん:2010/02/02(火) 23:45:06
Linus ってイケてたっけ?
739デフォルトの名無しさん:2010/02/02(火) 23:45:47
PDFをネイティブにサポートしてるからPDFのドキュメントも読み易いしね。
あとLeopard以降は64bitアプリそのまま使えるから、64bit版OSインストール
し直しなんて手間も要らない。
740デフォルトの名無しさん:2010/02/03(水) 00:07:30
MacはUNIXなんだから、ドザじゃないまともなプログラマはMac使う
741デフォルトの名無しさん:2010/02/03(水) 00:21:08
犯罪者が必死だな。
742デフォルトの名無しさん:2010/02/03(水) 00:42:40
あらやだ
くやしいんですね
だいじょうぶですよ
がんばって知能つけましょうね
743デフォルトの名無しさん:2010/02/03(水) 00:46:49
カンファレンスや勉強会に行くと、もう過半数がMacだなぁ。
発表者なんか下手すると9割くらいMac。サポートがしょぼいはずのJava系ですら半分がMac。
個人的に、2kgを超えるモバイルマシンなんざありえねぇと思ってるので、正直理解できん。Airは中途半端すぎるし。
744デフォルトの名無しさん:2010/02/03(水) 02:01:37
個々は GNUStep, Cocotron もふくめた Objective-C のスレですよ!
Mac の話題なんてとんでもない!ぷんすか
745デフォルトの名無しさん:2010/02/03(水) 02:03:36
StepStone ってどうなったんだっけ?
746デフォルトの名無しさん:2010/02/03(水) 02:09:05
>>745
NeXT が Objective-C の権利を買い取ったあともしばらく存続してたけど、
消滅したらしい
http://en.wikipedia.org/wiki/Stepstone
747デフォルトの名無しさん:2010/02/03(水) 10:40:00
プログラマは、技術的に面白い物は全部触ってみたくなる人種だ。
OSXとLinuxとWindowsが全部動くマシンがMacしかない以上、
他に選択肢は無い。
電話もiPhone持ちが大半だが、加えてAndroidも持ってたりするぞ。
748デフォルトの名無しさん:2010/02/03(水) 14:03:23
複数持つだけ
全部動くからという理由じゃ選択しないよ
749デフォルトの名無しさん:2010/02/03(水) 20:20:42
一人暮らしでもマシンが複数台あってLANでつながってるのが当たり前だと思うんだが。
750デフォルトの名無しさん:2010/02/03(水) 20:23:22
最近は仮想マシンでも十分な性能が出るから、うちはハードは1台だよ。
751デフォルトの名無しさん:2010/02/03(水) 21:08:12
はーどうしたどうした
752デフォルトの名無しさん:2010/02/04(木) 13:31:58
>>750
新しい機種を導入するたびに前のは破棄してるのか
753デフォルトの名無しさん:2010/02/04(木) 15:11:30
>>752
中古屋に売ってます
754デフォルトの名無しさん:2010/02/04(木) 16:40:22
CocotronでWin用のアプリ作ってみたひといませんか?
実用的ならうれしい。
755デフォルトの名無しさん:2010/02/06(土) 22:18:35
初心者です。質問させてください。
stringWithCStringを使うと、コンパイル時に
warning: ‘stringWithCString:’ is deprecated
がでました。

stringWithCStringの代わりに何を使うのがよいですか?
756デフォルトの名無しさん:2010/02/06(土) 22:26:32
Xcodeのヘルプメニューからたどれるドキュメントを読みましょう。
またはメソッド名 (stringWithCString:) のところでOption+ダブルクリック
757デフォルトの名無しさん:2010/02/07(日) 00:20:28
初心者はこのスレに来るな
758デフォルトの名無しさん:2010/02/07(日) 00:31:21
え〜っ、なんで?
759デフォルトの名無しさん:2010/02/07(日) 00:35:52
>>752
他人にあげたり、捨てたり、死蔵したり

>>755
>stringWithCStringの代わりに何を使うのがよいですか?

stringWithCString:encoding:
760デフォルトの名無しさん:2010/02/07(日) 14:33:01
複数のPCがあっても仮想マシン導入して、前のは捨てるのか。
どのくらいのペースで買い替えてるんだろう。

うちはしょっちゅう買ってるから1人暮らしなのにPCは常時7〜8台あるわ
761デフォルトの名無しさん:2010/02/07(日) 18:16:51
もはやPCを買うことが目的になってるな。
762デフォルトの名無しさん:2010/02/07(日) 20:04:59
>>758
冗談でつ
でも質問が下らな過ぎてちょっとうんざりした。最近はドキュメント読まないゆとりが増えたのかなー。
763デフォルトの名無しさん:2010/02/08(月) 01:52:54
>>762
うちはこないだ新人向けに調べ方の調べ方マニュアルを作ったな。
よくあるのがググる先生に頼りすぎて、ヘルプや付属ドキュメントを読まないとか。
764デフォルトの名無しさん:2010/02/08(月) 02:42:50
調べ方マニュアルじゃなくて、
調べ方の調べ方マニュアル、なのか?それはメタだなぁ...
765デフォルトの名無しさん:2010/02/09(火) 12:59:27
メタメタにしてやんよ
766デフォルトの名無しさん:2010/02/09(火) 14:39:02
お願いします。
767デフォルトの名無しさん:2010/02/09(火) 15:28:42
メメタァ
768デフォルトの名無しさん:2010/02/09(火) 18:00:04
うわあああああぁぁぁああああ!!!
769デフォルトの名無しさん:2010/02/09(火) 18:32:17
バルス
770デフォルトの名無しさん:2010/02/09(火) 18:44:24
ふぅ..
771デフォルトの名無しさん:2010/02/15(月) 02:45:53
Objective-C入門3日目の初心者です。
フォルダのファイル一覧を、とりあえずコンソールに出してみようとしています。
本やWebを参考にして次のようなコードを書いたのですが、エラーがありうまくいきません。
添削していただけないでしょうか。

初心者は来るなってことだったのですが、
Objective-C初心者はどのあたりにいけばよいでしょう?

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
NSString *rootpath = @"/Public";

BOOL result = YES;
NSArray *contents = [[NSFileManager defaultManager] directoryContentsAtPath:rootpath];
int i;
for (i = 0; i < [contents count]; i++) {
NSString *name = [contents objectAtIndex: i];
NSString *path = [dirPath stringByAppendingPathComponent:name];
BOOL isDir;
NSLog(@"\n%@", path);
}
return 0;
}
772デフォルトの名無しさん:2010/02/15(月) 03:13:08
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
NSString *rootpath = [NSHomeDirectory() stringByAppendingPathComponent : @"Public"];
NSArray *contents = [[NSFileManager defaultManager] directoryContentsAtPath : rootpath];

for (NSString *name in contents)
NSLog(@"%@", [rootpath stringByAppendingPathComponent : name]);

[pool release];

return 0;
}
773デフォルトの名無しさん:2010/02/15(月) 09:47:18
一見して良いように見えるが、どんなエラーがでるの?
僕らだってエスパーじゃないから、「エラーがでます」じゃわからんよ。
コンパイルエラーならコンパイルエラーを書き写してもらわんと困るし、
実行時のエラーならどんなエラーなのか書いてください。
「エラーがでます」とだけここに書き込むのは、
エラーが出て、エラーメッセージを解読する気がないという気がします
それではプログラムは上達しませんよ。

単に ~/Public になんもファイルがないだけでは、と言う気がします。
774デフォルトの名無しさん:2010/02/15(月) 10:58:25
>>772
おお。ありがとうございました。
早速実行したところ、
warning: 'directoryContentsAtPath:' is deprecated (declared at /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSFileManager.h:164)
と警告が出てビルドできませんでした。
これは、どこを見ればよいのでしょう?
というか、NSFileManager.hの164行なんだと思うので、
見たところ、

- (NSArray *)directoryContentsAtPath:(NSString *)path DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;

という行でした。
NSString *rootpath = [NSHomeDirectory() stringByAppendingPathComponent : @"Public"];

NSString *rootpath = [[@"~" stringByExpandingTildeInPath] stringByAppendingPathComponent : @"/Public"];
などいくつか試したのですが、どうしてもうまくいきません。
775デフォルトの名無しさん:2010/02/15(月) 11:56:23
英和辞書をお奨めする
776デフォルトの名無しさん:2010/02/15(月) 12:29:09
雑談と初心者いじりしかやらないよねMac系の開発スレって
777デフォルトの名無しさん:2010/02/15(月) 12:57:21
このレベルから教えるのは正直きっついな
778デフォルトの名無しさん:2010/02/15(月) 13:17:01
警告だからコンパイルは一応通ってるんじゃないの?
OS 10.5以降は非推奨メソッドだから使わないでねって警告なんじゃないの?
779デフォルトの名無しさん:2010/02/15(月) 14:01:11
>>774
コンソールを表示してみ。

> ビルドできませんでした。

嘘付かないでね。
780デフォルトの名無しさん:2010/02/15(月) 14:10:21
>>776
これがわからないってことは、リファレンスどころか警告すら読めてないってことでしょう。
その状態でObj-Cで開発やるのはかなり厳しいよ。

で、「(やる気があるのなら)英和辞書をお奨めする」ってことなんだけどな。

それとも警告出るたびに聞きに来るの?
781デフォルトの名無しさん:2010/02/15(月) 14:31:03
そういうレスだけは饒舌だなw
782デフォルトの名無しさん:2010/02/15(月) 15:24:34
まぁまぁ^^;
783デフォルトの名無しさん:2010/02/15(月) 18:49:27
むしろ
「Cocoaスレに行け」とか
「Mac プログラミングスレに行け」
って言われなかったのが奇跡だな…
# Foundation Framework ネタはどこが適切なんだろ…?
784デフォルトの名無しさん:2010/02/15(月) 18:58:27
内容ジャンル的にはここでも問題ないと思うが、このレベルの無知無知初心者を相手にするのも大変だろう。
785デフォルトの名無しさん:2010/02/15(月) 19:04:11
deprecatedはもうすぐなくなるよってこと。今はまだある。
これはすごく親切な警告。

なのでdirectoryContentsAtPath:をopt+ダブルクリックしてみる。リファレンスが表示される。

Special Considerations
Because this method does not return error information, it has been deprecated as of Mac OS X v10.5. Use contentsOfDirectoryAtPath:error: instead.

って書いてあるので代わりに
contentsOfDirectoryAtPath:error:
を使う。
786デフォルトの名無しさん:2010/02/15(月) 19:05:44
調べ方教えたんだから同じ内容ではもう来るなよ
787デフォルトの名無しさん:2010/02/15(月) 19:44:43
>>775-786
まあそうおっしゃらずに、
もうすこしおつきあいいただけないでしょうか。

さきほどのファイル一覧は、あらためてプロジェクトを作り直したら、問題なく動きました。
一覧も取得できました。

失敗したときは、まだトライ&エラーの段階なので、
ひとつのプロジェクトのソースを全選択して、
消しては新しいソースを貼りつけて、
実行していたのです。

ソースじたいは変更していないのですが、
ともあれお騒がせしました。

で、次なのですが、いちおう辞書片手に読んでますけど、
(1)デバッグ中に変数に代入されているデータを見る方法
(2)コンソールコマンドから、テキストエディタとかのGUIアプリケーションを実行できるのか?
の2点を教えていただけないでしょうか。

(1)ブレークポイントを設定してみるものの、
そのデータが具体的になになのか、確認するには、
どこのメニューでどれを見ればよいのでしょう?

(2)ソースは次のとおりで、実行すると、デバッガコンソールでいろいろ表示したあと、
(gdb)というモード? になり、期待していたように、
テキストファイルをテキストエディタで表示はしませんでした。

そもそもこういう方法で、外部のアプリケーションを起動できるんでしょうか?
アドバイスお願いします。
788デフォルトの名無しさん:2010/02/15(月) 19:46:20
#include <Foundation/Foundation.h>

int main() {
NSTask *noteTask = [[NSTask alloc] init];
NSMutableArray *noteArgs = [NSMutableArray array];

NSString *path;
path =[[NSHomeDirectory()
stringByAppendingString:@"Public/tmp.m"];

// configure note
[noteArgs addObject: path];
[noteTask setLaunchPath: @"/Applications/TextEdit.app/Contants/MacOS/TextEdit"];
[noteTask setArguments: noteArgs];

// launch applications
[noteTask launch];

// wait applications
return 0;
}
789デフォルトの名無しさん:2010/02/15(月) 20:03:01
>>787
(1)
ブレークポイントで停止したら適当な変数名にカーソル合わせる
またはデバッガコンソールで p コマンドか po コマンド使う
p は C の基本データ型、 po は ObjC のオブジェクトの内容を表示する
p intVar
po object
po [object value]
てな具合
あとは help コマンドで調べて

(2)
>[noteTask setLaunchPath: @"/Applications/TextEdit.app/Contants/MacOS/TextEdit"];
Contants じゃなくて Contents な
「いろいろ表示」された中に手掛かりが書いてある、ちゃんと読めよ
790デフォルトの名無しさん:2010/02/15(月) 22:17:46
親切だなぁ
791デフォルトの名無しさん:2010/02/15(月) 22:27:00
>>789
ありがとうございました。
792デフォルトの名無しさん:2010/02/18(木) 23:36:01
Objective-C気持ち悪い
793デフォルトの名無しさん:2010/02/18(木) 23:48:27
テキストフィールドに入っている文字のバイト数が一定値以上だったらエラーを出したいのですが

NSLog(@"OK %d", MAX_TITLE_LENGTH-strlen([[tfThreadTitle text] cStringUsingEncoding:NSShiftJISStringEncoding]));

if(MAX_TITLE_LENGTH-strlen([[tfThreadTitle text] cStringUsingEncoding:NSShiftJISStringEncoding])<0)
{
  NSLog(@"haitta");
  return;
}

その一定値を超えてもこのif文に入ってくれません。
NSLogで数値の確認をしてみたのですが、-2となっているのにも関わらず、
直後のif文の判定を素通りしているようです。何が原因なのでしょうか。。助けてください。。
794デフォルトの名無しさん:2010/02/19(金) 01:12:12
>>793
NSStringのUTF8Stringを使ってconst char *型の文字列の先頭ポインタを取得して使う。
795デフォルトの名無しさん:2010/02/19(金) 01:55:56
>>793
strlen の戻り値は符号なしだから、> の左辺はマイナスにならないよ。
if (strlen(...) > MAX_TITLE_LENGTH)
と書くべき。C 言語からやり直しだね。  
796デフォルトの名無しさん:2010/02/19(金) 02:25:05
>>794-795
ひゃあ、ありがとうございます。
strlenの戻り値はunsignedなんですね。。。
ありがとうございました。
797デフォルトの名無しさん:2010/02/19(金) 06:08:41
NSString*を返り値として返す関数があるのですが、

NSString* func()
{
NSString *str = [[NSString alloc] initWithFormat:@"%d", 1];
return str;
}

例えばこういう場合って、どうすればいいのでしょうか?
releaseしたらreturnできませんし、returnしたらreleaseできませんよね?
798デフォルトの名無しさん:2010/02/19(金) 06:25:45
>>797
まさにそういう時のためにautoreleaseがあるのだよ
799デフォルトの名無しさん:2010/02/19(金) 08:16:29
お〜autorelease!!
ありがとうございます!
[[[NSString alloc] initWithFormat:@"%d", 1] autorelease];
でいいんですよね!ありがとうございますっ!
800デフォルトの名無しさん:2010/02/19(金) 08:23:43
この場合stringWithFormatもあるけどな。
801デフォルトの名無しさん:2010/03/03(水) 23:55:05
iPhone作りたいんですけど、なにせwin野郎なんでMac全然勝手が分かりませんw
とりあえずiPhone用の開発環境揃えたいんですけど、お勧めセット一式誰かお願いできますか?
あと、windows系とのネットワークファイル共有って簡単にできるでしょうか?
802デフォルトの名無しさん:2010/03/03(水) 23:57:28
まだ、ソフトもハードも無いので、勧めセット一式はソフトハードセットでお願いできるとありがたいです。
803デフォルトの名無しさん:2010/03/04(木) 00:00:59
スレ違い。死んでくれ。
804デフォルトの名無しさん:2010/03/04(木) 00:01:26
Objective-C気持ち悪い
805デフォルトの名無しさん:2010/03/04(木) 00:03:08
じゃあ Objective-C は代わりにおじさんがやっておくわ
806デフォルトの名無しさん:2010/03/04(木) 00:04:27
Appleて、現代的な言語作ってないんだよな
807デフォルトの名無しさん:2010/03/04(木) 00:05:47
ObjC が最強過ぎるからな
808デフォルトの名無しさん:2010/03/04(木) 00:11:26
Objective-Cなんて糞は正直触りたくない
809デフォルトの名無しさん:2010/03/04(木) 00:15:36
代わりに俺が触っておくから、寝てて良いよ
810デフォルトの名無しさん:2010/03/04(木) 00:19:24
お前に触られるぐらいなら死んだ方がまし
811デフォルトの名無しさん:2010/03/04(木) 00:21:25
いや、お前を触るわけじゃねえw
812デフォルトの名無しさん:2010/03/04(木) 00:25:01
>>803-811
マジ頭おかしいんじゃね、お前ら
樹海にいって首つって死ね
813デフォルトの名無しさん:2010/03/04(木) 00:26:21
iPhone作りたいんですけど、なにせwin野郎なんでMac全然勝手が分かりませんw
とりあえずiPhone用の開発環境揃えたいんですけど、お勧めセット一式誰かお願いできますか?
あと、windows系とのネットワークファイル共有って簡単にできるでしょうか?
まだ、ソフトもハードも無いので、勧めセット一式はソフトハードセットでお願いできるとありがたいです。
814デフォルトの名無しさん:2010/03/04(木) 00:26:55
>>802
ソフトは登録してダウンロードするだけだよ
ハードは現行機種なら何でも良いけど、メモリ多めの方が何かと良いよ
815デフォルトの名無しさん:2010/03/04(木) 00:34:15
>>801-813
このスレ荒らして何の得がある……
816デフォルトの名無しさん:2010/03/04(木) 01:28:26
>>813
iPhone作りたいなら中国の工場に就職しろ
817デフォルトの名無しさん:2010/03/04(木) 01:57:20
>>813
こんな質問してるくらいだから、多分無理なんだろうな。
下手に教えないほうがいいぞ。手を出し始めたらこのスレがくだらない質問であふれかえってしまう。
818デフォルトの名無しさん:2010/03/04(木) 02:48:17
>>813
MacProとCinemaDisplayオススメ
あとFinalCutStudioとLogicかな。
なんやかや結局揃えるハメになるので最初にまとめて買っておくが吉。
ノートで十分とか言う奴がたまにいるが、デスクトップだとアプリのビルド時間が断然早く作業効率が非常に良い。
Windowsとの共有は簡単にできるよ。
819デフォルトの名無しさん:2010/03/04(木) 13:30:42
とりあえずインテルのMac mini買えばあとはオンラインで全部そろう
それでエミュレーションで動かしてから考えるといいんじゃないかな
820デフォルトの名無しさん:2010/03/04(木) 15:41:41
>>818
どもどもです、とりあえずそれでいってみようかと思います。
リソースの編集もMac側でやった方が効率いいですかね?
コードだけそっちで作ってみようかと目論んでいたのですが・・・
821デフォルトの名無しさん:2010/03/04(木) 16:16:18
>>820
どっちでもいい。
あと最初にしっかりガンマ特性や色温度の管理うぃやっておけば、
実機で印象が変わったりジャギーが目立つ等の問題も避けられる。
(ある程度までは、だけど)
822デフォルトの名無しさん:2010/03/05(金) 17:22:02
>>818
アプリのビルド時間が早くなるって、どういうことだ?
823デフォルトの名無しさん:2010/03/05(金) 18:21:28
マシンの性能差だろ。
824デフォルトの名無しさん:2010/03/07(日) 01:53:25
iPhone用のアプリを作っていますが、NSDictionaryの使い方で悩んでいます。

以下の1行で、プログラムの実行が異常終了してしまいますが、理由がわかりません。どなたかヒントをいただけませんか?

sControls = [NSDictionary dictionaryWithObjectsAndKeys: display1, card1, display2, card2, display3, card3, display4, card4,nil];

ただし、
IBOutlet UILabel *display1;
IBOutlet UIButton *card1;
IBOutlet UILabel *display2;
IBOutlet UIButton *card2;
IBOutlet UILabel *display3;
IBOutlet UIButton *card3;
IBOutlet UILabel *display4;
IBOutlet UIButton *card4;
です。

最初は、card1〜card4のいずれかがnilで、その結果NSInvalidArgumentExceptionが起きているのでは?とデバッガで値を検査しましたが、そうではありませんでした。
825デフォルトの名無しさん:2010/03/07(日) 01:55:31
デバッガのコンソールメッセージは以下の通りです。
よろしくお願いします。

2010-02-24 00:15:27.446 XXXXXXXXXXX[69972:207] *** -[UIRoundedRectButton copyWithZone:]: unrecognized selector sent to instance 0x3b14a50
2010-02-24 00:15:27.447 XXXXXXXXXXX[69972:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIRoundedRectButton copyWithZone:]: unrecognized selector sent to instance 0x3b14a50'
2010-02-24 00:15:27.449 XXXXXXXXXXX[69972:207] Stack: (
29258843,
2531099913,
29640763,
29210230,
29062850,
28990666,
28990186,
28988857,
10209,
3209026,
9269,
2692555,
2730422,
2718516,
2700927,
2728033,
37354841,
29043584,
29039688,
2694677,
2731951,
9184,
9038
)
826デフォルトの名無しさん:2010/03/07(日) 03:14:30
一旦MutableDict 作って、一個ずつKey と Objectを設定してみろ。
827デフォルトの名無しさん:2010/03/07(日) 03:44:06
>>824
keys must conform to the NSCopying protocol
828デフォルトの名無しさん:2010/03/07(日) 19:35:03
メソッド名を良く読めって話だな。割と罠ポイントだとは思うがw
829デフォルトの名無しさん:2010/03/18(木) 02:05:24
もうvisual studioもeclipseも触りたくない。
830デフォルトの名無しさん:2010/03/18(木) 10:14:51
そんなあなたにNetBeans
831デフォルトの名無しさん:2010/03/20(土) 09:23:49
832デフォルトの名無しさん:2010/03/20(土) 09:43:57
ニコ厨死ねよ
833デフォルトの名無しさん:2010/03/20(土) 23:17:05
口半開きってやっぱダメだな
834デフォルトの名無しさん:2010/03/22(月) 18:03:17
あの、ポインタに対して使う * っていうのは、内容を複製して渡すのでしょうか?

例えば、NSTextField* field があったとして、

isnumber(*[field.text UTF8String])

としたとしますよね。この場合、[field.text UTF8String] だけで渡そうとすると
ポインタだからダメ、みたいな感じで怒られますが、*を付けるという事は
その中身を渡すという事ですよね?

中身を渡すというのは、そのポインタが指す中身を複製してその関数に渡して
いるのでしょうか?

質問がうまく伝わっていなかったらすみません。どうも中身を渡すというのが
どういう意味なのかがよく分からなくて…。Objective-C 以前に C が分かって
いないのでおかしな事を言っていたらすみません。
835デフォルトの名無しさん:2010/03/22(月) 18:05:36
すいません、NSTextField -> UITextField の間違いでした。
836デフォルトの名無しさん:2010/03/22(月) 18:54:43
>>834-835
Cは(Objective-Cも)値渡しだから、ポインタだろうがなんだろうが
渡すときは常に中身がコピーされる。
ポインタを渡したときは、コピーされるのはポインタの値だから
中身はコピーされないな。
中身を渡したら中身がコピーされるだろう。
837デフォルトの名無しさん:2010/03/22(月) 18:56:42
>>836
中身っつうか、渡したものが常にコピーされるってことね。
分かりにくかったらすまん。
838デフォルトの名無しさん:2010/03/22(月) 20:18:47
>>834
>あの、ポインタに対して使う * っていうのは、内容を複製して渡すのでしょうか?
合ってる、けど「中身」が何であるか勘違いしないように

[field.text UTF8String] は char * を返すんだが、この場合の中身は
先頭の1文字であって文字列全体じゃないからな
839834:2010/03/23(火) 16:42:01
>>836
ありがとうございます。

ポインタを渡したらそのポインタの値がコピーされるという事ですよね。

>>838
ありがとうございます。

そうそう、そこも不思議だったんですよね。実際に isnumber はどう
処理しているのでしょう?アドレスに1ずつ足していきながら NULL 文字
がくるまでを文字列と判断するのでしょうか?

ソースを探したんですが見つからなくて…。
840デフォルトの名無しさん:2010/03/23(火) 17:52:23
isnumber が扱うのは「(所謂)文字列」ではなく「文字」だよ。
841デフォルトの名無しさん:2010/03/23(火) 22:07:21
>>839
>アドレスに1ずつ足していきながら
「文字列」(char *、つまり連続した文字の先頭へのポインタ)を受け取る関数についてはその通り
ただ isnumber は >>840 が言うとおり「文字」(char)を受け取って、
その1文字が数字どうかを判別する
842デフォルトの名無しさん:2010/03/23(火) 22:59:21
>>840, 841
げげっ!そうなんですね、という事は、何らかの NSString が数値として
解釈できるかどうかは、何か別の方法で判定しなくてはいけないという事ですね。

Objective-C というよりは Cocoa っぽい話題で申し訳ないですが、皆さんは
ある NSString が数値として解釈できるかどうかはどの様に判定していますか?
843デフォルトの名無しさん:2010/03/23(火) 23:19:09
NSNumberFormatter ?
844デフォルトの名無しさん:2010/03/23(火) 23:20:20
845デフォルトの名無しさん:2010/03/24(水) 00:04:21
>>843
NSNumberFormatter 使ってみたんですが、例えば aiu6 とかが蹴られるのは
いいんですが、6aiue とかやると解釈されちゃうんですよね。

厳密モードみたいなものがあるのかと思ったんですがないし…。

正規表現とかでやるしかないんでしょうか。と思ったら Cocoa には正規表現を
するためのクラスがないんですね、ガーン…。困った…。
846デフォルトの名無しさん:2010/03/24(水) 06:32:26
ogrekit
847デフォルトの名無しさん:2010/03/24(水) 12:31:40
-[NSNumberFormatter getObjectValue:forString:range:error:]
が使えるんじゃないかな。

自分は libc の strtol() 系で事足りてるから使ったことないけど。
848デフォルトの名無しさん:2010/03/24(水) 22:49:40
sscanf()のObjective-C版が欲しいと思ったことありませんか?

UTF-8が処理出来るとかなり違うかと思うのですが。
849デフォルトの名無しさん:2010/03/24(水) 22:51:07
NSScanner
850デフォルトの名無しさん:2010/03/25(木) 01:53:35
>>847
やってみたんですが、やはり 0aiu みたいなものは解釈されてしまうみたいですね。
しょうがないので、数値かどうかを判断する関数を作り、とりあえずそこで数値と
判断したものだけ実際に数値に変換させる様にしました。

どうもおさわがせしました。でもなんか楽しいですね、Objective-C を頑張って
覚えたいです。
851デフォルトの名無しさん:2010/03/25(木) 13:48:33
>>850
range:
852デフォルトの名無しさん:2010/03/25(木) 15:06:47
-getObjectValue:...より簡単な-numberFromString: は使ってみたか?
自分の環境では6aiueはNULLを返す。
厳密モード的な動作は -setLenient: で切り替えられると思うが,NSNumberFormatterのAPIページくらい目を通したか。
ただ6aiueの解釈には影響ないみたいだが。
あるいはgetObjectValue:...を使いたいなら >>650 の通りだな。
853834:2010/03/25(木) 18:27:08
>>852
ありがとうございます。

もちろん numberFromString は使ってみたのですが、普通に
数値として返ってきてしまうので困っていました。

setLenient も指定してみましたが、効果がありませんでした。

やり方がいけなかったんですかね…。家に帰ってもう一度やってみます。
854デフォルトの名無しさん:2010/04/02(金) 09:20:21
shouldNotImplement: や notImplemented: って、
may not respond to '-notImplemented:'
ではなくするには何をインポートすれば良いんだ?

#import <objc/Object.h>
やっても意味無いようだけど。

当方OSX 10.6。
855デフォルトの名無しさん:2010/04/02(金) 12:25:59
>>854
- (id)hogehoge {
return [self notImplemented:nil];
}

こうなってんじゃないの?
子クラスで -hogehoge を再定義すれば
856デフォルトの名無しさん:2010/04/02(金) 15:27:23
>>855
? いや、
- (void)hoge {
[self notImplemented: _cmd];
}
をエラー無くビルドしたいんだけど。notImplementedされてるクラスを云々じゃなくて、自分でnotImplementedしたいんだ。
今クラスクラスタ作ってるところで。
857デフォルトの名無しさん:2010/04/03(土) 02:16:08
>>856
ああすまん
自分で空の -(void)notImplemented: を定義すりゃいいんじゃね
858デフォルトの名無しさん:2010/04/05(月) 00:45:54
NSArray* array = [NSArray arrayWithObjects:@"a",@"b",@"c",NULL];

みたいな、オブジェクトをカンマで区切って複数指定できるメソッドって、
定義する側ではどう書くのでしょうか?

もしや、カンマで区切って繋げると自動的に NSArray に変換してくれたり
しているんでしょうか??
859デフォルトの名無しさん:2010/04/05(月) 01:45:11
可変長引数でググレカス。

http://developer.apple.com/mac/library/qa/qa2005/qa1405.html

あと Foundation クラスの実装例が見てみたいなら CF や libFoundation のソースでも読んどけ。
http://www.google.com/codesearch/p?#_rn0kgFhkQA/redir/sope/55519/url_tgz/sope-4.5.4-nevermind-r878.tar.gz|EGqseItem4o/sope/libFoundation/Foundation/NSArray.m
860デフォルトの名無しさん:2010/04/05(月) 02:30:46
先生、「可変長引数」という単語を知らない人はどうなりますか…。

という冗談は置いておきまして、ありがとうございました。

ただ、可変長引数という単語で検索してもほとんどきちんと解説している
サイトってないですね…。「va_list」とか「va_start」とか一体何者なのか
分かりませんし…。まぁとにかくそのあたりから調べてみる事にします。

ありがとうございました。
861デフォルトの名無しさん:2010/04/05(月) 12:54:31
これだからゆとりは
862デフォルトの名無しさん:2010/04/05(月) 13:26:03
ダイナミック本ってどうなの
863デフォルトの名無しさん:2010/04/05(月) 15:20:27
索引付いてないし装丁も粗いし、Webの奴読んでりゃ良いと思うよ。
864デフォルトの名無しさん:2010/04/06(火) 18:52:14
最近のプログラマーはやった物勝ちなんだな
865デフォルトの名無しさん:2010/04/14(水) 14:39:34
objc2 runtime 関数 const char *class_getIvarLayout(Class cls); について質問です。
この layout というのは、どういうものなのでしょうか?
ソースコードを調べていくと、objc-runtime-new.h に
class_t 構造体->class_rw_t 構造体->class_ro_t 構造体->uint8_t *ivarLayout
となっていて uint8_t*型だとわかりましたが、何の値を示すものなのでしょう?
よろしくお願いします。
866865:2010/04/14(水) 15:44:41
解決には至っていませんが… objc-layout.m に GC につかうもの、っぽいことが
書いてあります。が、いまいちどうなっているのかよく分からないので、
ご存知の方がいらしたら、ご教示お願いいたします。
/**********************************************************************
* Object Layouts.
*
* Layouts are used by the garbage collector to identify references from
* the object to other objects.
*
* Layout information is in the form of a '¥0' terminated byte string.
* Each byte contains a word skip count in the high nibble and a
* consecutive references count in the low nibble. Counts that exceed 15 are
* continued in the succeeding byte with a zero in the opposite nibble.
* Objects that should be scanned conservatively will have a NULL layout.
* Objects that have no references have a empty byte string.
*
* Example;
*
* For a class with pointers at offsets 4,12, 16, 32-128
* the layout is { 0x11, 0x12, 0x3f, 0x0a, 0x00 } or
* skip 1 - 1 reference (4)
* skip 1 - 2 references (12, 16)
* skip 3 - 15 references (32-88)
* no skip - 10 references (92-128)
* end
*
**********************************************************************/
867デフォルトの名無しさん:2010/04/14(水) 22:29:58
コメントを読んだ感じだと、
あるオブジェクトが他のオブジェクトを参照するのに使っているポインタ領域が
どのオフセット位置にあるのかを表しているように読める。
例として書いてある { 0x11, 0x12, 0x34, 0x0a, 0x00 } だと、
各々の上位ニブル(= 4 ビット)分スキップしてと下位ニブル分だけワードを読むことになっているので、
まず、 0x11 で 1 ワードスキップして 1 ワード見る
次に 0x12 で 1 ワードスキップして 2 ワード
0x3f で 3 ワードスキップして 0xf = 15 ワード
0x0a で現在のワードから(= 0 ワードスキップ)10 ワード見る。
0x00 = '¥0' で終端。
1 word = 4 byte = 32 bit で、オフセットが 4, 12, 16, 32-128 の位置のワードが表されている。
このメモリレイアウトに従ってメモリ領域を見ればオブジェクトの参照関係がわかる。
という感じかなあ。 Ivar は Instance Variable の略じゃないかと。
GC については最近出た本を参照。
868865:2010/04/15(木) 20:40:07
>>867
「ニブルの上位下位」のところがよく分からなかったんですが、なるほど、
そういう意味だったんですね。分からなかった「ニブル」の意味も何となく
分かりました。ありがとうございます。
もう一つお教えください。GC についてですが、最近新しい本が出たのでしょうか?
869デフォルトの名無しさん:2010/04/15(木) 20:56:05
> 868
byte : 8 bit
nibble: 4 bit

これはbyte -> bite (かじる)にひっかけて
「ちょこっとかじる」という意味のnibbleをbyteの半分を
指す様になった。 ほとんど冗談の様なネーミング。 
870デフォルトの名無しさん:2010/04/15(木) 21:06:47
じゃあニブルはニップルをかじってるのか
871デフォルトの名無しさん:2010/04/15(木) 21:06:49
英語版のwikipediaによると、bite->byteにひっかけて
nybbleとスペルしたり、かならずしも4bitではなくて
5bitや6bitに使われた場合もあったそうだ。 また、
用語の起源はIBMのメインフレームらしい。

http://en.wikipedia.org/wiki/Nibble
872デフォルトの名無しさん:2010/04/15(木) 21:09:17
byte -> bite じゃなくて
bite -> byte だよね
bite が byte の語源
873デフォルトの名無しさん:2010/04/15(木) 21:13:07
継手のニップルってそのまま形から来てるのか
874865:2010/04/15(木) 21:14:47
>>869
レスありがとうございます。
その話、何かで見たことがありました!完全に忘れていましたが・・・
おかげでもう忘れない気がします(笑)
875865:2010/04/15(木) 21:16:46
あれ、書いてるうちに… みなさん、ありがとう。
876デフォルトの名無しさん:2010/04/15(木) 23:49:00
>>868
GC の本っていうのは ttp://www.amazon.co.jp/dp/4798025623 のこと
オブジェクトの参照関係が GC でどう使われるかに興味があるんだったら
読んでみるといいかもしれない

ところで byte = 8bit じゃない計算機もあったよね
そのために 8bit を明示するときは octet と言ったり
877デフォルトの名無しさん:2010/04/16(金) 13:30:37
ちくびと聞いて
878デフォルトの名無しさん:2010/04/18(日) 13:04:34
+(void)hoge;

じゃなくて
+hoge;
って宣言を見かけたんだが、これはなんだ?
879デフォルトの名無しさん:2010/04/18(日) 13:16:13
int hoge;
880デフォルトの名無しさん:2010/04/18(日) 15:17:16
+ (id)hoge;
だよ。
881デフォルトの名無しさん:2010/04/18(日) 21:32:43
hage
882865:2010/04/19(月) 09:30:11
>>876
カメレスでごめんなさい。本の情報ありがとうございます、手に入れて読んでみます。
883デフォルトの名無しさん:2010/04/24(土) 22:04:45
@interface MyObject : NSObject
+ (void)hoge;
- (void)piyo;
@end
@implementation MyObject
+ (void)hoge { NSLog(@"hoge");}
- (void)piyo { NSLog(@"piyo");}
@end

@interface MyMyObject : MyObject
@end
@implementation MyMyObject
+ (void)hoge { NSLog(@"hogehoge");}
- (void)piyo { NSLog(@"piyopiyo");}
@end

@interface MyMyMyObject : MyMyObject
@end

となってて、MyMyMyObject で祖父クラスのメソッドを呼ぶ時って、
@implementation MyMyMyObject
クラスメソッドの場合はコレで良いとして、
+ (void)hoge {
[[[self superclass] superclass] hoge];
}
インスタンスメソッドの場合は、IMP取得くらいしかないのかね?
- (void)piyo {
IMP imp = class_getMethodImplementation([[self superclass] superclass], _cmd);
(*imp)(self, _cmd);
}
@end
supersuper とか無いし。
884デフォルトの名無しさん:2010/04/26(月) 10:24:01
>>883
親でover-rideされてるにも関わらず祖父を直接見るなんて、そもそもの設計が大間違いなのでは?
と Obj-C 初心者が言ってみる。
885デフォルトの名無しさん:2010/04/26(月) 10:40:05
メッセージングでやる場合。
- (void) piyo {
struct objc_super superSuper = {self, [[self superclass] superclass]};
objc_msgSendSuper(&superSuper, _cmd);
}
あとは、class_replaceMthod 等でメソッド入れ替えなども可。
886デフォルトの名無しさん:2010/04/26(月) 12:46:27
[[self superclass] superclass]とかやると、
MyMyMyObjectのさらにサブクラスを作ったときにハマるな。
887デフォルトの名無しさん:2010/04/26(月) 16:42:25
[self superclass] == [super superclass] であることを知って驚いた14の春
888デフォルトの名無しさん:2010/05/01(土) 11:17:15
 
889デフォルトの名無しさん:2010/05/01(土) 11:55:50
>>887
ほんとだ。なんでこうなるの?
890デフォルトの名無しさん:2010/05/01(土) 20:43:49
superclassメソッドをサブクラスでオーバーライドしないかぎり、[self superclass]とやっても、[super superclass]とやっても、呼び出されるメソッドは同じ。
さらに、[self superclass]も[super superclass]も、レシーバーはselfになる。
詳しくは、Objective-Cのruntime APIを見てください。
>>883
祖父クラスが基本的なメソッドを提供していて、子クラスでオーバーライドしたんだけど
孫からも基本的な処理へのアクセスが必要だというような場合は祖父クラスで hoge を
basicHoge として別名でも提供しておくという Smalltalk 流の作法で済ませられない?
892デフォルトの名無しさん:2010/05/09(日) 00:40:25
スレ違いかもしれませんが質問ですm(_ _)m

NSData型の変数に4バイト、例えば
0x00 0x00 0x00 0x7F
と入ってる場合、これをInt型の127に変換するには
どうすればいいのでしょうか?
893デフォルトの名無しさん:2010/05/09(日) 01:37:17
int a = CFSwapInt16(*(SInt32*)[data byte]);
894デフォルトの名無しさん:2010/05/09(日) 01:39:00
ミスった
895892:2010/05/09(日) 12:02:34
回答&ヒントありがとうございます。
int a = CFSwapInt32HostToLittle(*(SInt32*)[data bytes]);
で、まだ意味はぼんやりとしか分かってないですが、
無事期待の動作が得られました。
896デフォルトの名無しさん:2010/05/18(火) 10:45:41
質問です。iPhone用プログラムを書いていますが。

NSInteger index = random() % count;
NSInteger index2 = random() % count;
while(index2 == index) {//同じにならないように
NSInteger index2 = random() % count;
}

とやって、二種類のランダムな数字を発生させようとしていますが、
何度かランダム数を発生させるとプログラムがストップしてしまいます。
なにがいけないのでしょうか。どなたかご教授願います。
897デフォルトの名無しさん:2010/05/18(火) 10:55:35
NSInteger index = random() % count;
NSInteger index2 = random() % count;
while(index2 == index) {//同じにならないように
NSInteger index2 = random() % count; // このindex2と前のindex2は別物
}


一つ目のindex2と二つ目のindex2は別物です。 


while(index2 == index) {//同じにならないように
 index2 = random() % count; // 宣言しない
}

としてください。


// 変数が隠されてしまっている とか警告出ませんでした?

// 変数スコープとかその辺の話も調べてね
898デフォルトの名無しさん:2010/05/18(火) 10:55:36
日本の未来が心配です。
899デフォルトの名無しさん:2010/05/18(火) 11:06:39
あまりにもあんまりな問いで最初何が駄目なのかわからなかった
900896:2010/05/18(火) 11:35:51
>>897
うぉぉ、当たり前ですよね。コピペしてたのが間違いでした。
ホントにあんまりな質問に回答して頂き、ありがとうございました。感謝感激です。
あ〜恥ずかしい。
901デフォルトの名無しさん:2010/05/18(火) 14:20:24
すみません、質問させてください。
iPhone用アプリのプログラムを最近始めた初心者です。
<質問>
iPhoneから外部DB(postgreSQL)に接続する手法がわかりません。

色々調べましたがピンと来なかったのですが、Object-Cから直接DBConnect
するような方法は無いのでしょうか?
XCode自体、初心者なのでよくわからないのですが、
1. Ruby?を利用する
2. java+JDBCを利用する
のような感じになるのでしょうか。
ヒントだけでも教えていただけたら助かります。
宜しくお願い致します。
902デフォルトの名無しさん:2010/05/18(火) 14:46:11
ググレカス
903デフォルトの名無しさん:2010/05/18(火) 15:11:38
この質問前どっかで見た気がする
904デフォルトの名無しさん:2010/05/18(火) 17:10:02
質問です。
UIScrollViewで画面より大きい画像を表示しているとき、画面に写っているのは、
ScrollView上でどの位置(座標)なのかを取得するにはどうしたら良いでしょう?
検索をしても、タッチした座標の検出しかわかりませんでした。
よろしくお願いします。
905デフォルトの名無しさん:2010/05/18(火) 17:31:23
スレチ。
906デフォルトの名無しさん:2010/05/21(金) 15:12:54
基本的なことなのですが、いろいろ調べてもわからなかったので質問させてください。
あるファイル(A.m)から、別のファイル(B.m)のクラス( -(void)test{...} )にアクセス
するにはどうしたら良いのでしょうか?
B.hをA.mにimportして、A.m内で[self test]とやってみましたが、警告が出てうまく
ビルドできませんでした。
低レベルな質問ではありますが、よろしくお願いします。
907デフォルトの名無しさん:2010/05/21(金) 15:35:06
>>906
自分も初心者だけど、A.m内でBのインスタンスを作ってないんじゃ?
A.m内で[self test]ってしても、selfはAのインスタンス自身を参照するよ。
testメソッド(objCはメッセージだっけ?)を持っているのがBのインスタンスだからできないんじゃないかな。
908906:2010/05/21(金) 15:47:12
>>907
ありがとうございます。できました。
今まで何となく使ってた、selfの意味をようやく理解しました。
909デフォルトの名無しさん:2010/05/24(月) 23:47:32
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
@try {
ここで例外発生。
}
@catch (NSException * e) {
NSLog(@"%@ @catch in %@", e, NSStringFromSelector(_cmd));
@throw;
}
@finally {
[pool release];
}

で、上位のレベルで例外を受ける時、例外は pool に登録されるせいで、@finally 中の [pool release]; で解放されちゃって、
上位のレベルで例外を触るとバッド・アクセスになる。

例外発生時に pool がメモリリークするから @finally に入れたのだが、逆にこんな問題が出てくるとは。
NSAutoreleasePool を作らないという選択肢以外に、何かリークしない上手い対処法無いかな?
@throw; しないで、上位には NSError で渡すとか考えてるけど。

例外処理とか今まで殆ど触ったこと無いから、勝手が分からない。
910デフォルトの名無しさん:2010/05/25(火) 00:07:47
>>909
例外処理に悩むならException Programming Topics for Cocoa
くらいは嫁。その中の
Exception Handling and Memory Managementに、まさしく
あなたが悩んでいることについて書いてある。ピックアップすると

The simplest is to refrain from releasing local autorelease pools in @finally blocks
もっとも簡単な方法はfinalyブロックでローカルなプールを使うなってこと。
911デフォルトの名無しさん:2010/05/25(火) 00:18:05
>>910
申し訳ない。その辺の文章は全て和訳されてるとばかり。

http://developer.apple.com/mac/library/documentation/cocoa/conceptual/Exceptions/Tasks/HandlingExceptions.html
おお、素晴らしい。savedException を使います、成る程ね。

ありがとうございました。
912910:2010/05/25(火) 00:22:43
じゃあどこでpoolをreleaseするのか不安に思ってるかもしれないので、
追記。
Autorelease poolはスタック状のデータ構造になっていて、
最上位でないAutorelease poolが解放されると、それより上の
内側のpoolおよびそれに登録されたオブジェクトはリリースされる
(Memory Management Programming Guide for Cocoa;
Scope of Autorelease Pools and Implications of Nested Autorelease Pools 参照)
Cocoa/Objective-Cでinitとreleaseの対応は金科玉条 (破るとすなわちメモリリーク) だけど、autorelease pool自体はinitとreleaseが厳密に対応していなくても許容される…みたい。下層のpoolがreleaseされるのが前提だけど。
913デフォルトの名無しさん:2010/05/25(火) 13:51:57
@interface MyAutoreleasePool : NSObject {
NSAutoreleasePool *_pool;
NSPointerArray *_buf;
}
- (void)throwToOuterPool:(id)obj;
@end

@implementation MyAutoreleasePool
- (id)init {
self = [super init];
if (self) {
_pool = [[NSAutoreleasePool alloc] init];
_buf = [[NSPointerArray alloc] initWithOptions: NSPointerFunctionsZeroingWeakMemory];
}
return self;
}

- (void)throwToOuterPool:(id)obj {
[_buf addPointer: [obj retain]];
}

- (void)dealloc {
[_pool release];
for (id obj in _buf) [obj autorelease];
[_buf release];
[super dealloc];
}
@end

こんなん作って、@catch 中で [pool throwToOuterPool: e]; するコトにしたよ。
914デフォルトの名無しさん:2010/05/26(水) 20:50:57
Objective-Cの逆コンパイラってありますか?
915デフォルトの名無しさん:2010/05/26(水) 22:14:33
何悪いこと企んでるんだ?
916デフォルトの名無しさん:2010/05/27(木) 10:14:52
今月で販売が終了してしまうプリンタのドライバを逆コンパイルしたい。
917デフォルトの名無しさん:2010/05/27(木) 13:42:00
Objective-CってコンパイルしちゃうとCと区別付かないよね
Objective-C特有の関数呼び出しが多数現れるけど
918デフォルトの名無しさん:2010/05/27(木) 18:00:29
ObjC で書かれたドライバなんてあるの…
919デフォルトの名無しさん:2010/05/27(木) 18:27:40
馬鹿はレスしなくていいです
920デフォルトの名無しさん:2010/05/27(木) 19:56:19
>>917
ObjC 特有の関数呼び出しが多数現れるから、コンパイルしても C と区別付くよ。
921デフォルトの名無しさん:2010/05/27(木) 20:44:33
>>920
そうじゃなくて、>914へのヒントだよ
922デフォルトの名無しさん:2010/05/27(木) 20:46:36
ObjC のメッセージ呼び出しを解釈するデコンパイラが有っても良いと思うよ?
923デフォルトの名無しさん:2010/05/27(木) 22:12:38
924デフォルトの名無しさん:2010/06/05(土) 02:21:48
今まで色々書いてきて萩原本の内容を一通り制覇したけど、「分散オブジェクト」だけは未だどう利用すればいいのか分からない。
どういう処理に使ったとか、実践的・実用的な利用例があったら教えてくれ。
925デフォルトの名無しさん:2010/06/05(土) 02:22:16
経験談とか。
926デフォルトの名無しさん:2010/06/06(日) 13:32:29
すでにコンパイルされたiPhoneのアプリを
c#のように解析することはできますか?
927デフォルトの名無しさん:2010/06/06(日) 14:04:48
>>926
>c#のように

具体的に何がしたいの?
928デフォルトの名無しさん:2010/06/06(日) 14:54:53
>>927
ソースみて参考にしたいのです
特に規約とかないようなので
929デフォルトの名無しさん:2010/06/06(日) 15:05:25
Objective-C なら結構動的に動いてる部分があるので
逆コンパイルもそれなりな形にできそうだけど
いかんせん逆コンパイラが作られるほど有名な言語でもないというのが
930デフォルトの名無しさん:2010/06/06(日) 15:07:21
>>928
デコンパイルしたいってことか。
残念ながら iPhone アプリのデコンパイラは知りません。
アプリの動きを知りたいなら、Instruments でカスタム
DTrace スクリプトを書くのが一番良いと思います。
931デフォルトの名無しさん:2010/06/06(日) 15:18:44
>>928
コーディング規約なら一応あるよ。

Coding Guidelines for Cocoa
http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html

あと、 /Developer/Examples の中にサンプルソース(TextEditとか)が
入っているので、参考になるかもよ。
932931:2010/06/06(日) 15:20:47
Cocoaスレと間違えた。めんご
933デフォルトの名無しさん:2010/06/06(日) 15:42:47
規約がないってのは
リバースエンジニアリングを禁止する規約がないって意味でしょ
934デフォルトの名無しさん:2010/06/06(日) 16:10:28
見落としてるだけだろ
935デフォルトの名無しさん:2010/06/07(月) 22:38:46
いや、パクる気満々だな
936デフォルトの名無しさん:2010/06/08(火) 07:45:09
いえ、解析してそのゲームでチートしようと思ってます
937デフォルトの名無しさん:2010/06/08(火) 08:02:20
ageんな死ね。
938デフォルトの名無しさん:2010/06/09(水) 15:25:24
Objective-Cでは、厳密にprivateやpublicと明示的に記述し、スコープ分けしないのでしょうか?
入門書を何冊か読んだのですが、どれもインスタンス変数のスコープ分けをしていないので、気になっています。
939デフォルトの名無しさん:2010/06/09(水) 15:27:26

@interface AClass : NSObject
{
940デフォルトの名無しさん:2010/06/09(水) 17:01:09
そのあたりに言及してるのは荻原本ぐらいじゃないかな
941デフォルトの名無しさん:2010/06/09(水) 17:26:05
@privateでもKVCとかでアクセスできるし
プライベートであるという表明だけは出来るけど
静的チェックは甘いよね。
942デフォルトの名無しさん:2010/06/10(木) 10:11:59
>>940-941
ありがとうございます。
自分はJavaやってから始めたので、クラス内でしか使わない変数を隠蔽していないと
どうも気になってしまって…。

荻原本は読みました。解説はしてるのですが、以降の章のサンプルコードでは積極的に
使ってませんよね。>>941さんがおっしゃるように、
「スコープ分けしてもKVCでどうせアクセスできるんだから、細かい事は気にすんな」
って事なのでしょうかね。
943デフォルトの名無しさん:2010/06/10(木) 12:11:55
表明するのは大事だよ

通常アクセスならエラーが出るし、
迂闊に触ってしまうことへの注意喚起も出来るから
それで慣れている人は続ける方がいいよ


Appleのやり方も色々だよね。
昔から有るクラスはコメントで「privateだ」って書いてあったり
idな型不明のオブジェクトに隠蔽したり
@privateで宣言したり。
944デフォルトの名無しさん:2010/06/10(木) 13:06:02
>>943
なるほど、ありがとうございます。
書いている方が安心できるので、書く事にします。
少しでも単純なバグを減らせるなら、これを書くぐらいなんとことないですしね。

id型で思い出しましたが、参考書はかなりid型を使っていますが、Objective-Cは動的型結合があるのでid型で書いた方が、何かと都合が良いのでしょうか。
「ここは絶対hoge型でしょう」みたいな箇所でid型を使うのは、Javaのような静的型付け言語に慣れ親しんでいた私の身には抵抗がありまして…。
「ごちゃごちゃ言う前に慣れろ」と言われれば、それまでなんですけど、ハイ…。
945デフォルトの名無しさん:2010/06/10(木) 14:24:18
荻原本持ってるなら64ページに静的な型について書いてあるよ。
「明確な指針はないので好きにすれば良い」みたいなことが書いてある。

俺はクラス型を指定すると、コンパイル時に警告を出してくれるメリットがある
のでどんどん使っていけば良いと思うよ。
ただ、コンパイル時には静的な型チェックを行ってくれるが、実行時にはすべて
id型になっているということがJavaとは違うので注意。

id型の代わりにクラス型を指定したせいでデメリットが生まれることはあまり
ないと思われる。
946デフォルトの名無しさん:2010/06/10(木) 14:35:23
>>945
ありがとうございます。書いてました。申し訳無いです。

>ただ、コンパイル時には静的な型チェックを行ってくれるが、実行時にはすべて
>id型になっているということがJavaとは違うので注意。

この違いは大きいですね。注意します。ありがとうございました。
947デフォルトの名無しさん:2010/06/10(木) 15:10:05
>>943
WebViewはちょっと面白いよね。
@privateでWebViewPrivateクラスのインスタンス変数を持ってるだけだし、
WebViewPrivateクラスの実装とかはなぜかWebViewDataにある。
948デフォルトの名無しさん:2010/06/11(金) 16:03:43
CFIndex型の変数indexに、どんな値が入っているか見ようと思うのですが、
NSLog("%O", index);
としましたが、ポインタコンパチブルなんたらと怒られました。
何が間違っているのでしょうか?と質問しようとして、

よく見たら、1つ目の引数のポインタが型違うやんみたいなことを言われました。
NSLog(@"%O", index);
としたら、うまく行きました。自己解決しました。ありがとうございました。

以前にもこういうミスがありまして、こういうミス起きないようにするには
どうすればよいでしょうか。変な質問ですがよろしくお願いします。
949デフォルトの名無しさん:2010/06/11(金) 16:50:47
文字列の前には@を付けると頭に叩き込むしかないんじゃないかな。
950デフォルトの名無しさん:2010/06/11(金) 20:30:49
>>948
一度遭遇したエラーや警告を、その原因、対処方法とともに意識して憶えていく努力をする。
951デフォルトの名無しさん:2010/06/11(金) 20:37:59
次に948は、
CFIndex型の変数indexに、どんな値が入っているか見ようと思うのですが、
printf(@"%O\n", index);
としましたが(ry
952948:2010/06/12(土) 14:48:06
みなさんアドバイスありがとうございます。

>>949
「あっと驚くNSString」これで頭に叩き込もうと思います。
頭に叩き込んでいたら怪我をしてしまいまして、これから病院に行ってきます。

>>950
そうですよね。がんばります。

>>951
次は無いようにしたいですね。

そこで新たな質問ですが、
NSLog(@@"%O", index);
のところでエラーが出ます。
原因はなんでしょうか?
953デフォルトの名無しさん:2010/06/12(土) 14:56:21
バカかお前は。
954デフォルトの名無しさん:2010/06/12(土) 23:08:40
バカの相手するのもなんなんだが、log って打って補完すれば NSLog(@""); って補完してくれて "" の中にキャレット動かしてくれるぞ
955デフォルトの名無しさん:2010/06/13(日) 06:40:53
>log って打って補完すれば NSLog(@"");

俺、べつのバカだけど、そうなんだ!べんりだなー
956デフォルトの名無しさん:2010/06/17(木) 23:18:32
すみません 非常に初歩的で申し訳ないんですが、iphone ipadのプログラムがしたいと思い、windowsに>>15
http://www.gnu.org/software/gnustep/experience/Windows.htmlの通りインストールしたんですが、shellのコマンドがわかりません

というかみなさんMACでやってるんですか?
iphone ipad の用プログラミングでvisual C++みたいなのありませんか?
957デフォルトの名無しさん:2010/06/17(木) 23:21:02
スレチ。というか Mac も持ってないのにコード書いても意味ないだろ。
958デフォルトの名無しさん:2010/06/17(木) 23:30:07
>>957
そうなんですか 初級過ぎてすみません><
アップル公式のSDKもよく見たらMAC限定みたいですね 出直してきます
959デフォルトの名無しさん:2010/06/17(木) 23:44:33
ちょっとわらった
960デフォルトの名無しさん:2010/06/18(金) 09:45:40
ttp://code.google.com/p/json-framework/wiki/InstallationInstructions

ここのOption 3を見ながらJSON-Frameworkを使ってMacアプリでテストを行おうとしているのですが、うまくいかずに困ってます。

フレームワークをプロジェクトに追加したので、3.までは終わってると思うのですが、
4の意味がわかりません。これは何をすれば良いのでしょうか?
961デフォルトの名無しさん:2010/06/18(金) 10:31:17
>>960
サイドバーの
「ターゲット」を展開→アプリ名になってる項目を右クリック→「追加」→「新規ビルドフェーズ」→「新規コピーファイル」
開いたパネルの「デスティネーション」を「フレームワーク」に設定
アプリ名の項目を展開→「ファイルをコピー」の上に JSON.framework をドロップ
962デフォルトの名無しさん:2010/06/18(金) 10:34:45
JSON.framework は実際のファイルではなくて
サイドバーの <プロジェクト名>/Frameworks 項目の中に入ってるやつ
963デフォルトの名無しさん:2010/06/18(金) 11:07:33
>>961-962
ありがとうございます。前進できました。
ビルドすると、JSON Frameworkのいくつかのファイルが見つからないというエラーが出ましたので、
私の設定のどこかがまずいのでしょう。
頑張って潰したいと思います。
964デフォルトの名無しさん:2010/06/21(月) 18:46:22
楽しいココアのレヴューにこういう↓のあったんだが、実際のところどう?
あと萩原本以外にいいのないですか?自分はCは中級くらいやれてます

*********************
Leopardにアップグレードしてしまった方、
この本は使えません。Xcode Toolに大幅な変更があったからです。
まだTigerを使っている方。この本は貴方のためのものです。
本の通り作業して行けばCocoaのいろはのい位まではモノになるはずです。
965デフォルトの名無しさん:2010/06/21(月) 19:47:48
スレチ。
966964:2010/06/21(月) 20:09:39
すみませんでした 新macのcocoaスレ行ってきます
967デフォルトの名無しさん:2010/06/24(木) 03:59:04
968デフォルトの名無しさん:2010/06/27(日) 22:15:30
http://codepad.org/H3j8eTAB

このコードで、どのNSLogも出力されないんだが何か間違ってる?
これじゃNSOperationQueueを使う意味がないのは承知の上。
969968:2010/06/28(月) 17:59:49
Appleで聞いてくる
970デフォルトの名無しさん:2010/06/29(火) 18:10:59
 V V
(´・ω・`) うさちゃんピース
971デフォルトの名無しさん:2010/07/02(金) 05:44:56
すみません。
1ヶ月未満の初心者なんですが、初歩的なことでつまずいています。

ヘッダファイルで

@interface PListReadViewController : UIViewController {
NSArray* persons;
}

@property(nonatomic,retain) NSArray* persons;

で、ソースファイルで

@synthesize persons;

-(void)hogehage{
NSBundle* bundle = [NSBundle mainBundle];
NSString* path = [bundle pathForResource:@"test" ofType:@"plist"];
NSArray* persons = [NSArray arrayWithContentsOfFile:path];
}

としてるんですが、hogehageのpersonsはローカル変数として扱われてしまうみたいですね。
interfaceで定義してるpersonsに、パッケージにバンドルされてるplistを配列として展開して、
別の関数内でpersonsを使いたいんですけど、どうしたらいいんでしょうか?
972971:2010/07/02(金) 06:11:49
できました!

ttp://www15.plala.or.jp/NovemberKou/programming/2ndGeneration/2ndHome/RMGWindowController/fixCrashDnD.html
を参考にしました。

NSArrayの使用サンプルはみんな、1関数内で処理が終了してるものばかりで、なかなか見つかりませんでした。

おじゃましました。
973デフォルトの名無しさん:2010/07/02(金) 18:57:59
[NSHoge hoge~~] ってのは自動で autorelease に登録されてると覚えよう。
974デフォルトの名無しさん:2010/07/02(金) 20:38:07
とは限らないけどね
975デフォルトの名無しさん:2010/07/03(土) 17:30:35
[NSHoge new~~] ってのは release されていないってのも併せて覚えよう。
976名無しさん@そうだ選挙に行こう:2010/07/10(土) 15:46:20
iphoneで顔認証を使ったアプリを作りたいんですが
↓で提供されているAPIを使うことって出来ますか?
  iphoneの開発環境で使用するにはどうしたらいいのでしょうか?

http://developers.face.com/
977名無しさん@そうだ選挙に行こう:2010/07/10(土) 16:39:53
スレチ。
978名無しさん@そうだ選挙に行こう:2010/07/10(土) 17:17:49
JAVAスクリプトのライブラリを参照する事てできますか?
979名無しさん@そうだ選挙に行こう:2010/07/11(日) 00:35:32
JavaScript ?
HTMLかXMLで実装した後、NSWebViewで参照すればイイんじゃない?
980名無しさん@そうだ選挙に行こう:2010/07/11(日) 12:32:02
ありがとうございました
981デフォルトの名無しさん:2010/07/13(火) 22:39:12
複数の入門書で勉強をし始めてるんだけど、参考書によって、
NSString* str = @"hoge";
と、
NSString *str = @"hoge";
て感じで、クラス名の後ろに*が付いてるのと、変数名の前に*が付いてるので書き方が分かれてて混乱中。
どっちの方が一般的な表記なんですかね?
一応、どっちもコンパイルは通るんだけど…
982デフォルトの名無しさん:2010/07/13(火) 23:58:35
NSString* str1,* str2;
NSString *str1, *str2;
あとはわかるな?
983デフォルトの名無しさん:2010/07/14(水) 00:17:40
「NSStringへのポインタ」という型だと考えるなら NSString* str
>>982のように変数を複数宣言したときとの整合性を取るなら NSString *str
どっちも一般的だから好きなほうで
984981:2010/07/14(水) 01:29:03
ありがとうございます。
クラスのインスタンスはポインタ型の変数と思えば良いのかな。
Objective-Cに慣れるのに、時間掛かりそうだ…
985デフォルトの名無しさん:2010/07/14(水) 01:47:56
クラスって、単にポインタだから。
Cで関数形式マクロを使ってポインタを隠蔽したような感覚で考えれば簡単。
986デフォルトの名無しさん:2010/07/14(水) 14:04:37
>>981
C ファミリは区切り部分に空白がいくつ入ってもいい。改行でもいい。
> どっちの方が一般的な表記なんですかね?
{ 前後の改行の仕方に複数の流儀があるのと同じこと。

>>984
> クラスのインスタンスはポインタ型の変数と思えば良いのかな。
C はできるの?
malloc() するときはポインタで受け取るでしょ?
[[NSString alloc] init] の alloc はそういうこと。
>>981
t* v; ってのは c++ で一般的な書き方です。
合理性はともかく c++ のコードの大半はこのスタイル。
988デフォルトの名無しさん:2010/07/14(水) 15:38:12
Blocksって一体なんなんすか?
989デフォルトの名無しさん:2010/07/14(水) 16:49:20
無名関数

qsort(3)の第4引数に関数ポインタを渡す代わりに比較用関数を直接書ける
みたいな
990デフォルトの名無しさん:2010/07/14(水) 21:37:44
テーブルビューのセル削除時にデリゲートメソッド(tableView:commitEditingStyle:forRowAtIndexPath:)が呼ばれてスワイプ消去の機能が自動的にアクティブになりますが、スワイプ消去の機能を非アクティブにさせる方法はありますか?
スワイプで編集されたくないときは
canEditRowAtIndex だか何だかで NO 返せば良いんだった様な
>>990
あとそれスレ違いだ。
そういうのは新Mac板のiPhoneのプログラミングスレで。