Objective-C [ObjC part:4];
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2009/04/15(水) 00:11:00(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
0002デフォルトの名無しさん
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/
0003デフォルトの名無しさん
2009/04/15(水) 00:12:29*** 本家 ***
Objective-C 2.0 プログラミング言語
ttp://developer.apple.com/jp/documentation/Cocoa/Conceptual/ObjectiveC/
Introduction to The Objective-C 2.0 Programming Language
ttp://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html
そのほか英語
ttp://developer.apple.com/documentation/Cocoa/ObjectiveCLanguage-date.html
*** 書籍 ***
荻原本
ttp://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Objective-C-2-0-%E8%8D%BB%E5%8E%9F-%E5%89%9B%E5%BF%97/dp/4797346809/ref=sr_1_1?ie=UTF8&s=books&qid=1239721407&sr=1-1
HMDTダイナミック本
ttp://www.amazon.co.jp/Dynamic-Objective-C-%E6%9C%A8%E4%B8%8B-%E8%AA%A0/dp/4861006414/ref=sr_1_11?ie=UTF8&s=books&qid=1239721553&sr=1-11
0004デフォルトの名無しさん
2009/04/15(水) 00:48:05ttp://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
0005デフォルトの名無しさん
2009/04/15(水) 14:26:33http://www.sealiesoftware.com/blog/archive/
0007デフォルトの名無しさん
2009/04/16(木) 04:58:57http://amazon.jp/dp/4861006414
で良いよ、coもwwwも要らない
0008デフォルトの名無しさん
2009/04/17(金) 14:02:410009デフォルトの名無しさん
2009/04/17(金) 18:35:080010デフォルトの名無しさん
2009/04/17(金) 21:19:180011デフォルトの名無しさん
2009/04/18(土) 10:24:27これはしょうがないのか…。
0012デフォルトの名無しさん
2009/04/18(土) 16:10:410013デフォルトの名無しさん
2009/04/18(土) 18:05:100014デフォルトの名無しさん
2009/04/19(日) 22:09:48有ったら触って見たいです。
0015デフォルトの名無しさん
2009/04/19(日) 22:51:36http://www.gnu.org/software/gnustep/experience/Windows.html
日本語ではあまり新しい資料はないかもしれん。とりあえず
http://journal.mycom.co.jp/special/2004/gnu/006.html
0016デフォルトの名無しさん
2009/04/19(日) 23:20:09ありがとう御座います><
早速試してみます^^
0017デフォルトの名無しさん
2009/04/19(日) 23:26:100018デフォルトの名無しさん
2009/04/20(月) 00:43:25>>15 のリンク先は MinGW ベース。
他には、Yellow Box for Windows というのを Apple が昔作ってたから、
ebay とかで粘ってると手に入るかもしれません。
http://www.shawcomputing.net/resources/apple/os_pictures/yb2k/
Rhapsody DR2 もしくは WebObjects 4.5 というのに付いてきます。
0019デフォルトの名無しさん
2009/04/20(月) 01:23:360020デフォルトの名無しさん
2009/04/20(月) 01:32:35つかったことなくてサイトの説明を読んだだけなので何とも言えませんが。
0021デフォルトの名無しさん
2009/04/20(月) 02:27:54俺も採用例FileMagnetのWinクライアントぐらいしか知らないな
用途によってはREALBasicとかも検討すべし>>14
ただ遊びたいなら話は別だが
0022デフォルトの名無しさん
2009/04/20(月) 02:55:55>用途によってはREALBasicとかも検討すべし
REALBasic は Objective-C ではないのでは???
0023デフォルトの名無しさん
2009/04/20(月) 10:30:20WIn/Mac両対応のソフトウェアを作るという前提での話
どうももう一回読んでみると>>14はただObjective-Cの処理系で遊びたかっただけのようだから的外れな指摘だな
たしかLinux系にはgccでobjective-cのコンパイラは提供されていたような...
数度インストールオプションで見た覚えがある
0024デフォルトの名無しさん
2009/04/20(月) 10:42:47やり始めて2週間だからしゃーなか
0025デフォルトの名無しさん
2009/04/20(月) 15:58:31楽しいCocoa辺りのコードを特に理解せず書いて動かして学んでいく方が進み早いんじゃないかな
0026デフォルトの名無しさん
2009/04/20(月) 18:59:56オブジェクトを返すようなメソッドはそのままのものが返ってきましたが、
値を返すようなメソッドの場合、どうやって返ってくるのですか?
@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 が返ってくるのですが…よろしくお願いします。
0027デフォルトの名無しさん
2009/04/20(月) 20:16:26のですが、double を試す前にBar の変数に char *name とした場合には、
設定したchar* が返って来たので、やってみた次第です。
int の場合にも設定した値が返ってきました。で、今floatでやってみたのですが、
double と同様、駄目でした。float なら値が返ってくる事を期待したのですが…
0028デフォルトの名無しさん
2009/04/20(月) 20:48:49double(*numImp)(id,SEL) = [Bar instanceMethodForSelector:@selector(num)];
double num = (*numImp)(hoge, @selector(num));
0029デフォルトの名無しさん
2009/04/20(月) 21:06:51IMP の定義は typedef id (*IMP)(id, SEL, ...);
だから、id 以外を返す場合はキャストして使わないといけない。
0030デフォルトの名無しさん
2009/04/20(月) 21:16:19できました!なるほどー、IMPをさらに関数ポインタにしてしまえば良いんですね。
勉強になりました、ありがとうございます。
あと>26の「num には hoge が入っていた」というのはたまたま入っていた
だけのようでしたので訂正します(汗
0031デフォルトの名無しさん
2009/04/20(月) 21:26:59ありがとうございます。キャストが必要だろうと思い、そのまま
double value = (double) numImp(hoge, @selector(num));
とかやっていたので、コンパイラに怒られていたんです。Cそのものの経験が
無いのでよく分からずにやってました。関数ポインタのキャスト、ってのが
目から鱗でして (^^;;
0032デフォルトの名無しさん
2009/04/21(火) 14:35:51楽しいCocoa買ってみます
ありがと
0033デフォルトの名無しさん
2009/04/22(水) 17:11:460034デフォルトの名無しさん
2009/04/22(水) 22:32:460035デフォルトの名無しさん
2009/04/23(木) 13:08:57バインディング使うにはKVCで書くだろ
普通に書いてりゃkvcで書くと思う
0036デフォルトの名無しさん
2009/04/23(木) 13:20:20つい getter を -(NSHage*)hoge でなくて
-(NSHage*)getHoge とかいてしまうからそう思うんではなかろうか。
0037デフォルトの名無しさん
2009/04/23(木) 22:17:46- (void)getHoge:(NSHoge *)
とか言う形? 違和感有るけど
0038デフォルトの名無しさん
2009/04/24(金) 08:08:48-(void)getHoge:(NSHoge**)
でないと駄目だとおもう
0039デフォルトの名無しさん
2009/04/28(火) 01:03:12Linux で 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
0040デフォルトの名無しさん
2009/04/28(火) 11:04:51#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;
つづく
0041デフォルトの名無しさん
2009/04/28(火) 11:05:37+(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;
}
0042デフォルトの名無しさん
2009/04/28(火) 11:08:43gcc -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
を参照してください。
004439
2009/04/28(火) 18:26:09#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;
}
004539
2009/04/28(火) 18:28:24GNU % gcc -fconstant-string-class=MyString -o main main.m -lobjc
って感じで両方でコンパイル成功して期待した通り動いた.ありがとう >>42
0046デフォルトの名無しさん
2009/05/13(水) 08:16:25そのとき、例えば、AppleのCocoaだと、
NSObject obj = [[NSObject alloc] init];
[obj autorelease];
って出来るよね?
このautoreleaseって、要するにGCみたいなもんなの?
0047デフォルトの名無しさん
2009/05/13(水) 11:26:33NSAutoreleasePool は drain/release を受けたときに登録してある
インスタンス全てに release を送るだけ。受けなければそのまま放置。
とりあえず、メモリ管理プログラミングガイドを理解しよう。
ttp://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
それでも分からないなら、新Mac板 Cocoaはさっぱりスレ の方へどぞ。
http://pc11.2ch.net/test/read.cgi/mac/1241407525/
0048デフォルトの名無しさん
2009/05/13(水) 13:50:54C言語の自動変数に近い。イベントループ開始でAutoreleasePoolが確保
されて、autoreleaseにするとそこに登録される。イベントループ終了で
AutoreleasePoolが解放されて、autoreleaseで登録したオブジェクトは
全てreleaseされる。だから自分でreleaseの手間が省ける。
GCはどこからも参照されていないオブジェクトを見つけて勝手に解放する
機能
0049デフォルトの名無しさん
2009/05/13(水) 20:21:28http://developer.apple.com/jp/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
0050デフォルトの名無しさん
2009/05/13(水) 20:43:380051デフォルトの名無しさん
2009/05/16(土) 23:51:15グローバル関数を呼ぼうとすると、下記のようなエラーが出てしまいます。
Linking xxx/xxx
-[xxx xxx:] in xxx.o
Objective-Cのクラスから、C++のグローバル関数を呼べなかったようです。
*.m ファイル内に作ったローカル関数は呼べたのだけど・・・
0052デフォルトの名無しさん
2009/05/17(日) 00:18:260053デフォルトの名無しさん
2009/05/17(日) 01:42:100054デフォルトの名無しさん
2009/05/29(金) 19:54:09{
Test(){}
virtual ~Test(){}
};
これコンパイルすると、
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test'
ってエラー出ます
何が悪いんですか?
0055デフォルトの名無しさん
2009/05/29(金) 20:17:13% cat foo.cpp
class Test
{
Test(){}
virtual ~Test(){}
};
% g++ -c foo.cpp
% ls foo.o
foo.o
0056デフォルトの名無しさん
2009/06/01(月) 15:46:54いろいろ試しましたが、コンパイル通りません…
自分はiPhoneのOpenGL ESベースのアプリでやっているのですが、それがまずいんでしょうか
プロジェクト作成して、Other SourcesフォルダにTest.hを作成して、>>54のコードを記述し、それをmain.mに#importしてるのですが、エラーになります
.mmで定義するようにしないといけないのかなと思い、Test.mmを作成してコンストラクタ・デストラクタの定義をそちらに移してもだめでした
できればコンパイルを通すまでどのような手順で行っているのか教えてください
0057デフォルトの名無しさん
2009/06/01(月) 16:13:50だから、クラス定義に問題があるんじゃなくて、
その前、恐らく includeファイル内などに問題がありそう。
0058デフォルトの名無しさん
2009/06/01(月) 16:33:57が、それでもダメでした。これでいけると思ったんだけどなあ。
この問題ってXcodeスレで聞いた方がいいんですかね?
0059デフォルトの名無しさん
2009/06/01(月) 17:25:52ここら辺説明してるサイトが全然見あたらなかったですよ…
2chのXcodeスレでかろうじて類似の質問があって助かった
0060デフォルトの名無しさん
2009/06/01(月) 21:05:51記述方式ってないのでしょうか
毎回毎回別々のオブジェクト書くの面倒です
助けてください
0061デフォルトの名無しさん
2009/06/01(月) 22:16:13NSArray に突っ込んで、型は気にしないというのが Cocoa 流です。
もしくは Objective-C++ にしてSTL の list を使えばいいと思いますが
その場合は retain/release に気をつけてください。
>>59
それはだって Obj-C の問題というよりは、C, C++ では
当然の話だから... いつもはどんな言語で開発してるんですか?
C, C++, Obj-C の .h ファイルは、コンパイルの際に
どの言語からインクルードされるかわからないので、
XCode 等 IDE で設定するにしても .h に言語を設定しても仕方が無いです。
.h に C++ のクラスがあるなら、
インクルードする側を (Obj-)C++ モードにしないと
そりゃあコンパイルが詰まりますよ。
0062デフォルトの名無しさん
2009/06/01(月) 22:43:19それなんてJavaですかw
iPhoneでもObjective-C++できるのですか
0063デフォルトの名無しさん
2009/06/01(月) 22:44:520064デフォルトの名無しさん
2009/06/01(月) 22:46:14iPhone でも Obj-C++ できますよ
というか main.m を cpp モードにした時点で Obj-C++ になってます
0065デフォルトの名無しさん
2009/06/01(月) 22:52:52まさかgccでコンパイルしてたとか?
g++じゃなくて。
0066デフォルトの名無しさん
2009/06/01(月) 23:07:28そういうことだったんじゃないの。XCode (Mac の IDE) からだと
ファイルの言語設定でコンパイラが変わるので。
まあ確かにそのあたりはやっている人には当たり前すぎて、
解説書にもつい書き忘れてしまう... ということかも知れない
0067デフォルトの名無しさん
2009/06/02(火) 23:24:34コールバックってどうやって実現すればいいですかね?
0068デフォルトの名無しさん
2009/06/02(火) 23:27:45それだけで貴女以外のひとがなにが聞きたいかわかると本当におもってますか?
僕らはエスパーじゃないよ。
0069デフォルトの名無しさん
2009/06/02(火) 23:29:580070デフォルトの名無しさん
2009/06/02(火) 23:33:150071デフォルトの名無しさん
2009/06/02(火) 23:39:50C#とC++ならコールバックあるでしょ
なんでObjective-Cには無いの?
元のソース移植できないじゃん
0072デフォルトの名無しさん
2009/06/02(火) 23:51:430073デフォルトの名無しさん
2009/06/03(水) 00:03:39何で無いと思うの? 無い訳無いじゃん。
0074デフォルトの名無しさん
2009/06/03(水) 00:09:42double g( double x, double (*f)(double) )
0075デフォルトの名無しさん
2009/06/03(水) 00:11:280076デフォルトの名無しさん
2009/06/03(水) 00:21:34関数ポインタみたいなのが欲しいんでしょ。
http://developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/3objc_language_overview/chapter_7_section_6.html
0077デフォルトの名無しさん
2009/06/03(水) 00:27:49http://journal.mycom.co.jp/column/objc/022/index.html
でもネットワーク処理なら C で kqueue とか libevent とか使ったら良いのに。
0078デフォルトの名無しさん
2009/06/03(水) 00:32:51こういう事かな?
0079デフォルトの名無しさん
2009/06/03(水) 01:01:43いや、C++ のソースがあるなら Obj-C++ つかえば
なにひとつ移植しなくて済むでしょ。何を考えているんだ?アホ?
0080デフォルトの名無しさん
2009/06/03(水) 21:16:49それそのまんまで何が問題なんだ?w
0081デフォルトの名無しさん
2009/06/03(水) 23:54:090082デフォルトの名無しさん
2009/06/03(水) 23:58:030083デフォルトの名無しさん
2009/06/03(水) 23:58:09チェックする方法ってありますか?
0084デフォルトの名無しさん
2009/06/04(木) 00:41:190085デフォルトの名無しさん
2009/06/04(木) 01:24:04[obj class]
http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/class
http://wwwa.dcns.ne.jp/~nito/OSPT/ObjcOthers.html
0086デフォルトの名無しさん
2009/06/04(木) 01:43:55その型ってのは、変数の型? それとも、オブジェクトのクラス?
Objective-Cは変数に型がない(idでかまわない)言語なだけですよ(プリミティブ型は除きますが)
型キャストを許す言語であれば、(変数の)型が分からなくなる事はありえるのでは?
変数の型がどうであれ、オブジェクトが自分自身の型/クラス、もしくは受けられるメッセージを知ってれば問題ないって考え方です
0087デフォルトの名無しさん
2009/06/04(木) 01:51:14プリミティブがそれぞれの型を持っているのと同じで。
0088デフォルトの名無しさん
2009/06/04(木) 04:23:39idは構造体のポインタのtypedefだからそうとも言えるけど、それは変数に型のあるCという言語での実装の話しで...なんというか微妙な感じもする。
idには特別意味もないし、JavaとかC++の縛りのきつい「型/クラス」と、idは別の概念、別のくくりにした方がいいんではないかと。
0089デフォルトの名無しさん
2009/06/04(木) 22:58:350090デフォルトの名無しさん
2009/06/06(土) 00:15:09どのように記述するのが一般的なのでしょうか
0091デフォルトの名無しさん
2009/06/06(土) 02:39:56普通はNSObjectで宣言されているdeallocメソッドをオーバーライドします。
(だから@interfaceにはとくに何も書きません。)
メモリ管理については
http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html
をどうぞ。
0092デフォルトの名無しさん
2009/06/06(土) 20:48:46[[Obj alloc] initHoge : arg];
allocと組み合わせて利用するinitHogeを定義するとき
定義は以下が一般的なのでしょうか?
- (id) initHoge : (NSString *) val;
0093デフォルトの名無しさん
2009/06/06(土) 22:03:250094デフォルトの名無しさん
2009/06/07(日) 00:24:29Obj-C スレにきて、返事をする人が .NET を知っていると仮定するとはいい度胸をしている。読み手のことを考えて、
「.NET ならこれこれができるこれこれというクラスが
あるんですけど、(ドキュメントは http:// ... に ...)」とか
質問の際に書けんものかね?
とりあえず NSXMLDocument をつかえば規格に準拠した XML データは
つくれますよ。かなりメソッド名が冗長だけど。
手で文字列をつなぎ合わせて XML にするよりは断然いいです。
あと、これ以上は Mac 板の iPhone プログラミングスレか
Cocoa スレに行ったほうがいいとおもいます。ここは一応 Obj-C 言語に特化した
過疎スレなので。
0095デフォルトの名無しさん
2009/06/07(日) 01:58:330096デフォルトの名無しさん
2009/06/09(火) 22:23:27NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
Hoge *hoge = [[Hoge alloc] init];
[dic setObject:hoge forKey:@"hoge"];
とやるのと
[dic setObject:[[Hoge alloc] init] forKey:@"hoge"];
とでは、後者はメモリリークするのでしょうか?
0097デフォルトの名無しさん
2009/06/09(火) 23:19:500098デフォルトの名無しさん
2009/06/09(火) 23:47:19て書いたら、 setObject:に渡したHogeインスタンスを後でreleaseする手段が無くなるのでは
上の書き方なら [hoge release]て書けるけど。
0099デフォルトの名無しさん
2009/06/10(水) 02:47:32なあにobjectForKey:@"hoge"で取り出してreleaseすればいいさ
0100デフォルトの名無しさん
2009/06/10(水) 07:22:05じゃないとだめ
0101デフォルトの名無しさん
2009/06/10(水) 16:29:35\nでも\rでもダメだったんですが。
0102デフォルトの名無しさん
2009/06/10(水) 17:05:390103デフォルトの名無しさん
2009/06/10(水) 18:15:29ありがとうございます
0104デフォルトの名無しさん
2009/06/10(水) 23:35:38それ今の仕様だとメモリリークするけど?
0105デフォルトの名無しさん
2009/06/11(木) 00:01:56今の仕様って何?
GCのこと?だとしたらGCは仕様じゃなくてオプションだと思うんだが
0106デフォルトの名無しさん
2009/06/11(木) 00:07:37どっちにしてもコレクションに入れたものを
objectForkeyで取り出して開放してもリークするだろ
0107デフォルトの名無しさん
2009/06/11(木) 01:10:47意味が分からん、説明して
#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されるんだけど、どこが違うんだ?
0108デフォルトの名無しさん
2009/06/11(木) 01:12:36- (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されるけど?
0109デフォルトの名無しさん
2009/06/11(木) 01:14:310110デフォルトの名無しさん
2009/06/11(木) 01:20:05ふーん、じゃなくてさ
0111デフォルトの名無しさん
2009/06/11(木) 22:25:41謝ればいいんだろゴラぁ
0112デフォルトの名無しさん
2009/06/11(木) 22:39:430113デフォルトの名無しさん
2009/06/11(木) 22:43:33結局のところ>>107,108が仕様として正しいということでFAですか?
0114デフォルトの名無しさん
2009/06/12(金) 00:02:52>>99はネタ。
0115デフォルトの名無しさん
2009/06/12(金) 00:04:42NSMutableDictionaryに入れるとメモリリークするし
0116デフォルトの名無しさん
2009/06/12(金) 01:00:46んなわけねーだろ。retain count を勉強し直してこい。
2chで調べ物をしたい時は「教えてください」って書いても
なかなか教えてもらえない。
そういう時は、知ったかぶり風に間違ったことを自信満々に書く。
そうすると、ものすごい勢いでツッコミを入れてもらえる。
コピペ新聞 - 調べ物のコツ
http://copipe.info/archives/9084
ということですか。
0117デフォルトの名無しさん
2009/06/12(金) 01:56:44そのメソッド頂いたっ!
0118デフォルトの名無しさん
2009/06/12(金) 02:29:23いやネタっつうか、できるできないで言うならできるという意味で書いた
そりゃ普通こんな書き方はしないけど
0119デフォルトの名無しさん
2009/06/12(金) 05:54:02Cocoaスレでやれば良いのに。
0120デフォルトの名無しさん
2009/06/12(金) 07:04:390121デフォルトの名無しさん
2009/06/12(金) 07:34:480122デフォルトの名無しさん
2009/06/12(金) 07:56:37体系だった解説をきちんと読むべきだと思う。
Cocoa周りはアップルが出しているリファレンスがしっかりしてるから>>91の
リンク先でも読むといいよ。
0123デフォルトの名無しさん
2009/06/12(金) 08:42:140124デフォルトの名無しさん
2009/06/12(金) 10:23:46一般にはオブジェクトを入れてから取り出すまでに、別スレッドからdictionaryをいじられて、別のオブジェクトをreleaseしてしまう可能性がある。
まあ作法として避けておくのが無難。
0125デフォルトの名無しさん
2009/06/12(金) 12:34:390126デフォルトの名無しさん
2009/06/12(金) 13:14:390127デフォルトの名無しさん
2009/06/12(金) 14:30:20すまん、初心者でよくわからんのだが、
>>96のやり方だと何がまずいのか教えてくれ。
0128デフォルトの名無しさん
2009/06/12(金) 15:34:59実は前者はこの後のコードでリリースしてます、とか
オーナーシップとかしらね、後でリリースできれば良いんだよ、
とかって言い出さない限り。
0129デフォルトの名無しさん
2009/06/12(金) 18:59:21そこに思い至らない時点で実力は推して知るべしだから、GC使うかリークなんて
気にしなくて良いよ。リークが問題になる規模の物はどうせ作れないし、多分他にも
問題山積で誰も気が付かない。
0130デフォルトの名無しさん
2009/06/12(金) 23:38:40autoreleaseは果てしなく遅いぞ
0131デフォルトの名無しさん
2009/06/13(土) 00:41:020132デフォルトの名無しさん
2009/06/13(土) 10:11:29Core Data で GC つかったフリーウェアつくってますが、使っていると
時々 CPU 使用率があがるのは何故かと問い合わせがあって、
しらべてみたら GC がかなり頑張ってるように見えました。
0133デフォルトの名無しさん
2009/06/17(水) 19:24:12こちらの方法で、特定のクラスのメソッド一覧を取得しようとしたのですが、
Objective-C 2.0でobjc_method_list構造体の構造が変わってしまっているようで、このままでは取得できませんでした。
Objective-C 2.0における、objc_method_list構造体もしくはそれに変わる構造体について、知っている方居たらよろしくお願いします。
0134デフォルトの名無しさん
2009/06/17(水) 20:06:24class_copyMetodList(Class cls, unsigned int *outCount)
なおその手のものは、Obj-C 2.0 RuntimeAPIに載ってる。
ttp://developer.apple.com/DOCUMENTATION/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html
0135デフォルトの名無しさん
2009/06/18(木) 01:06:04Runtime Referenceがあることを知りませんでした…
ありがとうございます。
0136デフォルトの名無しさん
2009/06/22(月) 21:41:420137デフォルトの名無しさん
2009/06/26(金) 13:27:151. setterの返り値をBOOLにしてNOを返す。
2. objective-c例外を投げる。
1はsetterの返り値がvoid以外になると、KVCとかでおかしなことにならないか心配。
2は、c++の例外とのすみわけがややこしいので、できればobjective-cの例外は使いたくない。
どうしたもんでしょう。
ライブラリとしては、c++は使わないと割り切ってobjective-cの例外使うべきなのか…
0138デフォルトの名無しさん
2009/06/26(金) 14:01:29予期しないオブジェクトが渡されたって事ならObjCの例外を投げるのが普通。
0139デフォルトの名無しさん
2009/06/26(金) 17:29:310140デフォルトの名無しさん
2009/06/26(金) 18:36:08本当に値がセットされてるかどうか知りたかったら getして比較しろや!
4. exit(3)をコール
気に食わなければ黙って帰る
5. abort(3)をコール
そんな話聞いてないです!
0141デフォルトの名無しさん
2009/06/27(土) 03:26:10- (void)setHogeHoge:(Hoge *)aHoge error:(NSError **)error;
0142デフォルトの名無しさん
2009/06/27(土) 04:02:09KVCしたいってことだからそれじゃ駄目じゃね?
>>137
1.で問題ないんじゃない?Obj-Cのメッソドディスパッチはそんなにヤワじゃないよ。
0143デフォルトの名無しさん
2009/06/27(土) 07:10:47NSKeyValueCoding Protocol Reference
- (BOOL)validateValue:(id *)ioValue forKey:(NSString *)key error:(NSError **)outError
おまいらまぬある嫁。
0144デフォルトの名無しさん
2009/06/27(土) 11:52:180145デフォルトの名無しさん
2009/06/27(土) 16:22:38BOOL返したいんなら同等の別のメソッドとして定義すればいいだけじゃん。
KVC準拠のsetterなら戻り値はvoid。
なんとかしたいなら単に例外投げればいい。
0146137
2009/06/27(土) 22:24:24ルールなんですね。
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例外は使うな的なことが書かれてて(両者の理由は違うけど)、悩ましい。
0147デフォルトの名無しさん
2009/06/28(日) 01:01:34Cocoa API 自体が予期せぬ引数を与えられた場合は
頻繁に Obj-C 例外投げるので、
別に自分が投げても大勢に変化ないと思いますが...
0148デフォルトの名無しさん
2009/06/28(日) 15:06:59http://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自体がよく分かってないから、こういう質問してしまってるのかもしれ
ないですが、この方法は正しいのか誤ってるのか、また正しい場合は何故な
のかご教授下さい。
0149デフォルトの名無しさん
2009/06/28(日) 16:03:340150デフォルトの名無しさん
2009/06/28(日) 16:28:17NSObject +newは、内部的に[[NSObject alloc] init]と等価。
指定Initializerは他のinitから呼ばれる基本部分を含んだ、共用部分。
この例では、
[Point new]
[Point alloc] init]
はどちらも、内部的にinitWithPointを呼んでいるということ。
もちろん引数は初期値を使っている。この場合は0だろうね。
0151デフォルトの名無しさん
2009/06/28(日) 20:15:22>>148はpt2の初期化のことを聞いてるんじゃね?
ちなみに>>148のコードをXcode 3.1.3(gcc 4.0.1)で試したところ、正しく動作した(ただしそのままだとコンパイルも通らないので、本質的でないところは改変した)。
ただ、このサンプルコードはPointのインスタンス変数を読んでprintfしているだけだから上手く動いたのかもしれん。
[super init]がないことに関しては、>>149の言うとおりなのかもしれんが、そうだとするとメソッド呼び出しが循環するし、そうでないとするとObject部分が初期化されていないということになるから、あまり良い実装ではない気がする。
0152デフォルトの名無しさん
2009/06/28(日) 21:07:22>>149様,>>150様,>>151様ご回答ありがとうございます。
結局はpt2ではinitを明示していないので疑問に思ったのです。
>>149様が仰っているように、メソッド名にinit〜をつければinitWithPointで
initが自動的に走る、という考えなら納得いきます。
ただ、詳解Objective-C2.0では、サンプルコードのinitWithMinという
メソッド内で[super init]と明示しているので、メソッド名に
init〜を付けただけではinitが走らないとも判断できます。
まあ・・・[クラス名 alloc] init] の形で覚えておけば問題ない所だと
思うのですが。
0153デフォルトの名無しさん
2009/06/28(日) 22:43:13- (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;
}
0154150
2009/06/28(日) 23:08:13リンク先のコード見てなかったが、ひどいコードだったのね。
0155デフォルトの名無しさん
2009/06/28(日) 23:42:37>>153様、レスありがとうございます。
やっぱり>>153様のように[super init]で初期化して判定させた方がいいです
よね。ありがとうございました。
0156デフォルトの名無しさん
2009/06/28(日) 23:58:33http://developer.apple.com/jp/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_6.html#//apple_ref/doc/uid/TP40002974-CH4-SW17
0157デフォルトの名無しさん
2009/06/29(月) 00:01:34> - (id) initWithPoint:(int)x int:(int)y {
> self->x = x;
> self->y = y;
これってどうなの?
0158デフォルトの名無しさん
2009/06/29(月) 00:07:290159デフォルトの名無しさん
2009/06/29(月) 02:14:09http://wisdom.sakura.ne.jp/programming/objc/objc7.html
は情報が古すぎるから初心者は読まないほうがいい
0160150
2009/06/29(月) 07:49:54意味府。
0161デフォルトの名無しさん
2009/06/29(月) 08:22:39してみた感想です)。
詳解Objective-C2.0が難しすぎたんで、上記のサイトを参考にしていたんで
すが、誤字脱字が多く、たまにコーディングミスもあったりしてかえって混
乱してしまった、というのが素直な感想です。
余談ですがObjective-cってなんか楽しいですね。感覚的に、ですが。。。
0162デフォルトの名無しさん
2009/06/29(月) 15:06:09ヒレガス本を買うのが一番おすすめ。最新版の日本語訳って出たんだっけ?
英語が読めれば英語版をかうのがよし。
http://cocoadevcentral.com/
もわかりやすいよ。英語が読めれば。
0163デフォルトの名無しさん
2009/06/29(月) 17:33:450164デフォルトの名無しさん
2009/06/29(月) 20:49:49ヒレガス本調べてみましたが、かなり評判いいみたいですね。
英語は得意ではないですが、読むこと事態に嫌悪感は無いので是非購入してみ
たいと思います。・・・まあ少々お高いのでまた来月にでも。
教えて頂いたサイトも参考にさせて頂きます。さらっと読んでみましたが図が
あって理解し易いですね!
また勉強して戻ってきたいと思います。できればアドバイスする側で!
貴重なお時間を割いて頂き、皆様には感謝致します。
0165デフォルトの名無しさん
2009/06/29(月) 21:33:262ページに1枚はスクリーンショットがあるレベルだ。安心していい。
ナイトライダーについてWiki辺りで調べておくとなおいい。
0166デフォルトの名無しさん
2009/06/30(火) 00:25:59いや、日本人でもナイトライダーしってるだろ...
いまどきの若者はそうでもない?
0167デフォルトの名無しさん
2009/06/30(火) 11:45:240168デフォルトの名無しさん
2009/07/01(水) 07:23:05Safari Books Onlineで立ち読みしてみたら?
0169デフォルトの名無しさん
2009/07/02(木) 21:27:590170デフォルトの名無しさん
2009/07/02(木) 21:38:190171デフォルトの名無しさん
2009/07/06(月) 23:34:280172デフォルトの名無しさん
2009/07/06(月) 23:37:590173デフォルトの名無しさん
2009/07/07(火) 00:12:11foo[x][y];
何が不満なの?
0174デフォルトの名無しさん
2009/07/08(水) 00:07:260175デフォルトの名無しさん
2009/07/08(水) 00:09:45こいつをキャストする時って
int(*)[10] get()とかでよかったんだっけ?
C99の仕様と同じ?
0176デフォルトの名無しさん
2009/07/08(水) 01:04:37int x = 20, y = 50;
int hoge[y][x];
ってできる?
0177デフォルトの名無しさん
2009/07/08(水) 01:14:16できる。C99。
0178デフォルトの名無しさん
2009/07/08(水) 16:30:470179デフォルトの名無しさん
2009/07/08(水) 19:27:02http://www.mikeash.com/?page=pyblog/friday-qa-2008-12-26.html
http://landonf.bikemonkey.org/code/iphone/Using_Blocks_1.20090704.html
0180デフォルトの名無しさん
2009/07/09(木) 00:31:15Cocoa を Obj-C で組んでいると block が非常に欲しくなるのは事実なのだが、
C レベルで言語仕様を追加するのはいかがなものかという気もしないでもない
0181デフォルトの名無しさん
2009/07/16(木) 09:05:120182デフォルトの名無しさん
2009/07/16(木) 09:10:34いつかって0xということは今年中なわけだけど
そんな情報入ってないぞ
0183デフォルトの名無しさん
2009/07/16(木) 10:28:56gccがC++0xに対応すればその瞬間にObjC内でもC++0xが使えるわけだが
0184デフォルトの名無しさん
2009/07/16(木) 11:05:400185デフォルトの名無しさん
2009/07/29(水) 00:40:41なんでですか?
0186デフォルトの名無しさん
2009/07/29(水) 05:29:57あんま好きじゃないけど
0187デフォルトの名無しさん
2009/07/29(水) 07:23:35それは性能が激遅になってありえないですね
STLの50分の1しか性能ないのにありえないじゃないですか?
0188デフォルトの名無しさん
2009/07/29(水) 09:19:59Foundationのコレクションて、アプリケーションドメインで必要なものじゃなくて、
APIとのデータ交換に必要なものでしょ。
アプリ内でパフォーマンスを稼ぎたいなら、stlでもboostでも使えばいい。
データ交換には、タプル、配列、ハッシュの三種があれば十分。
0189150
2009/07/29(水) 23:21:15>ttp://homepage.mac.com/mkino2/spec/optimize/foundation.html
0190デフォルトの名無しさん
2009/07/29(水) 23:29:15普通に満足なんだけど、STLってそんなに早い?
CFで固めると、void*埋め込めるしオブジェクトのretain/release
すっとばせるし、楽だと思うんだけど。
0191デフォルトの名無しさん
2009/07/29(水) 23:39:16NSMutableStringを継承したクラスを作りたいのですが
その中で、initWithString:を継承先のクラスに適合させるには
どうやってラップすればいいれしょうか
0192デフォルトの名無しさん
2009/07/30(木) 00:42:230193デフォルトの名無しさん
2009/07/30(木) 22:47:45オブジェクトを突っ込んだ後
それを取り出すときに、どうやって型判別するのですか?
たとえばインターフェイスA、B、C、Dのインスタンスをいくつか
追加しているとの想定時、とどのように判断するのがObj-Cだと一般的なのでしょうか?
0194デフォルトの名無しさん
2009/07/30(木) 23:01:190195デフォルトの名無しさん
2009/07/30(木) 23:11:03突っ込むインターフェースが増えた場合に、判定する箇所も増えるため、
バグを生みやすくなる(判定箇所の修正忘れ等)
Obj-Cに限らず、コンテナには、同一クラス、または親(先祖)が同一のクラスに制限しておく方が安全と思われます。
どうしても異なるクラス、親、先祖を入れたいのであれば、
全てのクラスにプロトコルを採用し、共通の操作を行える様にするのが落としどころではないでしょうか?
0196デフォルトの名無しさん
2009/07/30(木) 23:24:39そのAPIを単純に1億回実行してみたのですが
全然終わる気がしませんでした。たぶん普通の
用途では使えないと思います。
>>195
なるほど勉強になります。
A、B、Cの祖先をRとして
@interface R : NSObject
...
@end
@interface A : R
...
@end
として操作するのはまぁいいのですが、例えば
入れ子になる。つまりCなんかがNSArrayなどの
サブクラスをインスタンスに持ち、再帰的に呼び出す
場合、どのように扱うのが一般的なのでしょうか。
@interface C : R
{
NSMutableArray *array;
...
}
...
@end
0197デフォルトの名無しさん
2009/07/31(金) 07:57:300198デフォルトの名無しさん
2009/07/31(金) 08:03:160199デフォルトの名無しさん
2009/07/31(金) 11:32:360200デフォルトの名無しさん
2009/07/31(金) 12:21:19Objective-C に限らない話だとおもうが、
コレクションから A, B, C を取り出すループを書いて、 (全部 R のサブクラス)
そのなかであからさまに C の場合だけ違う処理をさせるというのは
良くないです。
コレクションから取り出すループ内で
クラスが C の場合だけ再帰的にしたい、というのは、
カプセル化に反します。
isKindOfClass: とか、
C++ なら dynamic_cast は最後の手段なので、
使いたくなったら反省すべきです。
ループ内ですべき仕事は R のメソッドにしておいて、
for(R* r in array){
[r doSomething];
}
として、C での doSomething の実装内で NSMutableArray*array の内部の
操作をするのがよい。
0201デフォルトの名無しさん
2009/07/31(金) 12:28:44再帰的なら、こういう事?
@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]]) {…}
…
}
0202デフォルトの名無しさん
2009/07/31(金) 13:57:52Obj-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
などは、実際に要素を追加/削除して例外発生させない限り、判定できない。
0203デフォルトの名無しさん
2009/07/31(金) 14:45:420204デフォルトの名無しさん
2009/07/31(金) 19:43:440205デフォルトの名無しさん
2009/08/01(土) 00:17:53それにべったり依存して型判定だらけになったプログラムも
オブジェクト指向らしくないと思う。
まずは>>200,204のアプローチで設計し、
どうしようもない時だけ型判定で逃げるのが正道では。
0206デフォルトの名無しさん
2009/08/01(土) 01:31:27>Obj-C触り始めて間もないのかな?isKindOfClass: は全く、全然、断じて、1�_も、
>最後の手段ではない。むしろ型判定の、最初の手段といっても過言ではない。
0207デフォルトの名無しさん
2009/08/01(土) 02:53:120208196
2009/08/01(土) 13:22:20では、基底クラスを設けないで@protocolで
doSomthingを定義し、それを実行するのは
Obj-C的にはどうでしょうか?
>>201
そのようなコードを書いて、これ気持ち悪いコードだと思ったので
ここで質問させてもらいました。
>>207
respondsToSelectorって頻繁に呼び出してもいいものでしょうか?
例えばRSSを解析するなどの用途で何度も何度も呼び出すと
いいのだろうかと疑問に思うのですが
0209デフォルトの名無しさん
2009/08/01(土) 15:32:22なんで RSS 処理で respondsToSelector とかの高等手段が必要なのか
わからないんですが、どういう処理を書こうとしてるのか教えてください。
あと、respondsToSelector を頻繁に呼び出して良いか、ですが、
人によって「頻繁」の定義が違うので難しいです。
あなたのばあいは一億回とか平然と言うひとなので
頻繁に呼び出しちゃだめです。
最近はパソコン速いので100回や1000回ぐらいどうってことないです。
あと、スピードが気になったら Instrument 等でスピードを実測して、
プログラムのどこの部分で実際に時間がかかっているかチェックしましょう。
自分の勝手な思い込みで、実際には時間がかかってないところを
最適化してもしかたがないので。
0210デフォルトの名無しさん
2009/08/01(土) 15:36:01>doSomthingを定義し、それを実行するのは
>Obj-C的にはどうでしょうか?
別に基底クラスをつくるのと変わらないです。
R* x のかわりに id<R> x になるだけです。
0211デフォルトの名無しさん
2009/08/11(火) 16:06:51豹買ってもいいけどもうすぐ雪豹でるし…
でもそうしたら休暇が終わっちまう!
0212デフォルトの名無しさん
2009/08/11(火) 18:12:360213デフォルトの名無しさん
2009/08/14(金) 16:47:25sample
#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
0214デフォルトの名無しさん
2009/08/14(金) 16:48:40- (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;
}
0215デフォルトの名無しさん
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
0216デフォルトの名無しさん
2009/08/14(金) 17:01:01CのsuperであるBのmethod2で更にsuperであるAを呼び出していました。
継承でoverrideを繰り返してもsuperで呼び出せるのはその一つ前でいいんですよね。
0217デフォルトの名無しさん
2009/08/14(金) 17:04:27そうだよ。
0218デフォルトの名無しさん
2009/08/15(土) 00:30:27本題と関係ないが、
#import <Foundation/NSObject.h>
とわざわざ細かく指定するとかえってコンパイルが遅くなりかねないよ。
プリコンパイルドヘッダが使えなくなるので。
#import <Foundation/Foundation.h>
にしておきましょう。
あと printf じゃなくて NSLog(@"hogehoge") をつかうのが一般的じゃないかな。
0219デフォルトの名無しさん
2009/08/15(土) 19:15:23萩原Obj-C(1.0のやつ)をはじめたばかりで、本のサンプルみながらやっているもので。
NSLogは索引をみると後半で出てきますが、まだそこまで到達していないです。(今Ch04あたり)
本当は今ならObj-C 2.0をやるべきなのでしょうけれど、実行環境がまだTigerなので1.0でないとたぶん本のサンプルが動かないと思うので1.0の本を使っています。
0220デフォルトの名無しさん
2009/08/16(日) 01:05:12なるほど。まあ日進月歩の世界で本はすぐに古くなるけど、がんばってね!
0221sage
2009/08/16(日) 08:09:19シンプルにコンソールに出力するならprintfでいいと思うけど。
GUIなアプリケーションの動作ログという意味なら、NSLogだが。
0222デフォルトの名無しさん
2009/08/17(月) 15:51:21%@ を後々使うかも、と考えると
最初からNSLogにしておいた方がいいかなって思う。
0223デフォルトの名無しさん
2009/08/17(月) 15:58:090224デフォルトの名無しさん
2009/08/23(日) 17:15:58荻原本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時間か分かりません。
0225デフォルトの名無しさん
2009/08/23(日) 18:28:03s=sys
0226デフォルトの名無しさん
2009/08/23(日) 19:21:530227デフォルトの名無しさん
2009/08/24(月) 20:30:49thx
これで実行時間の比較が出来ます。
0228デフォルトの名無しさん
2009/08/27(木) 12:18:22static 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な変数の初期化って定数?じゃないとできないとかですか?全インスタンスに共通なオブジェクトを持たせるにはどうすればいいのでしょうか?
0229デフォルトの名無しさん
2009/08/27(木) 12:27:20最初に使うときに初期化すりゃいいんじゃね?
0230デフォルトの名無しさん
2009/08/27(木) 12:32:14このクラス変数はnullで初期化しておいて、
最初のインスタンス生成(init)のときにnullかどうかみて
初期化するのが普通かな。
0231228
2009/08/27(木) 12:37:36static NSString *value = [[NSString alloc] init];
でした。
すいません。お願いします
0232228
2009/08/27(木) 12:39:27あ、そうか
initilizeでしたっけ?あれで初期化すればいいんですね
ありがとうございます
0233デフォルトの名無しさん
2009/08/27(木) 14:24:360234デフォルトの名無しさん
2009/09/02(水) 17:44:00- (void) doSomethig{
NSLog(@"count %d", [str retainCount]);
[str release];
NSLog(@"count %d", [str retainCount] );
}
最初のログで2だと二番目で1になるのは問題ないのですが最初で1の時に2番目でもメッセージが送れて1が帰るのですがどうしてでしょうか?retainCountが1のオブジェクトにreleaseを送信後メッセージを送るとランタイムエラーになるんじゃなかったでしたっけ?
0235デフォルトの名無しさん
2009/09/02(水) 17:57:490236234
2009/09/02(水) 18:00:27int 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になって最後のログでエラーが出ます。これはどうしてでしょうか?お願いします。
0237デフォルトの名無しさん
2009/09/02(水) 18:36:470238234
2009/09/02(水) 19:04:07ありがとうございます。
プール?
retainCountはNSObjectのメンバ変数で
allocでインスタンス作った時は関係ないんですよね?
つまり自分自身にどれだけ参照されてるかの数を持っていて
releaseが呼ばれて0になったときdeallocが呼ばれると。
プールが関係あるのはautoreleaseを自分でした時とそれを呼び出してるような
コンストラクタを呼び出したときですよね?
もしかしてなんか間違って勉強進めてます?
0239デフォルトの名無しさん
2009/09/02(水) 19:21:05まともな結果が戻ってるわけがない。
> retainCountが1のオブジェクトにreleaseを送信後メッセージを送るとランタイムエラーになるんじゃなかったでしたっけ?
そんな仕様はない。
0240デフォルトの名無しさん
2009/09/02(水) 20:41:49最後のNSLogで存在しない(解放済み)オブジェクトにメッセージを送っているからエラーが出る。
0241デフォルトの名無しさん
2009/09/02(水) 20:44:55NSMutableStringはtoll free bridgeになってるから実体はCFMutableStringでしょ。
0242234
2009/09/02(水) 21:22:08236を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にメッセージが送れてしまうのかとおもったのです。
0243デフォルトの名無しさん
2009/09/02(水) 22:29:30実行中のコードをデバッグできるやつ。
0244デフォルトの名無しさん
2009/09/02(水) 22:32:410245デフォルトの名無しさん
2009/09/02(水) 22:59:37どこにいけばある?
0246デフォルトの名無しさん
2009/09/02(水) 23:24:560247デフォルトの名無しさん
2009/09/02(水) 23:55:39少年の日の心の中にいた青春の幻影
では困るのだけど。
0248デフォルトの名無しさん
2009/09/03(木) 10:07:49マルチ乙
0249デフォルトの名無しさん
2009/09/03(木) 12:08:37[[クラス alloc] init] の結果は retain count が 1 であるとは決まってません。
既に存在するオブジェクトが使い回されることもよくあります。
[NSNumber alloc] initWithInt:1] を何回も呼んで NSNumber をつくったとして、
毎回違うオブジェクトを作る必要は全くないでしょ?
だから二回目以降は単にすでにある object をどっかからとってきて、
単に retain して返しているだけかもしれません。
NSString の場合は理由が違って、alloc] init] の段階では
class cluster の中のどのクラスが実際に使われるかきまってないので、
NSPlaceholderString というのの唯一のインスタンスが使い回されてるんです。
とにかくそんなことを気にせずに、retain / release をきちんとしていたら
問題はないようになってます。
0250242
2009/09/05(土) 21:30:20レスありがとうございます
クラスクラスターまでまだ行ってないのですが、NSStringの説明でその言葉は見たことがあったので、なんかそれが関係してるのかな、と思ってました。
とりあえず、先へ進もうと思います。
0251196
2009/09/06(日) 22:10:26継承階層増えるだけでどれくらい
オーバーヘッドあるのですか?
0252デフォルトの名無しさん
2009/09/06(日) 23:16:090253デフォルトの名無しさん
2009/09/07(月) 10:47:390254デフォルトの名無しさん
2009/09/07(月) 13:05:58ランタイムの実装次第じゃない?
0255デフォルトの名無しさん
2009/09/07(月) 23:50:03計測してみたら?
0256デフォルトの名無しさん
2009/09/09(水) 17:48:11>質問がおかしかったですね。すいません。エラーが起きないのはなんででしょうか?と聞きたかったのです。
とても基本的なことなので覚えておくべきなのですが、
C、 C++、 Objective-C などの言語では解放済みのメモリ領域や
オブジェクトに対する操作の結果は決められていません。
そもそも「エラーが起きる」という決まりがないのです。
(処理系によってはデバッグ用のライブラリでは解放後のメモリを
変な数値で埋めるなどして、解放済みのオブジェクトへの操作で
エラーが出やすいようにしてくれるような機能もあります)
0257デフォルトの名無しさん
2009/09/10(木) 12:56:51@interface CHoge : NSObject{ void (*_ptr)(); }
// _ptrのアクセサを書きたい
@end
このインスタンス変数を読み書きするためのアクセサをどうやって書けばよいかわかりません。
わかる方教えていただけますでしょうか?
0258デフォルトの名無しさん
2009/09/10(木) 14:01:44return (*_ptr)();
}
- (void)set_ptr:(void)(*hoge)() //関数セット
{
void _ptr = hoge
}
じゃ駄目なの?
0259デフォルトの名無しさん
2009/09/10(木) 14:02:430260デフォルトの名無しさん
2009/09/10(木) 17:50:31@interface CHoge : NSObject{ void (*_ptr)(); }
@property (nonatmic, assign) void (*ptr)();
@end
と宣言しといて, @synthesize ptr=_ptr; で生成してもらうか、
- (void (*)())ptr {
return _ptr;
}
- (void)setPtr:(void(*)())ptr {
_ptr = ptr;
}
などと自前で書く。
0261デフォルトの名無しさん
2009/09/10(木) 19:31:49warning: multi-line comment
に嵌った・・・
能で改行するなよぅ。
0262デフォルトの名無しさん
2009/09/10(木) 23:27:190263デフォルトの名無しさん
2009/09/12(土) 00:46:330264デフォルトの名無しさん
2009/09/12(土) 01:02:59char buf[1024];
で用意したバッファにreadで文字を読み込みます。
その後、NSStringのプロパティを持つやつに
label.text = @"buf";
のように受け取った文字をNSStringに変換して代入したいと考えてます。
今のところ、
NSString *str = [[NSString alloc] initWithUTF8String:szStr];
label.text = str;
[str release];
のようにやっているのですが、2回目以降はうまく代入できません。
0265デフォルトの名無しさん
2009/09/12(土) 01:21:14↑ダメな質問の例
0266デフォルトの名無しさん
2009/09/12(土) 01:45:07デバッガを使えるようになりましょう。
0267264
2009/09/12(土) 03:11:05出直してきます。。。
0268デフォルトの名無しさん
2009/09/12(土) 11:11:440269デフォルトの名無しさん
2009/09/12(土) 15:53:36>デバッガの使い方ってアップルからドキュメント出てますか?
Xcodexのドキュメントに乗ってないか? どこにでもあるようなデバッガ
だから、マニュアルなしでも使えるぞ。
0270デフォルトの名無しさん
2009/09/15(火) 01:26:27label.text = str;
のあとにstr releaseすると、label.textもreleaseされちゃわないか?
0271デフォルトの名無しさん
2009/09/15(火) 03:17:020272デフォルトの名無しさん
2009/09/15(火) 13:27:100273デフォルトの名無しさん
2009/09/15(火) 14:23:090274デフォルトの名無しさん
2009/09/15(火) 14:53:090275デフォルトの名無しさん
2009/09/15(火) 16:57:11自力DeepCopy?
0276デフォルトの名無しさん
2009/09/15(火) 17:10:05参照を保持させたいのか、それともインスタンスを複製して保持させたいのか、だろ?
0278デフォルトの名無しさん
2009/09/15(火) 19:32:51そこは状況に応じて、だろ。
0279デフォルトの名無しさん
2009/09/15(火) 20:42:03get、setメソッドを使わないと、=だとオブジェクトの参照が
代入されるだけだからなぁ。
そりゃ、[str release];は実質、[label.text release];と同じになるだろうな
0280デフォルトの名無しさん
2009/09/15(火) 20:53:02それとも、もうGC導入されて、あんま使ってない?
0281デフォルトの名無しさん
2009/09/15(火) 22:40:53自分で明示的にpool作ってないんならイベントループ終了時にそのループ内でのプールが解放される
0282デフォルトの名無しさん
2009/09/15(火) 22:49:35そう!まさに、そのイベントループとやらがようわからんのです。。。
0283デフォルトの名無しさん
2009/09/15(火) 23:16:51>get、setメソッドを使わないと、=だとオブジェクトの参照が
>代入されるだけだからなぁ。
昔はそうだったっけ
0284デフォルトの名無しさん
2009/09/15(火) 23:22:29えっ、いまはちがいまするか?
0285デフォルトの名無しさん
2009/09/15(火) 23:25:23Objective-C 2.0 以降しか知らないけど、
obj.prop = hoge は [obj setProp:hoge] と同義。
0286デフォルトの名無しさん
2009/09/15(火) 23:48:58へー、そうなんだ。
勉強になった。
ただ、知らないと、逆に参照渡ししたいときとかハマったりしそう。。
それとも、プロパティの時に限って、=がアクセッサメソッド呼び出し
で実装してくれるのかな?
0287デフォルトの名無しさん
2009/09/16(水) 00:12:06てかなんでみんなCocoaスレでやらないのw
0288デフォルトの名無しさん
2009/09/16(水) 00:14:30(これもCocoaスレでやる話?w)
0289デフォルトの名無しさん
2009/09/16(水) 00:47:07いやいやそうじゃなくて、そもそもクラスCにインスタンス変数x があったときに
C* c=...
c.x=
は(xがプロパティでなければ)文法エラーだから。cはポインタだから、やるにしても
c->x=
でしょ。曖昧さはないです。
0290デフォルトの名無しさん
2009/09/16(水) 00:54:45なるほど。
確かにObjective-Cのクラスのメンバにはc.xみたいにはアクセス
できないよねprivateメンバじゃなくても
c->xになる。
で、ごめん、質問なんだけど、プロパティって何だっけ?w
0291デフォルトの名無しさん
2009/09/16(水) 09:42:48ttp://e-words.jp/w/E38397E383ADE38391E38386E382A3.html
質問の内容が低レベルすぎる
0292デフォルトの名無しさん
2009/09/16(水) 09:56:37ttp://journal.mycom.co.jp/column/objc/018/index.html
0293デフォルトの名無しさん
2009/09/16(水) 14:53:14C でいう関数ポインタは特定の関数の実装を直接指示するでそ(実体はアドレスだし)。
C++ のメンバ関数ポインタは、特定のクラス(とその派生クラス)のオブジェクトの仮想あるいは
そうでない関数を間接的にあるいは直接に指示するでそ(実体はvtbl上のオフセットまたはアドレス)。
Objective-C のセレクタは、どのようなクラスあるいはインスタンスのメソッドでも名前で指示する
ことができる(実体は文字列)。
0294デフォルトの名無しさん
2009/09/16(水) 20:03:40ggrksって感じですまんかった。
んで、プロパティって、つまりはメンバ変数のことだとおもうけど、
そうするとc.xのようにドットで表すのは間違いじゃねって思ったんだけど
それは間違い?
>>289が納得できない
0295デフォルトの名無しさん
2009/09/16(水) 20:18:250296デフォルトの名無しさん
2009/09/16(水) 20:26:24Obj-CのプロパティはC++のメンバ変数じゃないから . で表しても全く問題ない。
最近の言語では当たり前の糖衣構文。C# も同様のシンタックスシュガーを持つ。
とはいえ、foo の bar プロパティが構造体だったとき、foo.bar.baz = 100 で
foo.bar.baz が 100 にならないのはみっともないのは確か。
0297デフォルトの名無しさん
2009/09/16(水) 21:26:55始めたばかりの頃コレでハマったのはいい思い出。
0298デフォルトの名無しさん
2009/09/17(木) 02:58:22NSDate *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.)
という警告が出るのですが、これはどういう事なのでしょうか?
0299デフォルトの名無しさん
2009/09/17(木) 04:05:43NSDateFormatterを使いましょう。Mac側でもやめる気満々なことが書いてあるので
できれば移行していった方がよいようだ。
0300デフォルトの名無しさん
2009/09/17(木) 10:57:56そうでしたか。ありがとうございます!
おかげさまで警告なしでビルドできるようになりました。
0301デフォルトの名無しさん
2009/09/18(金) 01:09:24NSHost *host = [NSHost hostWithAddress:@"192.168.0.125"];
の部分で、+hostWithAddreassメソッドが見つからないという警告が出てしまいます。
Mac OSX Reference Libraryを参照しながら作ってるので、見つからないはずはないのですが、
iPhoneで実装するとしたら変わりに何を使えばいのでしょうか・・・。
というか、変わりとなるクラスやメソッドってどうやって調べればいいのでしょうか・・・
0302デフォルトの名無しさん
2009/09/18(金) 09:01:510303デフォルトの名無しさん
2009/09/18(金) 18:30:44それもダメなようです・・・。
0304デフォルトの名無しさん
2009/09/18(金) 18:57:40綴りミス?
+hostWithAddre[a]ssメソッドが見つからないという警告が出てしまいます
0305デフォルトの名無しさん
2009/09/18(金) 19:03:45綴りミスです。ごめんなさい。
プログラムの方はちゃんと書いてあります。
警告あっても、正常に動作はするのですが、警告があるままやるのは気持ち悪いですね・・・
0306デフォルトの名無しさん
2009/09/18(金) 19:16:43警告に添え
0307デフォルトの名無しさん
2009/09/18(金) 19:19:51で、deprecatedでない代替メソッドはなんなの?
0308デフォルトの名無しさん
2009/09/18(金) 19:24:250309デフォルトの名無しさん
2009/09/18(金) 19:25:590310デフォルトの名無しさん
2009/09/18(金) 21:57:57CFHostCreateWithName()
0311デフォルトの名無しさん
2009/09/19(土) 08:50:390312デフォルトの名無しさん
2009/09/19(土) 08:52:040313デフォルトの名無しさん
2009/09/19(土) 08:58:08さて、なに作ろうw
0314デフォルトの名無しさん
2009/09/19(土) 10:00:000315デフォルトの名無しさん
2009/09/19(土) 15:33:510316デフォルトの名無しさん
2009/09/20(日) 22:47:54NSLog(@"%@", message);
[message release];
とある関数の中にこういうコードがあるのですが、
2回目呼び出した時に、メモリ関係のエラーか何かが出てしまいます。
この記述って何か間違ってるのでしょうか?
0317デフォルトの名無しさん
2009/09/20(日) 22:50:45alloc initWith するか NSLog(@"%@", [NSString stringWithUTF8String:[messageData bytes]]); で
0318デフォルトの名無しさん
2009/09/20(日) 22:58:01ありがとうございます。エラーが消えました!
基本的にreleaseするのはallocした時だけって認識持っといていいんですかね・・・
0319デフォルトの名無しさん
2009/09/20(日) 23:09:520320デフォルトの名無しさん
2009/09/20(日) 23:31:07放っておけば勝手にreleaseされるんですね。
0321デフォルトの名無しさん
2009/09/22(火) 13:35:530322デフォルトの名無しさん
2009/09/22(火) 16:47:430323デフォルトの名無しさん
2009/09/22(火) 21:42:410324デフォルトの名無しさん
2009/09/23(水) 22:42:16Stack: (0x305a2e6f 0x30504682 0x2dc4 0x960b0155 0x960b0012)
ビルドとデバッグをすると、あるところでこういうメッセージが出るのですが、
これって何か問題が起こっているのでしょうか?
その後も特に問題なくアプリは動いているのですが・・・
パッとみた感じだと、NSCFNumberはオートリリースされたってだけで別に問題ない・・・んですかね。。。
0325デフォルトの名無しさん
2009/09/23(水) 23:20:20NSNumber *num = [NSNumber numberWithInt:iRet];
NSLog(...);
[num release];
こういう場所(NSNumberやNSStringの生成や解放を行う場所)で必ず出てくるっぽいです。
0326デフォルトの名無しさん
2009/09/23(水) 23:28:10問題があるので autorelease pool について勉強してください
0327デフォルトの名無しさん
2009/09/23(水) 23:30:13問題ありですか・・・。
わかりました、ヒントをありがとうございます!
知らない言葉なのでちょっと勉強してきます
0328デフォルトの名無しさん
2009/09/23(水) 23:44:52クラスを作るまでもない関数ってどういう風に宣言すればいいのでしょうか・・・?
C言語でいう、ふつうの void swapInt(int a, int b); みたいな感じの関数を作りたいと思ってます。
クラスのメソッドだったら
-(void)showMessage:(NSString *)nsstrMsg flag:(BOOL *)flag
{
...
}
みたいな感じで作るのは分かっているのですが・・・。
それとも、Objective-CはC言語のような関数は基本的になくて、それでも使いたい場合は
クラスを定義して、クラスメソッドを用意するのが普通なのでしょうか?
0329328
2009/09/23(水) 23:45:360330デフォルトの名無しさん
2009/09/24(木) 13:23:26void swapInt(int a, int b);
じゃだめなの?
0331デフォルトの名無しさん
2009/09/24(木) 15:54:11今はそのC言語ライクな書き方で対処して正常に動いてるのですが、
なんかObject-Cのソースの中に、Cの記述方法が混ざってるのが気持ち悪くて・・・
0332デフォルトの名無しさん
2009/09/24(木) 15:59:030333デフォルトの名無しさん
2009/09/24(木) 16:13:08その書き方で書くならその書き方でソースコードを統一した方が気持ちいいんだもん・・・
0334デフォルトの名無しさん
2009/09/24(木) 16:25:440335デフォルトの名無しさん
2009/09/24(木) 18:16:440336デフォルトの名無しさん
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];
あなた以外誰も得しませんが。
0337デフォルトの名無しさん
2009/09/24(木) 20:45:44他人のObjCコード一度読んでみるといいよ
みんな平気で使ってるから
0338デフォルトの名無しさん
2009/09/24(木) 21:10:20すんません、>>282わかりますか?
0339デフォルトの名無しさん
2009/09/24(木) 21:10:410340デフォルトの名無しさん
2009/09/24(木) 22:37:19NSApplicationMain()を実行するとイベントループという名の無限ループが開始される。
各アプリケーションにはイベントキューというキューがある。
イベントループの最初にNSAutoreleasePoolオブジェクトが確保される。
イベントループはイベントキューにイベントがはいってくるまで寝る。
Mac OS Xはイベントが発生すると該当アプリケーションのイベントキューにイベントを放り込む。
またはアプリケーションが自分のイベントキューにイベントを放り込む。
イベントキューにイベントが入るとイベントループは目を覚ます。
アプリケーションはイベントに応じて動作を起こす。
確保されたNSAutoreleasePoolオブジェクトが解放される。
始めの当たりに戻る。
アプリケーションを終了するとなんとexit(3)を呼び無限ループを吹っ飛ばす!!
余分な情報も混ぜてみました。必要な所だけお読みください。
0341デフォルトの名無しさん
2009/09/24(木) 22:44:43イベントループ内での autorelease pool は NSPortDelegate の handlePortMessage:
呼び出し前に autorelease pool が作られ、呼び出し後に drain される、と思えばok。
(メインスレッドではこれを勝手にやってくれているのであまり気にしなくてよい)
NSThread 等でワーカスレッドを立ち上げただけでは作ってくれないので、そのときは
ちゃんと自前で作ってやらないとautorelease されるインスタンスが登場する処理
(明示的に使うもの、内部処理で使うもの、のいずれも)が>>324の様にエラーになる。
NSThread NSAutoreleasePool でググればたぶん誰かが何か書いてると思う
御指名の 326 じゃないので嫌なら無視してくれ
0342338
2009/09/24(木) 22:45:40すばらしい。。。
いままで、いろんな人に訊いてきたけど、ここまで明快に
わかりやすく答えてくれた方はいませんでした。
これで、安心して[obj autorelease];を使えます。
どうもありがとうございました。
0343338
2009/09/24(木) 22:50:07おお、更なる詳しい説明!
しかしながら、>>340さんの説明までは理解できましたが、
>>341さんの説明は自分の知識不足でちょっと難解です。。。
はぁ。。
せいぜいがんばります。
どうもありがとうございます。
0344デフォルトの名無しさん
2009/09/25(金) 23:36:34このあたりも凄く参考になるぜ
第10-13回らへん
0345デフォルトの名無しさん
2009/09/25(金) 23:59:480347デフォルトの名無しさん
2009/09/29(火) 18:33:500348デフォルトの名無しさん
2009/09/30(水) 06:42:58無理です
あと、ここではなくiPhoneアプリ開発のスレに書きこんだ方がいいかと
0349デフォルトの名無しさん
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した後は、元のオブジェクトは必要なくなるって認識でいいのでしょうか?
0350デフォルトの名無しさん
2009/10/09(金) 06:38:190351デフォルトの名無しさん
2009/10/09(金) 08:42:00retain/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 がこのオブジェクトを保持するぜ!と言っているので、
あなたはもうこのオブジェクトを保持している必要がなくなるわけです。
0352デフォルトの名無しさん
2009/10/09(金) 14:54:17ありがとうございます。もんのすごく分かりやすいです。
一応リンク先の方も読んでおこうと思います。
結構既にメモリまわりのエラーが時々出たりしているので・・・
0353デフォルトの名無しさん
2009/10/09(金) 15:06:580354デフォルトの名無しさん
2009/10/09(金) 15:11:02そうですね、ちゃんと読みます。
リンク先が英語で焦ったのですが、メモリに関する日本語リファレンス探したらあったのでそっちを読みます。
https://developer.apple.com/jp/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt
0355デフォルトの名無しさん
2009/10/10(土) 18:22:49GNUSTEPのソースを追えば、理解できると思う。
0356デフォルトの名無しさん
2009/10/11(日) 18:49:15bad 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];
このコードに何か問題がありますでしょうか?
0357デフォルトの名無しさん
2009/10/11(日) 18:56:450358デフォルトの名無しさん
2009/10/11(日) 18:59:50あれ?それだとエラーが出てこなくてちゃんと動きます。
謎なんですけど・・・
0359デフォルトの名無しさん
2009/10/11(日) 19:03:500360デフォルトの名無しさん
2009/10/11(日) 19:09:17で url の方にちゃんと入ってるかどうか確認したところ
url = (null)
と表示されました。>>357さんのようにNSStringに直接ぶちこんだ時はちゃんとurlが表示されました。
でも、NSLog(@"nssUrl = %@", nssUrl);でnssUrlの中身を確かめたら、
stringWithFormat:で生成したときもちゃんとURLが表示されます。
NSURL *url = [NSURL URLWithString:nssUrl];
に何か問題があるのでしょうかね・・・
0361デフォルトの名無しさん
2009/10/11(日) 19:13:54おぉ、ありがとうございます。1文字ずつ表示させていったら
[semanticList objectAtIndex:i]のあとに空白?みたいなのが1つ入ってました。
なんでだろう・・・とりあえず後は自分で原因探してみます。ありがとうございました!
0362デフォルトの名無しさん
2009/10/11(日) 19:27:03ありがとうございました。
0363デフォルトの名無しさん
2009/10/12(月) 00:13:570364デフォルトの名無しさん
2009/10/12(月) 01:29:230365デフォルトの名無しさん
2009/10/12(月) 02:01:49NSError *err;
if([[NSFileManager defaultManager] isDeletableFileAtPath:filePath]){
NSLog(@"消すことが可能");
[[NSFileManager defaultManager] removeItemAtPath:filePath error:&err];
NSLog([err localizedDescription]);
}
上のコードを実行すると、NSLogの部分でEXC_BAD_ACCESSが出ます。
そもそものNSErrorの使い方が間違ってるのでしょうか?
0366デフォルトの名無しさん
2009/10/12(月) 02:21:12ってしてみて
0367デフォルトの名無しさん
2009/10/12(月) 02:51:14ありがとうございます!
無事エラーが出ないようになりました。
なんかよくわかりませんが、allocもinitもせずに宣言するときはとりあえずnilをぶち込んでおく癖をつけておきます。
0368デフォルトの名無しさん
2009/10/12(月) 03:06:32そうです。Cの関数から返されたポインタのcharをNSNumberにしたいです。
今はNSStringに変換してからNSNumberに再変換してます。。
0369デフォルトの名無しさん
2009/10/12(月) 03:26:11何したいのか分からないから、この処理の部分を書いてみて
0370デフォルトの名無しさん
2009/10/12(月) 04:10:56char *c = (Cの関数);
NSString *str = [NSString stringWithCString:c];
NSNumber *num = [NSNumber alloc] initWithInt:[str intValue]];
NSStringを介さずNSNumberにしたいです。
0371デフォルトの名無しさん
2009/10/12(月) 04:23:25ってことか。NSString かませる必要ないね。
0372デフォルトの名無しさん
2009/10/12(月) 04:41:21そんな関数があるんですね、ありがとうございました!
0373デフォルトの名無しさん
2009/10/12(月) 07:34:32べつにそれでいいでしょう。なんでそれじゃいやなの?
あと、strintWithCString は deprecated なので使わないこと!
文字コードの問題でいずれハマりますよ。
かならず UTF8String か encoding: つきのメソッドをつかってください
0374デフォルトの名無しさん
2009/10/12(月) 11:07:42「とりあえずnilをぶち込んでおく」とかいう意味のない癖をつけるよりも、
NSErrorに触る前にその処理が成功したのか失敗したのか判断する癖をつけましょう。
http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError.html#//apple_ref/doc/uid/TP40001806-CH204-SW2
処理が成功した場合、NSErrorにobjectが代入されていることは保証されていません。
0375デフォルトの名無しさん
2009/10/12(月) 21:47:170376デフォルトの名無しさん
2009/10/12(月) 22:54:27いや、訳も分からずとりあえずnilを入れるのは良くないよ、て言いたいんじゃないの?
0377デフォルトの名無しさん
2009/10/13(火) 00:58:25温床になるって書いて置けばまだ
分かりやすいかな。
0378デフォルトの名無しさん
2009/10/13(火) 02:04:190379デフォルトの名無しさん
2009/10/14(水) 16:51:04クラスAの中でクラスBのオブジェクトを保持したくて、
クラスBの中でクラスAのオブジェクトを保持したいのですが、
それぞれのヘッダファイルの中でimportしようとすると入れ後状態?みたいになって
コンパイルが通りません。こういう場合はどうすればいいのでしょうか。
0380デフォルトの名無しさん
2009/10/14(水) 16:58:48循環参照が発生してるのかな?
スーパークラスかインターフェイスを作成して、それを保持させるとどうかな?
0381デフォルトの名無しさん
2009/10/14(水) 16:59:380382デフォルトの名無しさん
2009/10/14(水) 17:00:05あーなるほど、そういう方法があるんですね。
ありがとうございました!
0383デフォルトの名無しさん
2009/10/14(水) 17:13:55まてまてまて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"
0384デフォルトの名無しさん
2009/10/14(水) 17:14:490385デフォルトの名無しさん
2009/10/14(水) 17:59:46ぎゃー、すでに変更し始めてました。
ちょっとバックアップファイルから復元して@classでやってみます。
0386デフォルトの名無しさん
2009/10/14(水) 18:04:48Objective-Cに興味があってこのスレ見てるけど、コードを書いた事が無いのにレスした俺のせいでスマン…
0387デフォルトの名無しさん
2009/10/14(水) 18:13:47ありがとうございました!
>>386
なんという・・・w
0388デフォルトの名無しさん
2009/10/14(水) 18:48:20>Objective-Cに興味があってこのスレ見てるけど、コードを書いた事が無い
なんだ、俺は他にもいたのか
0389デフォルトの名無しさん
2009/10/14(水) 21:15:200390デフォルトの名無しさん
2009/10/15(木) 10:51:48#include <stdio.h>
int main(int argc, char*argv[]){printf("Hello world.\n");return 0;}
^D
make hello
./hello
サフックスが.mだからObjCとしてコンパイルされます!
これでObjCプログラマの仲間入りです!
0391デフォルトの名無しさん
2009/10/15(木) 11:06:110392デフォルトの名無しさん
2009/10/16(金) 00:58:07例えば文章の中に
http://www.google.co.jp/
のようなアドレスがあれば、
<a href="http;//www.google.co.jp/>http;//www.google.co.jp/</a>
のように置換したいのですが・・・やり方がいまいちわかりません。
とりあえずNSStringのメソッドを見る限りだと無理で、NSMutableStringのメソッドを見る限りだと、
replaceOccurrencesOfString:withString:options:range:のようなメソッドがあったのですが、
正規表現が使えるのか不明です。何かいい方法はないでしょうか?
0393デフォルトの名無しさん
2009/10/16(金) 01:04:280394デフォルトの名無しさん
2009/10/16(金) 01:49:26ありがとうございます。
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/が消えてしまってるのですが、何が間違ってるのでしょうか?
0395デフォルトの名無しさん
2009/10/16(金) 02:01:15I like <a href="http://">http://</a>google.co.jp yeah!!
になりそうなんですけどね・・・
0396デフォルトの名無しさん
2009/10/16(金) 02:05:040397デフォルトの名無しさん
2009/10/16(金) 02:25:22でいいんじゃないの
0398デフォルトの名無しさん
2009/10/16(金) 02:44:41無事マッチできました。ありがとうございました!
0399デフォルトの名無しさん
2009/10/17(土) 05:37:25200が返されます。何故なんでしょうか?
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が返されます。
これもよく理由がわかりません。。
0400デフォルトの名無しさん
2009/10/17(土) 06:31:060401デフォルトの名無しさん
2009/10/17(土) 06:50:20へ、死ぬんですか。
変数pはvoid*にして、様々な型を格納できるようにしたかったのです。
まだあまり理解できていないのかも。
この辺りは何をキーワードに調べれば良いのでしょうか。
0402デフォルトの名無しさん
2009/10/17(土) 10:15:220403デフォルトの名無しさん
2009/10/17(土) 11:45:320404デフォルトの名無しさん
2009/10/17(土) 14:11:230405デフォルトの名無しさん
2009/10/17(土) 14:29:59>holder.p = &value;
ここでスタック上に一時的に作られたローカル変数のアドレス取ってるから
ゴミを拾って当たり前
Cの初歩で「ローカル変数のアドレス返しちゃダメ」みたいなトピックあると
思うからその辺から読む事
0406デフォルトの名無しさん
2009/10/17(土) 14:54:20initWithContentsOfFile:@"./images/Block_0.png"];
のところで、
initializer element is not constant
というエラーが出て途方に暮れています。
何が悪いのか、教えてください。
0407デフォルトの名無しさん
2009/10/17(土) 15:13:57NSImage *backBlock = [[NSImage alloc] initWithData:[NSData dataWithContentsOfFile:@"./images/Block_0.png"]];
とかに変えてもエラーが出るのなら、他の部分が問題。
0408デフォルトの名無しさん
2009/10/17(土) 18:26:430409デフォルトの名無しさん
2009/10/18(日) 05:31:500410デフォルトの名無しさん
2009/10/19(月) 07:59:06// プロパティ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と表示される
初歩的な質問で申し訳ないのですが、どなたか教えていただけますか?
マジで困ってます・・・
0411デフォルトの名無しさん
2009/10/19(月) 08:23:330412デフォルトの名無しさん
2009/10/19(月) 11:03:58自己解決したのはいいとして、何が原因だったかくらい書いたらどうかな?
それを読んで役に立つ人もいるはずだし。
ここでいろいろ助けてもらっても、結果は独り占めして誰にも教えたく無い、
っていう性格なら、まあ強制はしないけどね。
0413デフォルトの名無しさん
2009/10/19(月) 12:33:120414デフォルトの名無しさん
2009/10/19(月) 12:47:57>>413
なんの話をしているの?
0415デフォルトの名無しさん
2009/10/19(月) 13:54:51そうですね。すみません。
実はメモリをallocしてなかったのが原因でした
>>413
初心者は帰れ!!!!
>>414
そうです。nilでした
0416デフォルトの名無しさん
2009/10/19(月) 13:57:450417デフォルトの名無しさん
2009/10/19(月) 19:17:410418デフォルトの名無しさん
2009/10/19(月) 21:55:11これは一体どういう意味なのでしょうか?
メモリを再確保されたポインタはメモリ確保されませんでした?
いまいちよく分からないのですが、具体的にどういう時に出るエラーなのでしょうか?
0419デフォルトの名無しさん
2009/10/19(月) 22:13:15/usr/lib/libSystem.B.dylib の szone_realloc() 関数の中で
szone_size() 関数が 0 を返すと発生するエラーだよ。
http://www.opensource.apple.com/source/Libc/Libc-583/gen/scalable_malloc.c
0420デフォルトの名無しさん
2009/10/19(月) 22:13:24#include <stdlib.h>
int main(int argc, char **argv)
{
char *foo = "abc";
foo = (char *)realloc(foo, sizeof(char) * 4);
return 0;
}
みたいなことをしたときとか。
0421デフォルトの名無しさん
2009/10/19(月) 22:14:150422418
2009/10/19(月) 22:44:28NSMutableStringのappendStringあたりで変なことになってるんですかね。
とりあえずどういうエラーなのかは分かったので、地道に問題箇所探していきます。
ありがとうございました!
0423デフォルトの名無しさん
2009/10/19(月) 22:46:34413 は、OpenStep API が出る前で NSString* が無かった頃の人なんだよ。
というかここは Obj-C スレなので、Foundation があることを
仮定しないのが自然じゃないかな。
あ、でも、property 使う時点で Obj-C 2 か ...
0424デフォルトの名無しさん
2009/10/19(月) 23:01:330425デフォルトの名無しさん
2009/10/19(月) 23:40:46NSLog(@"%.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 等いくつか状況を変えて試しましたがいずれも同じ結果でした。
0426デフォルトの名無しさん
2009/10/19(月) 23:55:31偶数丸め
0427デフォルトの名無しさん
2009/10/19(月) 23:56:05NSMutableURLRequest *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];
とりあえずリファレンスとか見ながら頑張って↑のコード書いたのですが、
結局差分取得はせずに全部ダウンロードしてしまいます。
どうすればいいのでしょうか・・・
0428デフォルトの名無しさん
2009/10/20(火) 00:02:33ググってみました。ありがとうございます。
0429デフォルトの名無しさん
2009/10/20(火) 00:06:39bytes=が抜けてました。死んできます。
0430デフォルトの名無しさん
2009/10/20(火) 00:15:000431デフォルトの名無しさん
2009/10/20(火) 00:59:230432デフォルトの名無しさん
2009/10/20(火) 11:33:53Mac / iPhone Cocoa プログラムはそれぞれのスレにいくよう
強調したほうがよいかも
0433デフォルトの名無しさん
2009/10/20(火) 16:28:200434デフォルトの名無しさん
2009/10/20(火) 16:52:33暇だし
仕事ないし
0435デフォルトの名無しさん
2009/10/20(火) 16:53:48暇なら仕事みつけろよwww
0436デフォルトの名無しさん
2009/10/20(火) 17:01:380437デフォルトの名無しさん
2009/10/20(火) 17:22:02働かずに住んでいるよ。
結局、人生は親の財産次第。
馬鹿な親の子に生まれた子は、一生馬鹿。
0438デフォルトの名無しさん
2009/10/20(火) 19:01:23相続税のこととか考えると、まったく頭が痛いよ。
0439デフォルトの名無しさん
2009/10/20(火) 20:44:08働かず、暇があるなら税法をやれば良い。
それで今の税法の穴を見つけてこっそり使えばいいんじゃね。
0440デフォルトの名無しさん
2009/10/20(火) 21:17:460441デフォルトの名無しさん
2009/10/20(火) 22:10:19まぁ当たり前っちゃ当たり前か。スレ違いというか、板すら違うからなw
0442デフォルトの名無しさん
2009/10/20(火) 22:42:310443デフォルトの名無しさん
2009/10/20(火) 23:04:20releaseだ!release!!
0444デフォルトの名無しさん
2009/10/20(火) 23:17:59難しいな…
0445デフォルトの名無しさん
2009/10/21(水) 22:31:280446デフォルトの名無しさん
2009/10/21(水) 22:39:22お絵描きソフトを作ろうと思っているのですが、NSBezierPath 等 Cocoa の API を
使うのと比べてメリットはどんなところがあるでしょうか。
0447デフォルトの名無しさん
2009/10/22(木) 09:44:530448デフォルトの名無しさん
2009/10/22(木) 19:26:34ただ今回はプラットフォーム固有の機能をガンガン使って
コーディングするつもりなので、他機種の事は考えていません。
0449デフォルトの名無しさん
2009/10/22(木) 19:35:390450デフォルトの名無しさん
2009/10/22(木) 19:43:080451デフォルトの名無しさん
2009/10/22(木) 21:46:060452デフォルトの名無しさん
2009/10/22(木) 23:49:37こっちとマルチすんな
0453デフォルトの名無しさん
2009/10/22(木) 23:53:20いったい誰に向かって言ってるんだ?
0454デフォルトの名無しさん
2009/10/22(木) 23:59:160455デフォルトの名無しさん
2009/10/23(金) 00:10:45www
0456デフォルトの名無しさん
2009/10/23(金) 00:13:51お大事にね
0457デフォルトの名無しさん
2009/10/23(金) 00:25:500458デフォルトの名無しさん
2009/10/23(金) 00:26:490459デフォルトの名無しさん
2009/10/23(金) 02:43:380460デフォルトの名無しさん
2009/10/23(金) 03:14:570461デフォルトの名無しさん
2009/10/23(金) 04:27:210462デフォルトの名無しさん
2009/10/23(金) 16:02:24それらのNSStringを
if([numString1 intValue] < [numString2 intValue]){ }
else if([numString1 intValue] == [numString2 intValue]){ }
else{ }
のように数値で比較した時、なぜか絶対にイコールのところに入ってしまいます。
NSLogでそれぞれに入っている数字は違う事を確認してるのですが、
それでも==の条件式に当てはまってしまいます。
どういう原因が考えられますか?
0463デフォルトの名無しさん
2009/10/23(金) 16:17:41intValueにしたら全然違う数値になっている事がわかりました。
NSStringに031424045645って入ってるのに
intValueの値は2147483647になってます。
これは何でなんでしょうか・・・?
0464デフォルトの名無しさん
2009/10/23(金) 16:27:382147483647 → 7FFF FFFF
0465デフォルトの名無しさん
2009/10/23(金) 16:28:45doubleでも使え
0466デフォルトの名無しさん
2009/10/23(金) 16:39:38unsigned型でも全然桁がたりませんね。基本的に12桁以下の数値の文字なのですが、
これを数値的に比較するのにいい方法はないでしょうか?
0467デフォルトの名無しさん
2009/10/23(金) 16:41:290468デフォルトの名無しさん
2009/10/23(金) 16:48:28doubleValueだと==を検出できなくなる可能性がありますね。
roundとかで切り捨てれば解決なのかな・・・
ちょっとやってきます。
0469デフォルトの名無しさん
2009/10/23(金) 17:15:02でlong long型が表示出来なかったので、数値が確認できず若干不安ではありますが、
期待通りの動作をしているようなので大丈夫なようです。
ありがとうございました。
0470デフォルトの名無しさん
2009/10/23(金) 17:55:21ここ参照。
http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265
0471デフォルトの名無しさん
2009/10/23(金) 18:01:50わぁ、ありがとうございますw
大丈夫だと言い聞かせながらも、もの凄く不安でしたw
念のためちゃんとなってるか調べてきます。
0472デフォルトの名無しさん
2009/10/23(金) 18:17:40文字とそれをlonglong型に変換したものの対応表ですが・・・
031423045645 5833744870023364608
031423045646 5833744874318331905
031424045644 5838039833024397314
031424045644 5838039833024397315
031424045645 5838039837319364611
031424045646 5838039841614331908
031425045644 5842334800320397317
031425045644 5842334800320397318
031425045645 5842334804615364614
031425045646 5842334808910331911
全然大丈夫じゃなかったです。一応文字数値が大きいものほど、
longlongの値も大きくなっているので正常に動作はしているのですが、
んー何でこう思った通りに動かないんだろうか(´・ω・`)
どこも間違ってるようには見えないんですけど・・・
0473デフォルトの名無しさん
2009/10/23(金) 18:34:115833744870023364608 → 50F5 A00D 0000 0000
何が起こってるんだろ?
0474デフォルトの名無しさん
2009/10/23(金) 18:56:225833744874318331905 → 50F5 A00E 0000 0001
二つ目に関してはLSBが1になってますね。
んー・・・元のNSStringに何か問題があるんですかね・・・
0475デフォルトの名無しさん
2009/10/23(金) 19:53:27NSString *testString = [NSString stringWithString:@"012345012345"];
NSLog(@"test: %@ - %qi", testString, [testString longLongValue]);
出力が
test: 012345012345 - 12345012345
になってるので、基本的な使い方としては間違ってない感じですね。
numStringの中に入ってるデータに何か罠がありそうな感じですが、
普通にNSLog(numString)で表示させても、特に変な様子は見られないんですけどね・・・
0476デフォルトの名無しさん
2009/10/23(金) 20:01:160477デフォルトの名無しさん
2009/10/23(金) 20:02:33NSString *str = [NSString stringWithUTF8String:"031425045646"];
NSScanner *scan = [NSScanner scannerWithString:str];
NSLog(@"%@, %qu", str, [str longLongValue]);
NSLog(@"%qu", value);
//031425045646(, 31425045646
//31425045646
0478デフォルトの名無しさん
2009/10/23(金) 20:06:18uint64_t value;
[scan scanLongLong:(long long*)&value];
0479デフォルトの名無しさん
2009/10/23(金) 20:09:01longlongValue なんて method はないよ。
ほんとうにこのコードで出した対応表なの?
0480デフォルトの名無しさん
2009/10/23(金) 20:10:37>>479
その部分は手打ちなのでタイプミスしました。
ソースの方はちゃんとlongLongValueになってます
0481デフォルトの名無しさん
2009/10/23(金) 20:28:52これに関連して、比較用のNSStringを新しくつくって、そこに元のNSStringをぶちこんで
表示させてみたら同様に正常に表示されました。何なんだろう・・・
とりあえず比較用のNSStringを作る事で対処しました。
これで比較部分がようやく安心の動きになるはず・・・
とりあえずありがとうございました!
0482デフォルトの名無しさん
2009/10/25(日) 01:24:31- (id)fucknglyLongMethodNameContainingThousandsOfCharacters:bar
{
それともメソッド名の行にまとめる派?
- (id)fucknglyLongMethodNameContainingThousandsOfCharacters:bar {
あと、メソッドチェインで右の方まで来ちゃったときって、新しい行でメソッド名始めたりする?
[[omgThisIsTooLongSoThatTheNextMethedHangsAtFarRightPositionWTF foo]
thisIsTheSecondMethodSTFU:bar
multipleArgsAnotherPain:poo];
それとも同じ行に置く?
[[omgThisIsTooLongSoThatTheNextMethedHangsAtFarRightPositionWTF foo] thisIsTheSecondMethodSTFU:bar
multipleArgsAnotherPain:poo];
0483デフォルトの名無しさん
2009/10/25(日) 02:17:55[[そんなに長いメソッド名 付けたりはしないけど] 基本的には同じ行かな];
id hoge = [コード見やすい方が気分がいいので あんまりにも右に長くなっちゃう場合は];
[hoge コードを分けちゃいますね];
}
0484デフォルトの名無しさん
2009/10/25(日) 12:50:09関数宣言は改行で
void a
{
}
条件式は
if () {
}
while () {
}
改行してるみたい。
0485デフォルトの名無しさん
2009/10/25(日) 13:09:58Wikipediaは例として好ましくありません。
例として引用する場合は、Wikipediaが参照・参考にしている一次情報を引用しましょう。
括弧を次の行におくのはGNUコーディング規約で推奨されています。
同じ行に置く形もどこか有名な団体/企業での採用が元だったと思いますが忘れました(Sunだったかな)。
GNUコーディング規約
http://www.gnu.org/prep/standards/standards.html#Formatting
http://www.sra.co.jp/wingnut/standards-j_toc.html
ちなみに私は括弧は同じ行、メソッドチェインは>>483と同様に分割を検討します。
状況によっては新しい行で開始します。同じ行には置かないでしょうね。
0486デフォルトの名無しさん
2009/10/25(日) 20:14:08Linuxコーディングスタイルがルールも少なく誰でも従いやすい
でも、objc的にはAppleのコーディングスタイルをまねるのが一番いいのでは
Appleなりの理由があってあのスタイルに落ち着いたんだろうから
あと、Perlベストプラクティスのコーディングスタイルも学ぶところが多かった
0487デフォルトの名無しさん
2009/10/25(日) 20:24:090488デフォルトの名無しさん
2009/10/25(日) 20:27:540489デフォルトの名無しさん
2009/10/25(日) 20:35:52http://lxr.linux.no/linux/Documentation/CodingStyle
0490デフォルトの名無しさん
2009/10/25(日) 20:41:170491デフォルトの名無しさん
2009/10/26(月) 04:47:35Macのシステム終了、再起動、をするプログラムを作ろうと思ってます。
で、実装についてなんですが、よく分からないのでsystem関数で
再起動、システム終了のコマンドでも送ってみようかと思います。
shutdown -h now
ですね!でもこれってrootじゃないアカウントからでも効くんでしょうか?
あと、保存していないファイルとかは保存されないまま強制終了しちゃうのでしょうか?
0492491
2009/10/26(月) 04:51:260493デフォルトの名無しさん
2009/10/26(月) 06:39:57自分で試せヴォケ
0494デフォルトの名無しさん
2009/10/26(月) 06:57:41rootじゃなくてもだいじょうぶ
0495デフォルトの名無しさん
2009/10/26(月) 10:10:03ここで質問すべきことじゃないですが、shutdown -h now だと
かなり強制的に終了するのでよくないです。ファイル保存しますか?
とかのダイアログも出ません。Apple おすすめの方法は
http://developer.apple.com/mac/library/qa/qa2001/qa1134.html
です。
0496デフォルトの名無しさん
2009/10/27(火) 07:55:44foo.cppにあるint exec()って関数をbar.mのmain()から呼び出すのってなんか宣言必要なの?
ldでexec()のシンボルが見つからないと言われる・・・
0497デフォルトの名無しさん
2009/10/27(火) 09:28:44foo.cpp 側で extern "C" しとかんと Obj-C からは呼べないだろ、JK
0498デフォルトの名無しさん
2009/10/27(火) 21:55:28Thx。やってたんだが、どうやらヘッダーファイルで宣言してたのがダメだったらしく、cppファイルに直接externしたら動いた。感謝。
原因まではおってないが‥
0499デフォルトの名無しさん
2009/10/29(木) 13:23:39メインスレッドを待機させるにはどう書けば良いのでしょうか。
0500491
2009/10/29(木) 13:33:31じゃねーの。
0501デフォルトの名無しさん
2009/10/29(木) 13:34:150502499
2009/10/29(木) 13:36:38あまりメソッド増やしたくなかっただけなんですが、どうもです。
0503デフォルトの名無しさん
2009/10/29(木) 13:54:21「使わないといけない」わけじゃねーよ。
>>500は 物知らずでも使える一番簡単な方法を提示してくれただけだろ。
文句あるなら pthread の関数とか NSCondition でも使ってろ
0504デフォルトの名無しさん
2009/11/08(日) 15:04:31@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で持たせちゃえと思いました。
それほどおかしなことはしてないつもりなのですが、やっぱりポインタの理解が足りてない感じでしょうか?アドバイスお願いします。
0505デフォルトの名無しさん
2009/11/08(日) 16:40:23-[NSString UTF8String] のドキュメントを読みなさい。
ちゃんと注意が書いてあります。
0506デフォルトの名無しさん
2009/11/08(日) 22:17:39NSXMLDocument つかえば?
0507504
2009/11/09(月) 02:02:48ありがとうございます。
もとのNSStringがreleaseされた時点でfreeされちゃうんですね。
うまくできました。
ドキュメントよく読みます。
0508デフォルトの名無しさん
2009/11/09(月) 20:32:01最初はメソッド呼び出しの[]がきめぇwwwwって感じだったんだが、
デフォでリフレクションできるのは良い。
C++よりこっちが普及していれば自分のプログラマ人生も幸せだったのかもしれない、
と思う今日この頃。
0509デフォルトの名無しさん
2009/11/10(火) 13:06:250510デフォルトの名無しさん
2009/11/10(火) 13:52:190511508
2009/11/10(火) 15:25:49id型に何でもぶちこめるのもイイ。まさかCでこんな風に扱えるとはね。
メソッドのprivate/publicの定義ができなかったり不満もあるけど。
0512デフォルトの名無しさん
2009/11/10(火) 15:31:080513デフォルトの名無しさん
2009/11/10(火) 15:45:310514デフォルトの名無しさん
2009/11/10(火) 16:06:010515508
2009/11/10(火) 16:40:25基本クラスが違ってもメソッドの名前と引数の型が一緒なら呼べてしまうのも何気にすごい。
それに甘えて使いまくると死ぬけど。
0516デフォルトの名無しさん
2009/11/10(火) 16:58:330517デフォルトの名無しさん
2009/11/10(火) 19:21:36ああいうのが好きな人が楽しめる場所が別にあるから、
お互い邪魔せずに、こっちはこっちで自由にできる。
彼らはどう転んでも Smalltalk 風のオブジェクト指向を
消化できないだろうし、C++0x を見ていると、
対岸の火事で良かったなあと心から思う。
0518デフォルトの名無しさん
2009/11/10(火) 20:08:390519デフォルトの名無しさん
2009/11/10(火) 20:14:35前世紀から何度も繰り返し語られてる話だけどな。
0520デフォルトの名無しさん
2009/11/10(火) 20:17:29virtualのダメさが際立つな。あれはナンセンスと思う
Qtのシグナルスロットとかみたいに言語外の飛び道具が必要になるし
0521デフォルトの名無しさん
2009/11/10(火) 20:18:480522デフォルトの名無しさん
2009/11/10(火) 20:22:270523デフォルトの名無しさん
2009/11/10(火) 20:26:00何か他の言語を否定しがちなのはもったいない感じがする
0524デフォルトの名無しさん
2009/11/10(火) 20:26:500525デフォルトの名無しさん
2009/11/10(火) 21:18:480526508
2009/11/11(水) 16:00:50WEBプログラミングでrubyかPHPかjava、どれでやるかって話にはならないよね。
で、自分はC++に10年以上お世話になってるが、
歴3ヶ月のobjCのが言語として優れてる気がしている。
なにげに[nil method1]でぬるぽにならないのもいいな。
0527デフォルトの名無しさん
2009/11/11(水) 16:08:310528デフォルトの名無しさん
2009/11/11(水) 17:47:21ObjCスレなんだから、もっと激しく愛を語ってもいいじゃないか。
0529デフォルトの名無しさん
2009/11/11(水) 18:58:09.mm で boost:python と混ぜて使うのが最強ですよとかモダンな話をしようよ
0530デフォルトの名無しさん
2009/11/11(水) 19:30:200531デフォルトの名無しさん
2009/11/11(水) 22:00:460532デフォルトの名無しさん
2009/11/11(水) 22:01:490533デフォルトの名無しさん
2009/11/11(水) 22:50:59なりません
0534デフォルトの名無しさん
2009/11/11(水) 23:17:52reflection つきの オブジェクト指向言語なら出来て当たり前だろう
>>531
[hoge performSelectorInBackground:@selector(method1) withObject:nil]
でオッケー
0535デフォルトの名無しさん
2009/11/12(木) 00:38:16Smalltalk keys.
Lisp だと apropos とか。
0536デフォルトの名無しさん
2009/11/12(木) 05:05:03goなら可能
0537デフォルトの名無しさん
2009/11/12(木) 08:51:400538デフォルトの名無しさん
2009/11/12(木) 10:12:27OSXのランタイムはそういう実装にはなってないけど
0539デフォルトの名無しさん
2009/11/12(木) 12:00:19APIが全て thread-safe な理想郷ならそれでもいいけど、
とつぜんあるメソッドが別スレッドで走られると困る事もあるよ
10.5 では NSOperation の concurrent オペレーションは
メインスレッドで動いてたのに、10.6 からそれも別スレッドで
走るようになったので嵌まったのでそういうのはこわいです。
0540デフォルトの名無しさん
2009/11/13(金) 00:28:16スレッドセーフだから多少のオーバヘッドには目をつむって自クラス内でも
インスタンス変数は常にプロパティ経由で触るみたいなスタイルが今後は
主流になるのかもね
0541デフォルトの名無しさん
2009/11/13(金) 14:03:00あんまり意味ないから、主流にはならないと思う。
0542デフォルトの名無しさん
2009/11/19(木) 17:25:51本体の傾きを求めるとかそういう話だが。
0543デフォルトの名無しさん
2009/11/19(木) 17:49:22[SDK]iPhoneアプリ開発初心者質問箱3[touch]
http://pc11.2ch.net/test/read.cgi/mac/1254325417/
0544542
2009/11/19(木) 18:49:070545デフォルトの名無しさん
2009/11/21(土) 20:36:110546デフォルトの名無しさん
2009/11/21(土) 20:37:490547デフォルトの名無しさん
2009/11/22(日) 21:09:360548547
2009/11/22(日) 22:30:21ASCIIコードの48をcharもしくはNSStringの0に変換するには
どう書けば良いのでしょうか。
0549デフォルトの名無しさん
2009/11/22(日) 22:34:080550デフォルトの名無しさん
2009/11/23(月) 02:56:15まあまあ。将来有望な小学生が来たのかもしれんじゃないか。
>>548
で、その48は何で表されてんのかな?
0551デフォルトの名無しさん
2009/11/23(月) 04:40:12c[0] = 48;
sprintf(c, "%c", 48);
NSString *nss = [[NSString alloc] initWithFormat:@"%c", 48];
0552デフォルトの名無しさん
2009/11/23(月) 06:05:21オイコラ、char c[128]ってどういうつもりだ。これだから最近の若いもんは・・・。
0553デフォルトの名無しさん
2009/11/23(月) 06:29:27えっ、何かマズいっすかね・・・
自分まだ初めて2ヶ月くらいなんです・・・
0554デフォルトの名無しさん
2009/11/23(月) 07:34:230555デフォルトの名無しさん
2009/11/23(月) 08:34:48>>551の2行目のようにchar型のデータが欲しいだけなら何もすることは無いので char c; c = 48; で十分だ。
もし3行目のように文字列として扱いたい場合でも今の場合なら一文字目 '0' == 48 と二文字目の '\0'
の分だけなので char c[2]; でよい。
それにchar c[2] = {0} のように書いた場合、2要素目以降は言語仕様上不定(実装上はほぼ確実に0にセットされるが)。
0556デフォルトの名無しさん
2009/11/23(月) 08:36:27char c[4096];
とか平気でやってるぞ
0557デフォルトの名無しさん
2009/11/23(月) 09:17:420558デフォルトの名無しさん
2009/11/23(月) 10:41:38なーるほど。そういうことなら問題なっすぃん。
なんか48 61 65 71みたいな数値を文字列に直すのかなーとか思って多めにとっただけっすぃん。
0559デフォルトの名無しさん
2009/11/23(月) 11:04:11悪意がないことを先にいっておく
>char c[2] = {0} のように書いた場合、2要素目以降は言語仕様上不定
なる理由はどこから
気になったので、規格書があればそのセクションをお願いします
0560デフォルトの名無しさん
2009/11/23(月) 11:54:05俺も気になったんで見たんだけど、
C99?だと、静的変数と同様の暗黙の初期化になるみたい。
それ以前のは規格書が見れない。
http://www.jisc.go.jp/
JISX3010のPDF96ページ辺り。
0561デフォルトの名無しさん
2009/11/23(月) 12:36:40確認しました
確かに静的記憶域と同じと書いてありますね
0562デフォルトの名無しさん
2009/11/23(月) 15:43:493.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.
0563デフォルトの名無しさん
2009/11/24(火) 14:02:14>>555 は間違いで
char c[2] = {0}の様に書いた場合 2 要素目以降は c 言語の
仕様として 0 にセットされる、とストレートに指摘しろyo
0564555
2009/11/25(水) 03:10:05ヽ(`Д´)ノ ウワァァァン
そんなこと言ったら厳密なObjective-Cの規格書なんて無いんだよう(グチグチ
0565デフォルトの名無しさん
2009/11/25(水) 03:10:530566デフォルトの名無しさん
2009/11/26(木) 00:04:19明示的に初期化しておきたい。
0567デフォルトの名無しさん
2009/11/26(木) 00:30:360568デフォルトの名無しさん
2009/11/26(木) 15:41:30関数呼び出しなんて高度なものは余計使えないんじゃないか?
0569デフォルトの名無しさん
2009/11/26(木) 18:26:21そういう経験から、冗長かどうかはともかく
おまじないとして書いている処理というのはある
0570デフォルトの名無しさん
2009/11/26(木) 18:28:35みんな知ってりゃいいが >>567 みたいな理不尽なツッコミもありそうだし、
この流れみたいに話がこじれたらかなわん
0571デフォルトの名無しさん
2009/11/26(木) 20:48:17ってやる夫顔で言ってやればいいんだよ
0572デフォルトの名無しさん
2009/11/27(金) 10:52:05クラスオブジェクトの生成は結構見つかるんですけど、
Class cls = NSClassFromString(@"anyClassName");
クラスのインスタンス自体を生成するやり方を教えてください。
出来ない言語もあるけど、objective-cはいかにも出来そうですよね?
お願いします
0573デフォルトの名無しさん
2009/11/27(金) 10:54:210574572
2009/11/27(金) 11:05:28あれ?もしかして
id obj = [[cls alloc] init];
でいいんですか?
NSLogでのぞくと出来てるっぽいです。
class_createInstanceというのも見つけたけど上ので良いのかな。
0575デフォルトの名無しさん
2009/11/27(金) 13:05:200576デフォルトの名無しさん
2009/11/27(金) 13:57:42Class class = NSClassFromString(@"AnClass");
SEL sel = NSSelectorFromString(@"aSelector");
id obj = [[[class alloc] init] autorelease];
[obj performSelector:sel];
プラグイン書くときはNSClassFromStringは便利だよね。
わざわざバンドルローダー指定する必要ないし。
NSSelectorFromStringの方はごくまれにしか使わないね。
AppleEventDispatchの実装部では使いまくってそうだけど。
0577デフォルトの名無しさん
2009/11/27(金) 16:21:300578デフォルトの名無しさん
2009/11/27(金) 17:30:29俺も俺も
てか乳って使ったことない。
0579デフォルトの名無しさん
2009/11/28(土) 00:03:580580デフォルトの名無しさん
2009/12/01(火) 18:38:18といった宣言をヘッダに記述し、これを他のクラスからimportして
defA a;
のように利用しようとすると、
"expected specifier-qualifier-list before 'c'"とエラーが
起きてしまいます。
どのように定義すれば良いのでしょうか。
0581デフォルトの名無しさん
2009/12/01(火) 18:43:26a,
b,
};
typedef NSInteger defA;
0582デフォルトの名無しさん
2009/12/01(火) 19:24:09ソース
0583580
2009/12/01(火) 20:55:30他のヘッダが邪魔をしていて、importの前に書いたらうごきました。。
0584デフォルトの名無しさん
2009/12/01(火) 23:11:37こりゃ、そんじょそこらのなんちゃってプログラマに扱えるしろものじゃねーな。
0585デフォルトの名無しさん
2009/12/02(水) 00:29:560586デフォルトの名無しさん
2009/12/02(水) 00:50:29別に日本語ローマ字書きでもいいじゃん
0587デフォルトの名無しさん
2009/12/02(水) 04:06:030588デフォルトの名無しさん
2009/12/02(水) 05:26:270589デフォルトの名無しさん
2009/12/02(水) 19:58:300590デフォルトの名無しさん
2009/12/02(水) 20:46:140591デフォルトの名無しさん
2009/12/02(水) 21:10:190592デフォルトの名無しさん
2009/12/03(木) 19:40:15そこから<li>〜</li>の部分だけ抜き出したいと考えています。
ただ、それをどうやって実装すればいいのかが良く分からないです・・・。
今頭の中にある感じだと、<li>とマッチする最初の場所と
</li>とマッチする最後の場所を探して、その部分を抜き出すという方法なんですけど、
もっと簡単に正規表現みたいな感じでピュッと抜き出したりできないでしょうか?
0593デフォルトの名無しさん
2009/12/03(木) 20:19:180594デフォルトの名無しさん
2009/12/03(木) 21:59:370595デフォルトの名無しさん
2009/12/03(木) 22:07:13とりあえず簡単にやるならスキャナ使えば?
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);
}
0596デフォルトの名無しさん
2009/12/04(金) 00:52:37NSXML 使って XPath でピョッと
0597デフォルトの名無しさん
2009/12/05(土) 22:45:14本のサンプルとかみても、retainしてるのに、どこにもreleaseがなかったり、allocして
autoreleaseも呼んでるのに、deallocでreleaseもしてたりとか、もうわけわかめ。
なんじゃこりゃ、そんなに神経質にならなくてもいいのか?
0598デフォルトの名無しさん
2009/12/05(土) 23:07:44自分は Instruments の Leaks 使って、可視化されたメモリリークを見ながら試行錯誤して覚えたけど。
0599デフォルトの名無しさん
2009/12/05(土) 23:09:060600デフォルトの名無しさん
2009/12/06(日) 03:36:39http://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もしてたりとか、もうわけわかめ。
これは本が間違ってるんじゃないの?何の本かわからんから何とも言えんが。
0601デフォルトの名無しさん
2009/12/06(日) 06:55:11そんな本あるなら晒してみろよ
0602デフォルトの名無しさん
2009/12/06(日) 13:36:42あったりするからちょっとややこしい。
0603デフォルトの名無しさん
2009/12/06(日) 13:45:34(init 内の)どこにもreleaseがなかったり、
(そのクラスを)allocして autoreleaseも呼んでるのに、
(そのクラスの)deallocで(インスタンス変数を)releaseもしてたり
と解釈するとしたら、まったく正しいコードけど
0604デフォルトの名無しさん
2009/12/06(日) 13:53:05サンプルはあくまでサンプル。アプリまるごと完全詳解みたいのならともかく。
Obj-Cに限らず、その他言語のO'Reilly本やMSDNでも、
サンプルソースと現実的に推奨されるソースは異なる場合は多い。
参照カウンタの説明でretainしたものをreleaseしてないなら問題だと思うけど、
多分、別の説明で使用されているサンプルがそうなってるんでしょ。
>>602
>勝手にAutoreleaseするクラスメソッド
コンビニエンスコンストラクタのこと?
0605デフォルトの名無しさん
2009/12/06(日) 14:10:04俺もこの辺、よく迷うわ。propertyの宣下にもretainやassignの指定があるから、
宣言をよく確かめて使わないとかいけないとか気を使うのがちょっと大変。
便乗質問なんだけど、あるクラス(A)で動的にView(B)を作って(alloc & init)、
別のView(C)にaddSubView した場合って、Aで明示的にBをreleaseする必要
があるんだっけ? それとも、Cの解放時にBも勝手にreleaseしてくれる?
0606デフォルトの名無しさん
2009/12/06(日) 15:11:080607デフォルトの名無しさん
2009/12/06(日) 15:34:14何が当然あるか? Aで明示的にBをreleaseする必要があるという意味あるか?
0608デフォルトの名無しさん
2009/12/06(日) 15:47:510609デフォルトの名無しさん
2009/12/06(日) 16:09:08[foo addHoge : hoge]; // 2
…
[foo release]; // 1
よってメモリリークになる。
だから、autorelease か add 後に [hoge release]; の必要がある、筈。
0610デフォルトの名無しさん
2009/12/06(日) 16:37:490611デフォルトの名無しさん
2009/12/06(日) 21:00:38エ?こうしとけばリークにならねえだろ?
-(void)dealloc {
...
[mHoge release]; // 0
mHoge = nil;
...
[super dealloc];
}
0612デフォルトの名無しさん
2009/12/06(日) 21:02:190613デフォルトの名無しさん
2009/12/06(日) 21:17:350614デフォルトの名無しさん
2009/12/06(日) 22:15:11だから、>>609はそうしろって書いてるじゃん
0615デフォルトの名無しさん
2009/12/06(日) 22:25:14addHoge: (addSubView:)には retain されてるから当然。
でもそれだと±1で、Hoge alloc init 時のカウント1をリリースされてないから、リークになる。
0616デフォルトの名無しさん
2009/12/06(日) 22:44:590617デフォルトの名無しさん
2009/12/07(月) 00:14:080618デフォルトの名無しさん
2009/12/07(月) 00:45:02initほげほげ、copyほげほげ は retain されて、
それ以外のメソッドは autorelease されたのが返ってくる。
[obj method:a]
としたばあいに、obj が a がずっと必要なら method 内部で retain するし、
いらなかったらそんなことはしない
だから、自分があるオブジェクト a を release すべきかどうかは、
自分が呼んだメソッド内でどうなっているかとかは気にしなくてよくて、
単に自分がいらなくなった時点で release すればよい。
まあリリース足りなければメモリ食うだけだけど、
リリースしすぎは一瞬でクラッシュするので、
きちんと理解して書くか、NSZombie でチェックするか、
release しすぎないようにしてください。
0619デフォルトの名無しさん
2009/12/07(月) 01:19:210620デフォルトの名無しさん
2009/12/07(月) 13:31:55newほげほげも忘れないであげてください
0621デフォルトの名無しさん
2009/12/07(月) 17:53:50Objective-Cのオブジェクトの所有権ポリシーって、
(C++におけるメモリ管理と)やることは本質的に同じでありつつ
保守効率が格段に上がる優れた機構ではあるとは思うけど、
Objective-Cってどんなもんだろってちょっとイジってオナりたいとき、
一通り理解するまでとっかかりで苦労するねぇ。
C++慣れしてると、余計なお世話に感じてしまうっていうか。
なんだか好きになれない。
0622デフォルトの名無しさん
2009/12/07(月) 17:59:430623デフォルトの名無しさん
2009/12/07(月) 20:34:510624デフォルトの名無しさん
2009/12/07(月) 22:15:561. alloc,copy,retain,newしたインスタンスはreleaseする必要あり
2. 1した覚えの無いインスタンスは勝手にrelesaeしてはいけない
3. 1してないインスタンスはどこかでreleaseされるので、保持したい場合はretainかcopy
0625デフォルトの名無しさん
2009/12/07(月) 22:28:220626デフォルトの名無しさん
2009/12/08(火) 00:43:52オブジェクトプール+手動の参照カウントってのは、大昔の手法だよ。
人頼みだとバグが多くなるし、保守効率も下がる。だからメモリ管理コードを
一々書かなくて済むGCやスマートポインタが主流になってる。
模したSmalltalkみたいに最初からGC付きなら無かった機構だから>>622が正解
0627デフォルトの名無しさん
2009/12/08(火) 09:22:55ここにいる皆さんは、GC派とリファレンスカウンタ派、どちらが多いのでしょうか?
0628621
2009/12/08(火) 11:17:45iPhoneはGC無いです。
(ただ、あったとしてもiPhoneはメモリ極小なので、autoreleaseさえ極力避けるべきと公式で指摘されています。)
>>624の規則だけですが、解れば便利な@propertyと@synthesizeも、
とりあえずちょっとイジってみようレベルの初見だと、
iPhone画面にHelloWorld表示するだけのソースすら、
「@property(nonatomic,retain)何この呪文、この入門書じゃソース解説にも記述無いし、
とりあえず詳細確認は後だな...あれ??実装でretainなんてしてなくね??なんで??
(ポチッ)ちょww動いたwwwけどHelloWorldのソースすらイミフwwww」
みたいな。
結局、入門書はHelloWorldで挫折、とりあえずちょっとイジるだけのつもりが、
公式ドキュメントを片っ端から読み漁って十分理解してから、
入門書のHelloWorldのソースを見直したのはいい思い出。。。
チラ裏に長文、本当にスマンかった。
最後に、InterfaceBuilderについて。
見た目だけでVB.NETくらい優しいお母さん的IDEだろうと思って触ると、火傷するね。
0629デフォルトの名無しさん
2009/12/08(火) 12:10:550630デフォルトの名無しさん
2009/12/08(火) 13:16:01なんの入門書を読んだか知らんが、それはその入門書があきらかに悪いな
iPhone でプログラムやるには、
(古めかしいとか批判はいろいろあるかもしれないが、実際問題として)
retain/release ができなきゃ話にならない。
わかったつもりで通過すると絶対に意味不明なクラッシュをはじめて
あとで泣く羽目になるのに、説明しないなんてありえない。
とにかく変な入門書を掴んで失敗でしたね。
あなたが公式ドキュメント読める人で良かったですが。
あと、Interface Builder はふつうの(?)と違って、
コントロールダブルクリックしてもメソッド追加できないので、
その辺戸惑うかも知れませんが、ビューとコントローラの独立性が
自然に高まるようになってるのはいいところだと思います。
.Net やさんで iPhone プログラムはじめたひとはみんな
そう感じるみたいね。
http://dotnetaddict.dotnetdevelopersjournal.com/dcacs.htm
とか。
0631デフォルトの名無しさん
2009/12/08(火) 18:47:31> オープンソースの現状について、おそらくは予想外の知られざる事実を明らかにした。
> 『Smalltalk』対『Objective-C』では? Smalltalk がほぼ3倍のコード量で勝利している。
http://japan.internet.com/webtech/20090724/12.html
オープンソースの括りだから負けただけだよな?
0632デフォルトの名無しさん
2009/12/09(水) 12:41:07いらないよ。コードなんて1行も書かなくてもHello Worldって表示するぐらいはできる。
完全に入門書が悪いわ。アップルの配布してるPDFのほうが数倍マシ。
0633デフォルトの名無しさん
2009/12/09(水) 22:34:49index.htmlを抜き取るようなメソッドってないですかね?
スキームやホスト、アンカーなどを返すメソッドは見つかったのですが、
ファイル名を返すのが見つからないです・・・
0634デフォルトの名無しさん
2009/12/09(水) 23:02:12- (NSString *)lastPathComponent;
でも使え。NSPathUtilities.h に定義されてる。
0635デフォルトの名無しさん
2009/12/09(水) 23:13:06ありがとうございます。
こんな便利なのがあったんですね。
というか、NSURLにもこのメソッドつけてほしいですねw
0636デフォルトの名無しさん
2009/12/09(水) 23:14:080637デフォルトの名無しさん
2009/12/09(水) 23:25:55- (NSString *)lastPathComponent AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER;
0638デフォルトの名無しさん
2009/12/14(月) 01:49:22例えば
てすと → %A4%C6%A4%B9%A4%C8
のようにしたいのですが
NSString *test = @"てすと";
[test stringByAddingPercentEscapesUsingEncoding:NSShiftJISStringEncoding];
NSLog(test);
のようにしても、
8C48B78C6
のように表示されてしまいます。これを%A4%C6%A4%B9%A4%C8のように表示するにはどうすればいいのでしょうか?
0639デフォルトの名無しさん
2009/12/14(月) 01:58:220640デフォルトの名無しさん
2009/12/14(月) 02:00:28それによって出来た文字列がどうなるかの動作は未定義です!
(うまくうごくときもあるかもしれませんが、コンパイラのデフォルト設定が
次のバージョンでかわると一瞬でおかしくなる可能性があります。)
必ず Localizable.strings を使うようにしてください。
2. NSLog(test) というふうに書かない!NSLog の第一引数は
フォーマット文字列です。% があるとフォーマット指示だと解釈されます。
NSString* test = @"%@";
NSLog(test);
とすると、NSLog は %@ をフォーマットと解釈するために
スタック上に偶然あるポインタの先のオブジェクトっぽいものにアクセスして
異常終了しますよ!
必ず NSLog(@"%@", test)
としてください。
0641デフォルトの名無しさん
2009/12/14(月) 02:02:39NSString *test = @"てすと";
NSLog(@"%@", [test stringByAddingPercentEscapesUsingEncoding:NSShiftJISStringEncoding]);
2009-12-14 02:01:53.361 test[1467:a0f] %82%C4%82%B7%82%C6
0642デフォルトの名無しさん
2009/12/14(月) 02:03:33ちゃんと表記したらちゃんと表示されました。
今まで面倒くさがってNSLog(NSString変数)みたいに書いてましたが
今度からちゃんと書こうと思います。ありがとうございました。
0643デフォルトの名無しさん
2009/12/14(月) 02:09:44いつもの人乙
0644デフォルトの名無しさん
2009/12/14(月) 02:20:581. だけど、
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
僕は @"にほんご"は怖くて使う気になりませんが。
0645デフォルトの名無しさん
2009/12/14(月) 02:24:31というか URL のエンコーディングって ShiftJIS でいいんだっけ?
最近って真っ当なサイトなら UTF-8 じゃない? Wikipedia とか。
0646デフォルトの名無しさん
2009/12/14(月) 02:26:250647デフォルトの名無しさん
2009/12/14(月) 10:11:57ソースコードはデフォルトのままUTF-8。
0648デフォルトの名無しさん
2009/12/15(火) 01:41:01valueForKey: から呼ばれないんですが、なぜでしょう?そういうもの?
サンプルコードは以下のとおりです (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);
}
0649デフォルトの名無しさん
2009/12/15(火) 01:41:49{
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;
}
0650デフォルトの名無しさん
2009/12/15(火) 02:51:37@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:)));
とかやるとちゃんと機能したけど、それは君の望むことじゃないか。
0651デフォルトの名無しさん
2009/12/15(火) 10:25:12typese は(リファレンスで確認してね)、"返り値", "self", "_cmd", "引数..." なので、
class_addMethod(self, NSSelectorFromString(getterName), getter, "@@:"); // ×"@:"
class_addMethod(self, NSSelectorFromString(setterName), setter, "v@:@"); // ×"@:@"
とやると動く。
0652デフォルトの名無しさん
2009/12/15(火) 10:38:59できてないタイミングなので、コンビニエンスコンストラクタを使うとリークする。
setterName = [NSString stringWithFormat:..]; の所。alloc + init + release を
使おう。それか、+load でやる代わりに +initialize で呼ぶとpoolが出来た後なので
コンビニエンスコンストラクタが使える。(分かった上でのサンプルならごめんよ)
0653デフォルトの名無しさん
2009/12/15(火) 11:41:32おかげでうまく行きました。
型のエンコーディングをわかってませんでした。
Pool の件もどうもです。まあ数個ぐらい
リークしてもよかんべ
という気持ちでしたが、いけませんね。
type encoding は method_getTypeEncoding
をつかった方がいいとも
職場で教えてもらいました...
マルチポストみたいになってすみません。
0654572
2009/12/19(土) 15:58:57中にNSMutableDictionaryのインスタンスを持っている独自クラスがあって
その中にどんなキーがあるかは不定です。
でそのインスタンスに対して
hoge.foo
のようにドットでプロパティを呼び出してNSMutableDictionaryのobjectForKeyにアクセスするようなことって出来ますか?
不定じゃなければそういうプロパティを作ってアクセッサを定義してやればイケそうな気もするけど・・
プロパティはコンパイル時の型チェックがあるのでダメそうな気がするんですが、見逃してることがあったら教えてください。
0655デフォルトの名無しさん
2009/12/19(土) 16:53:38a.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
とか参照。
0656デフォルトの名無しさん
2009/12/20(日) 01:04:58これからxxx、またはyyyを返すようなメソッドってないでしょうか?
xxxの中には:は含まれず、yyyの中には:が含まれている可能性があります。
要するの最初のコロンと、それ以降に文字を分けたいのです。
0657デフォルトの名無しさん
2009/12/20(日) 01:18:010658デフォルトの名無しさん
2009/12/20(日) 01:19:110659デフォルトの名無しさん
2009/12/20(日) 06:50:02で?
0660デフォルトの名無しさん
2009/12/20(日) 07:18:18俺も普通にNSScannerでがりがりマッチング取ればいいだけ
だと思うんだが。
0661デフォルトの名無しさん
2009/12/20(日) 11:48:34いえ、同一人物じゃないですw
回答くれた人にそんな失礼な返事しないですよw
NSScanner使ったことないので、調べてきます。
Objective-Cというかオブジェクティブ志向のプログラミングは初めて間もないんですが、
結構クラス調べるのは楽しいですね。もっといっぱい知りたい・・・
0662デフォルトの名無しさん
2009/12/20(日) 12:01:08俺はノンケでも構わず食っちまう男なんだぜ
0663デフォルトの名無しさん
2009/12/20(日) 12:17:390664デフォルトの名無しさん
2009/12/20(日) 17:13:00NSScanner でももちろん出来るけど、その目的ならNSString の
-(NSArray*)componentsSeparatedByString:(NSString*)separator
でやる方が楽かと。後ろは、NSArray の
-(NSArray*)subArrayWithRange:(NSRange)range で取り出して、
-(NSString*)componentsJoinedByString:(NSString*)separator で戻してやればいい。
0665デフォルトの名無しさん
2009/12/20(日) 22:04:58メッセージ式で呼び出すときはウォーニングだけで済むと思うけど、プロパティ構文は静的に解決できないとエラーになると思う。だから、プロパティでやるのは無理なんじゃないかな。メッセージ式で書けばいい話だが。
0666654
2009/12/20(日) 22:36:59ありがとうございます
遅レスすいません
別のところ(C言語で文字列の置換)でつまっていて、詳しくテストしてない状況です。ウォーニングはでるけどできるってことですね。試してみます。
リンク先も見てみます。ありがとうございます
0667デフォルトの名無しさん
2009/12/21(月) 22:46:44なんか普通のアプリで積極的に使う場面って想像つかないんですけど。
フレームワークの開発とかで使うのかな。
0668デフォルトの名無しさん
2009/12/21(月) 23:13:040669デフォルトの名無しさん
2009/12/21(月) 23:14:48Cocoa のいろんな部分 (KVO,バインディング) でランタイムが統一的に
オブジェクトを弄れるための下支えになってます
例えば、ソースコードで -foo と -setFoo: を定義しておくと
nib ファイルの中からビューをコントローラのキー foo に
バインドできますが、その間の通信は KVC でやってるわけです。
0670デフォルトの名無しさん
2009/12/21(月) 23:24:18値が変更された通知が欲しいときに色々と使えるだろ。
たとえば、テキストフィールドが編集されたときに何かをしてみたり。
それから、特定のスクリプトを処理するときに、コードがかなり短くなる。
たとえば、自力でXMLをパースする、みたいなときは、大幅にソースが簡単になる。
まぁ、まずは日本語ドキュメントでも読め。
http://developer.apple.com/jp/documentation/Cocoa/Conceptual/KeyValueCoding/
0671デフォルトの名無しさん
2009/12/21(月) 23:31:300672デフォルトの名無しさん
2009/12/21(月) 23:32:42一々 IBOutlet と Action をおいてセッターとゲッターを作るより、Interface Builder でどうこう出来る分生産性が上がる。
0673デフォルトの名無しさん
2009/12/22(火) 22:36:38Objective-CからCのqsortを呼ぶ事ってできるのでしょうか?
第4引数をどうすればよいのか、途方にくれてます。
よろしくお願いします。
0674デフォルトの名無しさん
2009/12/22(火) 22:57:53その場合は関数でラッパーすれば良いだけだけど。
0675デフォルトの名無しさん
2009/12/22(火) 23:18:330676デフォルトの名無しさん
2009/12/22(火) 23:52:54C の配列をソートするのなら、C そのままでしょ。
Objective-C のオブジェクトは、C配列にいれないほうがいいです。
NSString* a[10]; とか余程でなければ誰も使わないと思います... よね。
NSArray つかって、ソートするときは、
sortedArray... とかいうメソッドが一杯あるので。
0677デフォルトの名無しさん
2009/12/22(火) 23:58:01ありがとうございます。そのまんまなんですね。
関数へのポインタを@selectorでとかやってたら、混乱してしまいました。
>>676
そうですか。Objective-Cが独特なんで、なるべく標準を使いたいと思ったりするんですけど、
やっぱり駄目ですかねー。
0678デフォルトの名無しさん
2009/12/23(水) 00:03:510679デフォルトの名無しさん
2009/12/23(水) 00:06:470680デフォルトの名無しさん
2009/12/23(水) 00:08:51Objective-C は C のスーパーセットだから。
C++ だって C でできる事はそのまま何でも出来るでしょ。
>そうですか。Objective-Cが独特なんで、なるべく標準を使いたいと思ったりするんですけど、やっぱり駄目ですかねー。
う〜ん、他の環境から Mac へ GUI だけ移植してるんなら、そういうのも判らなくないですが、
Mac / iPhone 用に一から書いてるなら諦めて Cocoa の使い方覚えたほうがいいと思います。
どうせ method の引数に文字列なら NSString, 配列なら NSArray を渡さないといけない事が
しばしばあるので、どうせ使い方覚えないといけなくなりますし。
0681654
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をつかうので必要ないといわれればそれまでなのですが。
お願いいたします
0682デフォルトの名無しさん
2009/12/24(木) 04:05:53自分でスレ違いって分かってるんだからC言語のスレ行けよw
そっちじゃいけない理由でもあるのか?
0683デフォルトの名無しさん
2009/12/24(木) 07:43:020684デフォルトの名無しさん
2009/12/24(木) 12:58:460685デフォルトの名無しさん
2009/12/29(火) 20:32:37文字列比較すんのに
if ([a compare:b] != NSOrderedAscending) {
:
}
とか、めんどくせーし、英語に慣れてないとぱっとみどう比較してんのかわからんちゅーの。
VBだったら
if a >= b then
:
end if
ちょーシンプル。ほんと萎えるよ。英語が分る人には読み易いのかもしんないけどさ。はぁ...挫折しそ
0686デフォルトの名無しさん
2009/12/29(火) 20:45:32そのVBの記述だとエンコーディング考慮出来ないじゃんw
C Stringで出来る所はそうすればいいし。そうでないところは
Foundationでやればいい。どちらも取れるんだから。
0687デフォルトの名無しさん
2009/12/30(水) 02:16:37英語の勉強になると思って頑張ってください。
物事こころの持ちようですよ。
挫折したければ挫折しても良いんだし。
0688デフォルトの名無しさん
2010/01/11(月) 16:13:44で、そのオブジェクトBを配列で返すようなメソッドを書く場合
return [[NSArray alloc] initWithObjects:objectB, nil];
としてしまうと、だれが、このNSArrayをreleaseするのかってなっちゃいますよね?
つまり、この場合NSArrayもオブジェクトAのメンバ変数に保持しないといけないってことでしょうか?
0689デフォルトの名無しさん
2010/01/11(月) 18:31:220690デフォルトの名無しさん
2010/01/14(木) 19:55:11とするか、
return [NSArray arrayWithObjects:objectB, nil];
とすべき。
0691デフォルトの名無しさん
2010/01/15(金) 08:48:560692デフォルトの名無しさん
2010/01/16(土) 21:17:35ガベコレって retainCount が 0 になったインスタンスを自動的に解放してくれるだけで、
retain, release によるメモリ管理は必要なんですよね?
NSAutoReleasePool でメモリ管理をしないでよくなった、という理解で良いでしょうか。
0693デフォルトの名無しさん
2010/01/16(土) 21:35:39ルートとなるNSAppから芋づる式に参照されてる(到達可能な)オブジェクトを保持し、
関連が無くなったオブジェクトを自動的に始末するシステムです。
http://journal.mycom.co.jp/special/2007/objectivec/002.html
参照カウントは使ってない。
0694デフォルトの名無しさん
2010/01/16(土) 21:39:390695デフォルトの名無しさん
2010/01/16(土) 22:34:26名前空間くらいか。
0696デフォルトの名無しさん
2010/01/17(日) 00:17:01ちゅうかC++ 0x のコンパイラなんぞ実装するベンダーあるのかね。
IDE込みで考えると、かなり大変そうだけ。
0697デフォルトの名無しさん
2010/01/17(日) 00:21:470698デフォルトの名無しさん
2010/01/17(日) 00:27:04>無名関数、ラムダ式、
無名関数とラムダって違うの?
Blocks のクロージャじゃダメなの?
0699デフォルトの名無しさん
2010/01/17(日) 00:48:200700デフォルトの名無しさん
2010/01/17(日) 00:52:45>ジェネリック
動的束縛な言語にジェネリックって必要か?
0701デフォルトの名無しさん
2010/01/17(日) 00:55:070702デフォルトの名無しさん
2010/01/17(日) 00:55:520703デフォルトの名無しさん
2010/01/17(日) 00:59:030704デフォルトの名無しさん
2010/01/17(日) 06:02:50Objective-C の拡張というよりは C そのものの拡張という
位置づけにしたいらしいよ、Apple は。
まあ多分ほかにどこも採用しないから、
実質 Objective-C の機能という認識になるとおもわれるが...
0705デフォルトの名無しさん
2010/01/17(日) 12:29:38フル実装はしばらくかかるかもしれないけど gcc も VC も既に機能の取り込みを始めてるし、
C99 と比べれば段違いだと思われ。
0706デフォルトの名無しさん
2010/01/17(日) 12:30:280707デフォルトの名無しさん
2010/01/17(日) 13:17:37違う。
0708デフォルトの名無しさん
2010/01/17(日) 13:19:15あれは マイコミジャーナルに長期連載されてたのを
まとめただけだから仕方がないね
せめて 2.0 ランタイムについて一章だけでも付け加えてくれたらよかったんだが、
あれを買って 10.6 で実際にやってみようとしてはまってるひとが
ときどきこのスレやら新 mac 板の Cocoa スレにでますね
0709デフォルトの名無しさん
2010/01/18(月) 15:54:05結局わからないから、とりあえずassignにしとけってことが多いです。
独立性の高いクラスの場合はretainで保持した方がいいのかなと思ったりするんですが...
何か指針みたいなものってあるんでしょうか? それとも経験的な勘でみなさん決めてらっしゃるんでしょうか?
0710デフォルトの名無しさん
2010/01/18(月) 16:28:230711デフォルトの名無しさん
2010/01/18(月) 18:22:22autoreleaseされたプロパティを渡される可能性もあるし。
となるとassignの使いどころって、数値型や文字列とかのプリミティブ型に対してってことになっちゃいますかねぇ...
copyは...ゔーん、まいっか。
0712デフォルトの名無しさん
2010/01/18(月) 18:31:54delegate や target など、 retain にすると循環参照でリークする人が
出そうなものは少し考えたうえで assign にしたりする。
知らぬ間に内容を変更されたくないオブジェクトで、 retain で受けると
mutable string を渡したあとで中身を変更する人がいるかもしれないな、
などと心配する暇があるときは copy。
面倒なときはどっちも retain にしといて使う側が気を付けることにする。
0713デフォルトの名無しさん
2010/01/18(月) 19:08:42まだ覚束ないですが、少し自分なりに整理できそうです。ありがとうございしました。
0714デフォルトの名無しさん
2010/01/23(土) 21:09:440715デフォルトの名無しさん
2010/01/24(日) 00:09:400716デフォルトの名無しさん
2010/01/24(日) 17:01:560717デフォルトの名無しさん
2010/01/27(水) 08:38:46Google の Style Guide だと NSString なプロパティはとりあえず copy にしとけってことになってる
http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml?showone=Properties#Properties
0718デフォルトの名無しさん
2010/01/27(水) 13:16:240719デフォルトの名無しさん
2010/01/27(水) 18:17:390720デフォルトの名無しさん
2010/01/28(木) 20:30:170721デフォルトの名無しさん
2010/01/30(土) 18:30:28みたいなメソッドを、performSelector:withObject: のように(SEL)と引数を与えて動かす方法ってないのかな?
int を NSNumber にするしかない?
0722デフォルトの名無しさん
2010/01/30(土) 19:31:34面倒くさいが、NSInvocation を作って動かすとか。
id invocation = [NSInvocation invocationWithMethodSignature:
[piyo methodSignatureForSelector:@selector(hoge:)]];
int arg = 1;
[invocation setArgument:&arg atIndex:2];
[invocation invoke];
int rtn;
[invocation getReturnValue:&rtn];
0723デフォルトの名無しさん
2010/01/30(土) 19:34:24[invocation invokeWithTarget:piyo];
0724デフォルトの名無しさん
2010/01/31(日) 17:59:29NSInvocation って以前見かけて、結局使い道が分からなくて放置してたクラスだけど、色々調べてみます。
ありがとう。
0725デフォルトの名無しさん
2010/01/31(日) 23:32:14Macユーザのシェアがごっそりなくなるから無理だろうな。
0726デフォルトの名無しさん
2010/02/01(月) 22:47:010727デフォルトの名無しさん
2010/02/02(火) 02:14:290728デフォルトの名無しさん
2010/02/02(火) 04:10:35Google社員にもMac愛好家くさるほどいんのにそんな誰得の展開になるわけないだろ
使えなくしたらグーグルの勝ち〜とか発想が幼稚すぎるわ
おまえらなんでそんなに頭悪いの
とてもプログラミングできるような頭じゃないと思うんだがなんでこのスレにいんの
0729デフォルトの名無しさん
2010/02/02(火) 05:14:530730デフォルトの名無しさん
2010/02/02(火) 07:58:200731デフォルトの名無しさん
2010/02/02(火) 21:09:37なんでプログラマやデザイナやミュージシャンとかクリエイティブなやつらにMac使いが多いか考えたことないだろ
Macを除外する企業戦略とかニートや低脳厨房の発想
0732デフォルトの名無しさん
2010/02/02(火) 21:20:13お洒落だからですが何か
0733デフォルトの名無しさん
2010/02/02(火) 21:55:200734デフォルトの名無しさん
2010/02/02(火) 22:03:390735デフォルトの名無しさん
2010/02/02(火) 22:54:44デザイナーとミュージシャンにMacが多い理由は、割れの巣窟だったから。
写真屋とか、9割が違法コピーって言われてた。
0736デフォルトの名無しさん
2010/02/02(火) 22:57:15何の不思議も無いと思うが
0737デフォルトの名無しさん
2010/02/02(火) 23:39:430738デフォルトの名無しさん
2010/02/02(火) 23:45:060739デフォルトの名無しさん
2010/02/02(火) 23:45:47あとLeopard以降は64bitアプリそのまま使えるから、64bit版OSインストール
し直しなんて手間も要らない。
0740デフォルトの名無しさん
2010/02/03(水) 00:07:300741デフォルトの名無しさん
2010/02/03(水) 00:21:080742デフォルトの名無しさん
2010/02/03(水) 00:42:40くやしいんですね
だいじょうぶですよ
がんばって知能つけましょうね
0743デフォルトの名無しさん
2010/02/03(水) 00:46:49発表者なんか下手すると9割くらいMac。サポートがしょぼいはずのJava系ですら半分がMac。
個人的に、2kgを超えるモバイルマシンなんざありえねぇと思ってるので、正直理解できん。Airは中途半端すぎるし。
0744デフォルトの名無しさん
2010/02/03(水) 02:01:37Mac の話題なんてとんでもない!ぷんすか
0745デフォルトの名無しさん
2010/02/03(水) 02:03:360746デフォルトの名無しさん
2010/02/03(水) 02:09:05NeXT が Objective-C の権利を買い取ったあともしばらく存続してたけど、
消滅したらしい
http://en.wikipedia.org/wiki/Stepstone
0747デフォルトの名無しさん
2010/02/03(水) 10:40:00OSXとLinuxとWindowsが全部動くマシンがMacしかない以上、
他に選択肢は無い。
電話もiPhone持ちが大半だが、加えてAndroidも持ってたりするぞ。
0748デフォルトの名無しさん
2010/02/03(水) 14:03:23全部動くからという理由じゃ選択しないよ
0749デフォルトの名無しさん
2010/02/03(水) 20:20:420750デフォルトの名無しさん
2010/02/03(水) 20:23:220751デフォルトの名無しさん
2010/02/03(水) 21:08:120752デフォルトの名無しさん
2010/02/04(木) 13:31:58新しい機種を導入するたびに前のは破棄してるのか
0753デフォルトの名無しさん
2010/02/04(木) 15:11:30中古屋に売ってます
0754デフォルトの名無しさん
2010/02/04(木) 16:40:22実用的ならうれしい。
0755デフォルトの名無しさん
2010/02/06(土) 22:18:35stringWithCStringを使うと、コンパイル時に
warning: ‘stringWithCString:’ is deprecated
がでました。
stringWithCStringの代わりに何を使うのがよいですか?
0756デフォルトの名無しさん
2010/02/06(土) 22:26:32またはメソッド名 (stringWithCString:) のところでOption+ダブルクリック
0757デフォルトの名無しさん
2010/02/07(日) 00:20:280758デフォルトの名無しさん
2010/02/07(日) 00:31:210759デフォルトの名無しさん
2010/02/07(日) 00:35:52他人にあげたり、捨てたり、死蔵したり
>>755
>stringWithCStringの代わりに何を使うのがよいですか?
stringWithCString:encoding:
0760デフォルトの名無しさん
2010/02/07(日) 14:33:01どのくらいのペースで買い替えてるんだろう。
うちはしょっちゅう買ってるから1人暮らしなのにPCは常時7〜8台あるわ
0761デフォルトの名無しさん
2010/02/07(日) 18:16:510762デフォルトの名無しさん
2010/02/07(日) 20:04:59冗談でつ
でも質問が下らな過ぎてちょっとうんざりした。最近はドキュメント読まないゆとりが増えたのかなー。
0763デフォルトの名無しさん
2010/02/08(月) 01:52:54うちはこないだ新人向けに調べ方の調べ方マニュアルを作ったな。
よくあるのがググる先生に頼りすぎて、ヘルプや付属ドキュメントを読まないとか。
0764デフォルトの名無しさん
2010/02/08(月) 02:42:50調べ方の調べ方マニュアル、なのか?それはメタだなぁ...
0765デフォルトの名無しさん
2010/02/09(火) 12:59:270766デフォルトの名無しさん
2010/02/09(火) 14:39:020767デフォルトの名無しさん
2010/02/09(火) 15:28:420768デフォルトの名無しさん
2010/02/09(火) 18:00:040769デフォルトの名無しさん
2010/02/09(火) 18:32:170770デフォルトの名無しさん
2010/02/09(火) 18:44:240771デフォルトの名無しさん
2010/02/15(月) 02:45:53フォルダのファイル一覧を、とりあえずコンソールに出してみようとしています。
本や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;
}
0772デフォルトの名無しさん
2010/02/15(月) 03:13:08int 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;
}
0773デフォルトの名無しさん
2010/02/15(月) 09:47:18僕らだってエスパーじゃないから、「エラーがでます」じゃわからんよ。
コンパイルエラーならコンパイルエラーを書き写してもらわんと困るし、
実行時のエラーならどんなエラーなのか書いてください。
「エラーがでます」とだけここに書き込むのは、
エラーが出て、エラーメッセージを解読する気がないという気がします
それではプログラムは上達しませんよ。
単に ~/Public になんもファイルがないだけでは、と言う気がします。
0774デフォルトの名無しさん
2010/02/15(月) 10:58:25おお。ありがとうございました。
早速実行したところ、
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"];
などいくつか試したのですが、どうしてもうまくいきません。
0775デフォルトの名無しさん
2010/02/15(月) 11:56:230776デフォルトの名無しさん
2010/02/15(月) 12:29:090777デフォルトの名無しさん
2010/02/15(月) 12:57:210778デフォルトの名無しさん
2010/02/15(月) 13:17:01OS 10.5以降は非推奨メソッドだから使わないでねって警告なんじゃないの?
0779デフォルトの名無しさん
2010/02/15(月) 14:01:11コンソールを表示してみ。
> ビルドできませんでした。
嘘付かないでね。
0780デフォルトの名無しさん
2010/02/15(月) 14:10:21これがわからないってことは、リファレンスどころか警告すら読めてないってことでしょう。
その状態でObj-Cで開発やるのはかなり厳しいよ。
で、「(やる気があるのなら)英和辞書をお奨めする」ってことなんだけどな。
それとも警告出るたびに聞きに来るの?
0781デフォルトの名無しさん
2010/02/15(月) 14:31:030782デフォルトの名無しさん
2010/02/15(月) 15:24:340783デフォルトの名無しさん
2010/02/15(月) 18:49:27「Cocoaスレに行け」とか
「Mac プログラミングスレに行け」
って言われなかったのが奇跡だな…
# Foundation Framework ネタはどこが適切なんだろ…?
0784デフォルトの名無しさん
2010/02/15(月) 18:58:270785デフォルトの名無しさん
2010/02/15(月) 19:04:11これはすごく親切な警告。
なので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:
を使う。
0786デフォルトの名無しさん
2010/02/15(月) 19:05:440787デフォルトの名無しさん
2010/02/15(月) 19:44:43まあそうおっしゃらずに、
もうすこしおつきあいいただけないでしょうか。
さきほどのファイル一覧は、あらためてプロジェクトを作り直したら、問題なく動きました。
一覧も取得できました。
失敗したときは、まだトライ&エラーの段階なので、
ひとつのプロジェクトのソースを全選択して、
消しては新しいソースを貼りつけて、
実行していたのです。
ソースじたいは変更していないのですが、
ともあれお騒がせしました。
で、次なのですが、いちおう辞書片手に読んでますけど、
(1)デバッグ中に変数に代入されているデータを見る方法
(2)コンソールコマンドから、テキストエディタとかのGUIアプリケーションを実行できるのか?
の2点を教えていただけないでしょうか。
(1)ブレークポイントを設定してみるものの、
そのデータが具体的になになのか、確認するには、
どこのメニューでどれを見ればよいのでしょう?
(2)ソースは次のとおりで、実行すると、デバッガコンソールでいろいろ表示したあと、
(gdb)というモード? になり、期待していたように、
テキストファイルをテキストエディタで表示はしませんでした。
そもそもこういう方法で、外部のアプリケーションを起動できるんでしょうか?
アドバイスお願いします。
0788デフォルトの名無しさん
2010/02/15(月) 19:46:20int 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;
}
0789デフォルトの名無しさん
2010/02/15(月) 20:03:01(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 な
「いろいろ表示」された中に手掛かりが書いてある、ちゃんと読めよ
0790デフォルトの名無しさん
2010/02/15(月) 22:17:460791デフォルトの名無しさん
2010/02/15(月) 22:27:00ありがとうございました。
0792デフォルトの名無しさん
2010/02/18(木) 23:36:010793デフォルトの名無しさん
2010/02/18(木) 23:48:27NSLog(@"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文の判定を素通りしているようです。何が原因なのでしょうか。。助けてください。。
0794デフォルトの名無しさん
2010/02/19(金) 01:12:12NSStringのUTF8Stringを使ってconst char *型の文字列の先頭ポインタを取得して使う。
0795デフォルトの名無しさん
2010/02/19(金) 01:55:56strlen の戻り値は符号なしだから、> の左辺はマイナスにならないよ。
if (strlen(...) > MAX_TITLE_LENGTH)
と書くべき。C 言語からやり直しだね。
0796デフォルトの名無しさん
2010/02/19(金) 02:25:05ひゃあ、ありがとうございます。
strlenの戻り値はunsignedなんですね。。。
ありがとうございました。
0797デフォルトの名無しさん
2010/02/19(金) 06:08:41NSString* func()
{
NSString *str = [[NSString alloc] initWithFormat:@"%d", 1];
return str;
}
例えばこういう場合って、どうすればいいのでしょうか?
releaseしたらreturnできませんし、returnしたらreleaseできませんよね?
0798デフォルトの名無しさん
2010/02/19(金) 06:25:45まさにそういう時のためにautoreleaseがあるのだよ
0799デフォルトの名無しさん
2010/02/19(金) 08:16:29ありがとうございます!
[[[NSString alloc] initWithFormat:@"%d", 1] autorelease];
でいいんですよね!ありがとうございますっ!
0800デフォルトの名無しさん
2010/02/19(金) 08:23:430801デフォルトの名無しさん
2010/03/03(水) 23:55:05とりあえずiPhone用の開発環境揃えたいんですけど、お勧めセット一式誰かお願いできますか?
あと、windows系とのネットワークファイル共有って簡単にできるでしょうか?
0802デフォルトの名無しさん
2010/03/03(水) 23:57:280803デフォルトの名無しさん
2010/03/04(木) 00:00:590804デフォルトの名無しさん
2010/03/04(木) 00:01:260805デフォルトの名無しさん
2010/03/04(木) 00:03:080806デフォルトの名無しさん
2010/03/04(木) 00:04:270807デフォルトの名無しさん
2010/03/04(木) 00:05:470808デフォルトの名無しさん
2010/03/04(木) 00:11:260809デフォルトの名無しさん
2010/03/04(木) 00:15:360810デフォルトの名無しさん
2010/03/04(木) 00:19:240811デフォルトの名無しさん
2010/03/04(木) 00:21:250812デフォルトの名無しさん
2010/03/04(木) 00:25:01マジ頭おかしいんじゃね、お前ら
樹海にいって首つって死ね
0813デフォルトの名無しさん
2010/03/04(木) 00:26:21とりあえずiPhone用の開発環境揃えたいんですけど、お勧めセット一式誰かお願いできますか?
あと、windows系とのネットワークファイル共有って簡単にできるでしょうか?
まだ、ソフトもハードも無いので、勧めセット一式はソフトハードセットでお願いできるとありがたいです。
0814デフォルトの名無しさん
2010/03/04(木) 00:26:55ソフトは登録してダウンロードするだけだよ
ハードは現行機種なら何でも良いけど、メモリ多めの方が何かと良いよ
0815デフォルトの名無しさん
2010/03/04(木) 00:34:15このスレ荒らして何の得がある……
0816デフォルトの名無しさん
2010/03/04(木) 01:28:26iPhone作りたいなら中国の工場に就職しろ
0817デフォルトの名無しさん
2010/03/04(木) 01:57:20こんな質問してるくらいだから、多分無理なんだろうな。
下手に教えないほうがいいぞ。手を出し始めたらこのスレがくだらない質問であふれかえってしまう。
0818デフォルトの名無しさん
2010/03/04(木) 02:48:17MacProとCinemaDisplayオススメ
あとFinalCutStudioとLogicかな。
なんやかや結局揃えるハメになるので最初にまとめて買っておくが吉。
ノートで十分とか言う奴がたまにいるが、デスクトップだとアプリのビルド時間が断然早く作業効率が非常に良い。
Windowsとの共有は簡単にできるよ。
0819デフォルトの名無しさん
2010/03/04(木) 13:30:42それでエミュレーションで動かしてから考えるといいんじゃないかな
0820デフォルトの名無しさん
2010/03/04(木) 15:41:41どもどもです、とりあえずそれでいってみようかと思います。
リソースの編集もMac側でやった方が効率いいですかね?
コードだけそっちで作ってみようかと目論んでいたのですが・・・
0821デフォルトの名無しさん
2010/03/04(木) 16:16:18どっちでもいい。
あと最初にしっかりガンマ特性や色温度の管理うぃやっておけば、
実機で印象が変わったりジャギーが目立つ等の問題も避けられる。
(ある程度までは、だけど)
0822デフォルトの名無しさん
2010/03/05(金) 17:22:02アプリのビルド時間が早くなるって、どういうことだ?
0823デフォルトの名無しさん
2010/03/05(金) 18:21:280824デフォルトの名無しさん
2010/03/07(日) 01:53:25以下の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が起きているのでは?とデバッガで値を検査しましたが、そうではありませんでした。
0825デフォルトの名無しさん
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
)
0826デフォルトの名無しさん
2010/03/07(日) 03:14:300827デフォルトの名無しさん
2010/03/07(日) 03:44:06keys must conform to the NSCopying protocol
0828デフォルトの名無しさん
2010/03/07(日) 19:35:030829デフォルトの名無しさん
2010/03/18(木) 02:05:240830デフォルトの名無しさん
2010/03/18(木) 10:14:510831デフォルトの名無しさん
2010/03/20(土) 09:23:490832デフォルトの名無しさん
2010/03/20(土) 09:43:570833デフォルトの名無しさん
2010/03/20(土) 23:17:050834デフォルトの名無しさん
2010/03/22(月) 18:03:17例えば、NSTextField* field があったとして、
isnumber(*[field.text UTF8String])
としたとしますよね。この場合、[field.text UTF8String] だけで渡そうとすると
ポインタだからダメ、みたいな感じで怒られますが、*を付けるという事は
その中身を渡すという事ですよね?
中身を渡すというのは、そのポインタが指す中身を複製してその関数に渡して
いるのでしょうか?
質問がうまく伝わっていなかったらすみません。どうも中身を渡すというのが
どういう意味なのかがよく分からなくて…。Objective-C 以前に C が分かって
いないのでおかしな事を言っていたらすみません。
0835デフォルトの名無しさん
2010/03/22(月) 18:05:360836デフォルトの名無しさん
2010/03/22(月) 18:54:43Cは(Objective-Cも)値渡しだから、ポインタだろうがなんだろうが
渡すときは常に中身がコピーされる。
ポインタを渡したときは、コピーされるのはポインタの値だから
中身はコピーされないな。
中身を渡したら中身がコピーされるだろう。
0837デフォルトの名無しさん
2010/03/22(月) 18:56:42中身っつうか、渡したものが常にコピーされるってことね。
分かりにくかったらすまん。
0838デフォルトの名無しさん
2010/03/22(月) 20:18:47>あの、ポインタに対して使う * っていうのは、内容を複製して渡すのでしょうか?
合ってる、けど「中身」が何であるか勘違いしないように
[field.text UTF8String] は char * を返すんだが、この場合の中身は
先頭の1文字であって文字列全体じゃないからな
0839834
2010/03/23(火) 16:42:01ありがとうございます。
ポインタを渡したらそのポインタの値がコピーされるという事ですよね。
>>838
ありがとうございます。
そうそう、そこも不思議だったんですよね。実際に isnumber はどう
処理しているのでしょう?アドレスに1ずつ足していきながら NULL 文字
がくるまでを文字列と判断するのでしょうか?
ソースを探したんですが見つからなくて…。
0840デフォルトの名無しさん
2010/03/23(火) 17:52:230841デフォルトの名無しさん
2010/03/23(火) 22:07:21>アドレスに1ずつ足していきながら
「文字列」(char *、つまり連続した文字の先頭へのポインタ)を受け取る関数についてはその通り
ただ isnumber は >>840 が言うとおり「文字」(char)を受け取って、
その1文字が数字どうかを判別する
0842デフォルトの名無しさん
2010/03/23(火) 22:59:21げげっ!そうなんですね、という事は、何らかの NSString が数値として
解釈できるかどうかは、何か別の方法で判定しなくてはいけないという事ですね。
Objective-C というよりは Cocoa っぽい話題で申し訳ないですが、皆さんは
ある NSString が数値として解釈できるかどうかはどの様に判定していますか?
0843デフォルトの名無しさん
2010/03/23(火) 23:19:090844デフォルトの名無しさん
2010/03/23(火) 23:20:200845デフォルトの名無しさん
2010/03/24(水) 00:04:21NSNumberFormatter 使ってみたんですが、例えば aiu6 とかが蹴られるのは
いいんですが、6aiue とかやると解釈されちゃうんですよね。
厳密モードみたいなものがあるのかと思ったんですがないし…。
正規表現とかでやるしかないんでしょうか。と思ったら Cocoa には正規表現を
するためのクラスがないんですね、ガーン…。困った…。
0846デフォルトの名無しさん
2010/03/24(水) 06:32:260847デフォルトの名無しさん
2010/03/24(水) 12:31:40が使えるんじゃないかな。
自分は libc の strtol() 系で事足りてるから使ったことないけど。
0848デフォルトの名無しさん
2010/03/24(水) 22:49:40UTF-8が処理出来るとかなり違うかと思うのですが。
0849デフォルトの名無しさん
2010/03/24(水) 22:51:070850デフォルトの名無しさん
2010/03/25(木) 01:53:35やってみたんですが、やはり 0aiu みたいなものは解釈されてしまうみたいですね。
しょうがないので、数値かどうかを判断する関数を作り、とりあえずそこで数値と
判断したものだけ実際に数値に変換させる様にしました。
どうもおさわがせしました。でもなんか楽しいですね、Objective-C を頑張って
覚えたいです。
0851デフォルトの名無しさん
2010/03/25(木) 13:48:33range:
0852デフォルトの名無しさん
2010/03/25(木) 15:06:47自分の環境では6aiueはNULLを返す。
厳密モード的な動作は -setLenient: で切り替えられると思うが,NSNumberFormatterのAPIページくらい目を通したか。
ただ6aiueの解釈には影響ないみたいだが。
あるいはgetObjectValue:...を使いたいなら >>650 の通りだな。
0853834
2010/03/25(木) 18:27:08ありがとうございます。
もちろん numberFromString は使ってみたのですが、普通に
数値として返ってきてしまうので困っていました。
setLenient も指定してみましたが、効果がありませんでした。
やり方がいけなかったんですかね…。家に帰ってもう一度やってみます。
0854デフォルトの名無しさん
2010/04/02(金) 09:20:21may not respond to '-notImplemented:'
ではなくするには何をインポートすれば良いんだ?
#import <objc/Object.h>
やっても意味無いようだけど。
当方OSX 10.6。
0855デフォルトの名無しさん
2010/04/02(金) 12:25:59- (id)hogehoge {
return [self notImplemented:nil];
}
こうなってんじゃないの?
子クラスで -hogehoge を再定義すれば
0856デフォルトの名無しさん
2010/04/02(金) 15:27:23? いや、
- (void)hoge {
[self notImplemented: _cmd];
}
をエラー無くビルドしたいんだけど。notImplementedされてるクラスを云々じゃなくて、自分でnotImplementedしたいんだ。
今クラスクラスタ作ってるところで。
0857デフォルトの名無しさん
2010/04/03(土) 02:16:08ああすまん
自分で空の -(void)notImplemented: を定義すりゃいいんじゃね
0858デフォルトの名無しさん
2010/04/05(月) 00:45:54みたいな、オブジェクトをカンマで区切って複数指定できるメソッドって、
定義する側ではどう書くのでしょうか?
もしや、カンマで区切って繋げると自動的に NSArray に変換してくれたり
しているんでしょうか??
0859デフォルトの名無しさん
2010/04/05(月) 01:45:11http://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
0860デフォルトの名無しさん
2010/04/05(月) 02:30:46という冗談は置いておきまして、ありがとうございました。
ただ、可変長引数という単語で検索してもほとんどきちんと解説している
サイトってないですね…。「va_list」とか「va_start」とか一体何者なのか
分かりませんし…。まぁとにかくそのあたりから調べてみる事にします。
ありがとうございました。
0861デフォルトの名無しさん
2010/04/05(月) 12:54:310862デフォルトの名無しさん
2010/04/05(月) 13:26:030863デフォルトの名無しさん
2010/04/05(月) 15:20:270864デフォルトの名無しさん
2010/04/06(火) 18:52:140865デフォルトの名無しさん
2010/04/14(水) 14:39:34この layout というのは、どういうものなのでしょうか?
ソースコードを調べていくと、objc-runtime-new.h に
class_t 構造体->class_rw_t 構造体->class_ro_t 構造体->uint8_t *ivarLayout
となっていて uint8_t*型だとわかりましたが、何の値を示すものなのでしょう?
よろしくお願いします。
0866865
2010/04/14(水) 15:44:41書いてあります。が、いまいちどうなっているのかよく分からないので、
ご存知の方がいらしたら、ご教示お願いいたします。
/**********************************************************************
* 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
*
**********************************************************************/
0867デフォルトの名無しさん
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 については最近出た本を参照。
0868865
2010/04/15(木) 20:40:07「ニブルの上位下位」のところがよく分からなかったんですが、なるほど、
そういう意味だったんですね。分からなかった「ニブル」の意味も何となく
分かりました。ありがとうございます。
もう一つお教えください。GC についてですが、最近新しい本が出たのでしょうか?
0869デフォルトの名無しさん
2010/04/15(木) 20:56:05byte : 8 bit
nibble: 4 bit
これはbyte -> bite (かじる)にひっかけて
「ちょこっとかじる」という意味のnibbleをbyteの半分を
指す様になった。 ほとんど冗談の様なネーミング。
0870デフォルトの名無しさん
2010/04/15(木) 21:06:470871デフォルトの名無しさん
2010/04/15(木) 21:06:49nybbleとスペルしたり、かならずしも4bitではなくて
5bitや6bitに使われた場合もあったそうだ。 また、
用語の起源はIBMのメインフレームらしい。
http://en.wikipedia.org/wiki/Nibble
0872デフォルトの名無しさん
2010/04/15(木) 21:09:17bite -> byte だよね
bite が byte の語源
0873デフォルトの名無しさん
2010/04/15(木) 21:13:070874865
2010/04/15(木) 21:14:47レスありがとうございます。
その話、何かで見たことがありました!完全に忘れていましたが・・・
おかげでもう忘れない気がします(笑)
0875865
2010/04/15(木) 21:16:460876デフォルトの名無しさん
2010/04/15(木) 23:49:00GC の本っていうのは ttp://www.amazon.co.jp/dp/4798025623 のこと
オブジェクトの参照関係が GC でどう使われるかに興味があるんだったら
読んでみるといいかもしれない
ところで byte = 8bit じゃない計算機もあったよね
そのために 8bit を明示するときは octet と言ったり
0877デフォルトの名無しさん
2010/04/16(金) 13:30:370878デフォルトの名無しさん
2010/04/18(日) 13:04:34じゃなくて
+hoge;
って宣言を見かけたんだが、これはなんだ?
0879デフォルトの名無しさん
2010/04/18(日) 13:16:130880デフォルトの名無しさん
2010/04/18(日) 15:17:16だよ。
0881デフォルトの名無しさん
2010/04/18(日) 21:32:430883デフォルトの名無しさん
2010/04/24(土) 22:04:45+ (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 とか無いし。
0884デフォルトの名無しさん
2010/04/26(月) 10:24:01親でover-rideされてるにも関わらず祖父を直接見るなんて、そもそもの設計が大間違いなのでは?
と Obj-C 初心者が言ってみる。
0885デフォルトの名無しさん
2010/04/26(月) 10:40:05- (void) piyo {
struct objc_super superSuper = {self, [[self superclass] superclass]};
objc_msgSendSuper(&superSuper, _cmd);
}
あとは、class_replaceMthod 等でメソッド入れ替えなども可。
0886デフォルトの名無しさん
2010/04/26(月) 12:46:27MyMyMyObjectのさらにサブクラスを作ったときにハマるな。
0887デフォルトの名無しさん
2010/04/26(月) 16:42:250888デフォルトの名無しさん
2010/05/01(土) 11:17:150889デフォルトの名無しさん
2010/05/01(土) 11:55:50ほんとだ。なんでこうなるの?
0890デフォルトの名無しさん
2010/05/01(土) 20:43:49さらに、[self superclass]も[super superclass]も、レシーバーはselfになる。
詳しくは、Objective-Cのruntime APIを見てください。
祖父クラスが基本的なメソッドを提供していて、子クラスでオーバーライドしたんだけど
孫からも基本的な処理へのアクセスが必要だというような場合は祖父クラスで hoge を
basicHoge として別名でも提供しておくという Smalltalk 流の作法で済ませられない?
0892デフォルトの名無しさん
2010/05/09(日) 00:40:25NSData型の変数に4バイト、例えば
0x00 0x00 0x00 0x7F
と入ってる場合、これをInt型の127に変換するには
どうすればいいのでしょうか?
0893デフォルトの名無しさん
2010/05/09(日) 01:37:170894デフォルトの名無しさん
2010/05/09(日) 01:39:000895892
2010/05/09(日) 12:02:34int a = CFSwapInt32HostToLittle(*(SInt32*)[data bytes]);
で、まだ意味はぼんやりとしか分かってないですが、
無事期待の動作が得られました。
0896デフォルトの名無しさん
2010/05/18(火) 10:45:41NSInteger index = random() % count;
NSInteger index2 = random() % count;
while(index2 == index) {//同じにならないように
NSInteger index2 = random() % count;
}
とやって、二種類のランダムな数字を発生させようとしていますが、
何度かランダム数を発生させるとプログラムがストップしてしまいます。
なにがいけないのでしょうか。どなたかご教授願います。
0897デフォルトの名無しさん
2010/05/18(火) 10:55:35NSInteger index2 = random() % count;
while(index2 == index) {//同じにならないように
NSInteger index2 = random() % count; // このindex2と前のindex2は別物
}
一つ目のindex2と二つ目のindex2は別物です。
while(index2 == index) {//同じにならないように
index2 = random() % count; // 宣言しない
}
としてください。
// 変数が隠されてしまっている とか警告出ませんでした?
// 変数スコープとかその辺の話も調べてね
0898デフォルトの名無しさん
2010/05/18(火) 10:55:360899デフォルトの名無しさん
2010/05/18(火) 11:06:390900896
2010/05/18(火) 11:35:51うぉぉ、当たり前ですよね。コピペしてたのが間違いでした。
ホントにあんまりな質問に回答して頂き、ありがとうございました。感謝感激です。
あ〜恥ずかしい。
0901デフォルトの名無しさん
2010/05/18(火) 14:20:24iPhone用アプリのプログラムを最近始めた初心者です。
<質問>
iPhoneから外部DB(postgreSQL)に接続する手法がわかりません。
色々調べましたがピンと来なかったのですが、Object-Cから直接DBConnect
するような方法は無いのでしょうか?
XCode自体、初心者なのでよくわからないのですが、
1. Ruby?を利用する
2. java+JDBCを利用する
のような感じになるのでしょうか。
ヒントだけでも教えていただけたら助かります。
宜しくお願い致します。
0902デフォルトの名無しさん
2010/05/18(火) 14:46:110903デフォルトの名無しさん
2010/05/18(火) 15:11:380904デフォルトの名無しさん
2010/05/18(火) 17:10:02UIScrollViewで画面より大きい画像を表示しているとき、画面に写っているのは、
ScrollView上でどの位置(座標)なのかを取得するにはどうしたら良いでしょう?
検索をしても、タッチした座標の検出しかわかりませんでした。
よろしくお願いします。
0905デフォルトの名無しさん
2010/05/18(火) 17:31:230906デフォルトの名無しさん
2010/05/21(金) 15:12:54あるファイル(A.m)から、別のファイル(B.m)のクラス( -(void)test{...} )にアクセス
するにはどうしたら良いのでしょうか?
B.hをA.mにimportして、A.m内で[self test]とやってみましたが、警告が出てうまく
ビルドできませんでした。
低レベルな質問ではありますが、よろしくお願いします。
0907デフォルトの名無しさん
2010/05/21(金) 15:35:06自分も初心者だけど、A.m内でBのインスタンスを作ってないんじゃ?
A.m内で[self test]ってしても、selfはAのインスタンス自身を参照するよ。
testメソッド(objCはメッセージだっけ?)を持っているのがBのインスタンスだからできないんじゃないかな。
0909デフォルトの名無しさん
2010/05/24(月) 23:47:32@try {
ここで例外発生。
}
@catch (NSException * e) {
NSLog(@"%@ @catch in %@", e, NSStringFromSelector(_cmd));
@throw;
}
@finally {
[pool release];
}
で、上位のレベルで例外を受ける時、例外は pool に登録されるせいで、@finally 中の [pool release]; で解放されちゃって、
上位のレベルで例外を触るとバッド・アクセスになる。
例外発生時に pool がメモリリークするから @finally に入れたのだが、逆にこんな問題が出てくるとは。
NSAutoreleasePool を作らないという選択肢以外に、何かリークしない上手い対処法無いかな?
@throw; しないで、上位には NSError で渡すとか考えてるけど。
例外処理とか今まで殆ど触ったこと無いから、勝手が分からない。
0910デフォルトの名無しさん
2010/05/25(火) 00:07:47例外処理に悩むならException Programming Topics for Cocoa
くらいは嫁。その中の
Exception Handling and Memory Managementに、まさしく
あなたが悩んでいることについて書いてある。ピックアップすると
The simplest is to refrain from releasing local autorelease pools in @finally blocks
もっとも簡単な方法はfinalyブロックでローカルなプールを使うなってこと。
0911デフォルトの名無しさん
2010/05/25(火) 00:18:05申し訳ない。その辺の文章は全て和訳されてるとばかり。
http://developer.apple.com/mac/library/documentation/cocoa/conceptual/Exceptions/Tasks/HandlingExceptions.html
おお、素晴らしい。savedException を使います、成る程ね。
ありがとうございました。
0912910
2010/05/25(火) 00:22:43追記。
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されるのが前提だけど。
0913デフォルトの名無しさん
2010/05/25(火) 13:51:57NSAutoreleasePool *_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]; するコトにしたよ。
0914デフォルトの名無しさん
2010/05/26(水) 20:50:570915デフォルトの名無しさん
2010/05/26(水) 22:14:330916デフォルトの名無しさん
2010/05/27(木) 10:14:520917デフォルトの名無しさん
2010/05/27(木) 13:42:00Objective-C特有の関数呼び出しが多数現れるけど
0918デフォルトの名無しさん
2010/05/27(木) 18:00:290919デフォルトの名無しさん
2010/05/27(木) 18:27:400920デフォルトの名無しさん
2010/05/27(木) 19:56:19ObjC 特有の関数呼び出しが多数現れるから、コンパイルしても C と区別付くよ。
0921デフォルトの名無しさん
2010/05/27(木) 20:44:33そうじゃなくて、>914へのヒントだよ
0922デフォルトの名無しさん
2010/05/27(木) 20:46:360923デフォルトの名無しさん
2010/05/27(木) 22:12:380924デフォルトの名無しさん
2010/06/05(土) 02:21:48どういう処理に使ったとか、実践的・実用的な利用例があったら教えてくれ。
0925デフォルトの名無しさん
2010/06/05(土) 02:22:160926デフォルトの名無しさん
2010/06/06(日) 13:32:29c#のように解析することはできますか?
0927デフォルトの名無しさん
2010/06/06(日) 14:04:48>c#のように
具体的に何がしたいの?
0928デフォルトの名無しさん
2010/06/06(日) 14:54:53ソースみて参考にしたいのです
特に規約とかないようなので
0929デフォルトの名無しさん
2010/06/06(日) 15:05:25逆コンパイルもそれなりな形にできそうだけど
いかんせん逆コンパイラが作られるほど有名な言語でもないというのが
0930デフォルトの名無しさん
2010/06/06(日) 15:07:21デコンパイルしたいってことか。
残念ながら iPhone アプリのデコンパイラは知りません。
アプリの動きを知りたいなら、Instruments でカスタム
DTrace スクリプトを書くのが一番良いと思います。
0931デフォルトの名無しさん
2010/06/06(日) 15:18:44コーディング規約なら一応あるよ。
Coding Guidelines for Cocoa
http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html
あと、 /Developer/Examples の中にサンプルソース(TextEditとか)が
入っているので、参考になるかもよ。
0932931
2010/06/06(日) 15:20:470933デフォルトの名無しさん
2010/06/06(日) 15:42:47リバースエンジニアリングを禁止する規約がないって意味でしょ
0934デフォルトの名無しさん
2010/06/06(日) 16:10:280935デフォルトの名無しさん
2010/06/07(月) 22:38:460936デフォルトの名無しさん
2010/06/08(火) 07:45:090937デフォルトの名無しさん
2010/06/08(火) 08:02:200938デフォルトの名無しさん
2010/06/09(水) 15:25:24入門書を何冊か読んだのですが、どれもインスタンス変数のスコープ分けをしていないので、気になっています。
0939デフォルトの名無しさん
2010/06/09(水) 15:27:26@interface AClass : NSObject
{
0940デフォルトの名無しさん
2010/06/09(水) 17:01:090941デフォルトの名無しさん
2010/06/09(水) 17:26:05プライベートであるという表明だけは出来るけど
静的チェックは甘いよね。
0942デフォルトの名無しさん
2010/06/10(木) 10:11:59ありがとうございます。
自分はJavaやってから始めたので、クラス内でしか使わない変数を隠蔽していないと
どうも気になってしまって…。
荻原本は読みました。解説はしてるのですが、以降の章のサンプルコードでは積極的に
使ってませんよね。>>941さんがおっしゃるように、
「スコープ分けしてもKVCでどうせアクセスできるんだから、細かい事は気にすんな」
って事なのでしょうかね。
0943デフォルトの名無しさん
2010/06/10(木) 12:11:55通常アクセスならエラーが出るし、
迂闊に触ってしまうことへの注意喚起も出来るから
それで慣れている人は続ける方がいいよ
Appleのやり方も色々だよね。
昔から有るクラスはコメントで「privateだ」って書いてあったり
idな型不明のオブジェクトに隠蔽したり
@privateで宣言したり。
0944デフォルトの名無しさん
2010/06/10(木) 13:06:02なるほど、ありがとうございます。
書いている方が安心できるので、書く事にします。
少しでも単純なバグを減らせるなら、これを書くぐらいなんとことないですしね。
id型で思い出しましたが、参考書はかなりid型を使っていますが、Objective-Cは動的型結合があるのでid型で書いた方が、何かと都合が良いのでしょうか。
「ここは絶対hoge型でしょう」みたいな箇所でid型を使うのは、Javaのような静的型付け言語に慣れ親しんでいた私の身には抵抗がありまして…。
「ごちゃごちゃ言う前に慣れろ」と言われれば、それまでなんですけど、ハイ…。
0945デフォルトの名無しさん
2010/06/10(木) 14:24:18「明確な指針はないので好きにすれば良い」みたいなことが書いてある。
俺はクラス型を指定すると、コンパイル時に警告を出してくれるメリットがある
のでどんどん使っていけば良いと思うよ。
ただ、コンパイル時には静的な型チェックを行ってくれるが、実行時にはすべて
id型になっているということがJavaとは違うので注意。
id型の代わりにクラス型を指定したせいでデメリットが生まれることはあまり
ないと思われる。
0946デフォルトの名無しさん
2010/06/10(木) 14:35:23ありがとうございます。書いてました。申し訳無いです。
>ただ、コンパイル時には静的な型チェックを行ってくれるが、実行時にはすべて
>id型になっているということがJavaとは違うので注意。
この違いは大きいですね。注意します。ありがとうございました。
0947デフォルトの名無しさん
2010/06/10(木) 15:10:05WebViewはちょっと面白いよね。
@privateでWebViewPrivateクラスのインスタンス変数を持ってるだけだし、
WebViewPrivateクラスの実装とかはなぜかWebViewDataにある。
0948デフォルトの名無しさん
2010/06/11(金) 16:03:43NSLog("%O", index);
としましたが、ポインタコンパチブルなんたらと怒られました。
何が間違っているのでしょうか?と質問しようとして、
よく見たら、1つ目の引数のポインタが型違うやんみたいなことを言われました。
NSLog(@"%O", index);
としたら、うまく行きました。自己解決しました。ありがとうございました。
以前にもこういうミスがありまして、こういうミス起きないようにするには
どうすればよいでしょうか。変な質問ですがよろしくお願いします。
0949デフォルトの名無しさん
2010/06/11(金) 16:50:470950デフォルトの名無しさん
2010/06/11(金) 20:30:49一度遭遇したエラーや警告を、その原因、対処方法とともに意識して憶えていく努力をする。
0951デフォルトの名無しさん
2010/06/11(金) 20:37:59CFIndex型の変数indexに、どんな値が入っているか見ようと思うのですが、
printf(@"%O\n", index);
としましたが(ry
0952948
2010/06/12(土) 14:48:06>>949
「あっと驚くNSString」これで頭に叩き込もうと思います。
頭に叩き込んでいたら怪我をしてしまいまして、これから病院に行ってきます。
>>950
そうですよね。がんばります。
>>951
次は無いようにしたいですね。
そこで新たな質問ですが、
NSLog(@@"%O", index);
のところでエラーが出ます。
原因はなんでしょうか?
0953デフォルトの名無しさん
2010/06/12(土) 14:56:210954デフォルトの名無しさん
2010/06/12(土) 23:08:400955デフォルトの名無しさん
2010/06/13(日) 06:40:53俺、べつのバカだけど、そうなんだ!べんりだなー
0956デフォルトの名無しさん
2010/06/17(木) 23:18:32http://www.gnu.org/software/gnustep/experience/Windows.htmlの通りインストールしたんですが、shellのコマンドがわかりません
というかみなさんMACでやってるんですか?
iphone ipad の用プログラミングでvisual C++みたいなのありませんか?
0957デフォルトの名無しさん
2010/06/17(木) 23:21:020958デフォルトの名無しさん
2010/06/17(木) 23:30:07そうなんですか 初級過ぎてすみません><
アップル公式のSDKもよく見たらMAC限定みたいですね 出直してきます
0959デフォルトの名無しさん
2010/06/17(木) 23:44:330960デフォルトの名無しさん
2010/06/18(金) 09:45:40ここのOption 3を見ながらJSON-Frameworkを使ってMacアプリでテストを行おうとしているのですが、うまくいかずに困ってます。
フレームワークをプロジェクトに追加したので、3.までは終わってると思うのですが、
4の意味がわかりません。これは何をすれば良いのでしょうか?
0961デフォルトの名無しさん
2010/06/18(金) 10:31:17サイドバーの
「ターゲット」を展開→アプリ名になってる項目を右クリック→「追加」→「新規ビルドフェーズ」→「新規コピーファイル」
開いたパネルの「デスティネーション」を「フレームワーク」に設定
アプリ名の項目を展開→「ファイルをコピー」の上に JSON.framework をドロップ
0962デフォルトの名無しさん
2010/06/18(金) 10:34:45サイドバーの <プロジェクト名>/Frameworks 項目の中に入ってるやつ
0963デフォルトの名無しさん
2010/06/18(金) 11:07:33ありがとうございます。前進できました。
ビルドすると、JSON Frameworkのいくつかのファイルが見つからないというエラーが出ましたので、
私の設定のどこかがまずいのでしょう。
頑張って潰したいと思います。
0964デフォルトの名無しさん
2010/06/21(月) 18:46:22あと萩原本以外にいいのないですか?自分はCは中級くらいやれてます
*********************
Leopardにアップグレードしてしまった方、
この本は使えません。Xcode Toolに大幅な変更があったからです。
まだTigerを使っている方。この本は貴方のためのものです。
本の通り作業して行けばCocoaのいろはのい位まではモノになるはずです。
0965デフォルトの名無しさん
2010/06/21(月) 19:47:480966964
2010/06/21(月) 20:09:390967デフォルトの名無しさん
2010/06/24(木) 03:59:04採用
0968デフォルトの名無しさん
2010/06/27(日) 22:15:30このコードで、どのNSLogも出力されないんだが何か間違ってる?
これじゃNSOperationQueueを使う意味がないのは承知の上。
0969968
2010/06/28(月) 17:59:490970デフォルトの名無しさん
2010/06/29(火) 18:10:59(´・ω・`) うさちゃんピース
0971デフォルトの名無しさん
2010/07/02(金) 05:44:561ヶ月未満の初心者なんですが、初歩的なことでつまずいています。
ヘッダファイルで
@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を使いたいんですけど、どうしたらいいんでしょうか?
0972971
2010/07/02(金) 06:11:49ttp://www15.plala.or.jp/NovemberKou/programming/2ndGeneration/2ndHome/RMGWindowController/fixCrashDnD.html
を参考にしました。
NSArrayの使用サンプルはみんな、1関数内で処理が終了してるものばかりで、なかなか見つかりませんでした。
おじゃましました。
0973デフォルトの名無しさん
2010/07/02(金) 18:57:590974デフォルトの名無しさん
2010/07/02(金) 20:38:070975デフォルトの名無しさん
2010/07/03(土) 17:30:350976名無しさん@そうだ選挙に行こう
2010/07/10(土) 15:46:20↓で提供されているAPIを使うことって出来ますか?
iphoneの開発環境で使用するにはどうしたらいいのでしょうか?
http://developers.face.com/
0977名無しさん@そうだ選挙に行こう
2010/07/10(土) 16:39:530978名無しさん@そうだ選挙に行こう
2010/07/10(土) 17:17:490979名無しさん@そうだ選挙に行こう
2010/07/11(日) 00:35:32HTMLかXMLで実装した後、NSWebViewで参照すればイイんじゃない?
0980名無しさん@そうだ選挙に行こう
2010/07/11(日) 12:32:020981デフォルトの名無しさん
2010/07/13(火) 22:39:12NSString* str = @"hoge";
と、
NSString *str = @"hoge";
て感じで、クラス名の後ろに*が付いてるのと、変数名の前に*が付いてるので書き方が分かれてて混乱中。
どっちの方が一般的な表記なんですかね?
一応、どっちもコンパイルは通るんだけど…
0982デフォルトの名無しさん
2010/07/13(火) 23:58:35NSString *str1, *str2;
あとはわかるな?
0983デフォルトの名無しさん
2010/07/14(水) 00:17:40>>982のように変数を複数宣言したときとの整合性を取るなら NSString *str
どっちも一般的だから好きなほうで
0984981
2010/07/14(水) 01:29:03クラスのインスタンスはポインタ型の変数と思えば良いのかな。
Objective-Cに慣れるのに、時間掛かりそうだ…
0985デフォルトの名無しさん
2010/07/14(水) 01:47:56Cで関数形式マクロを使ってポインタを隠蔽したような感覚で考えれば簡単。
0986デフォルトの名無しさん
2010/07/14(水) 14:04:37C ファミリは区切り部分に空白がいくつ入ってもいい。改行でもいい。
> どっちの方が一般的な表記なんですかね?
{ 前後の改行の仕方に複数の流儀があるのと同じこと。
>>984
> クラスのインスタンスはポインタ型の変数と思えば良いのかな。
C はできるの?
malloc() するときはポインタで受け取るでしょ?
[[NSString alloc] init] の alloc はそういうこと。
t* v; ってのは c++ で一般的な書き方です。
合理性はともかく c++ のコードの大半はこのスタイル。
0988デフォルトの名無しさん
2010/07/14(水) 15:38:120989デフォルトの名無しさん
2010/07/14(水) 16:49:20qsort(3)の第4引数に関数ポインタを渡す代わりに比較用関数を直接書ける
みたいな
0990デフォルトの名無しさん
2010/07/14(水) 21:37:44canEditRowAtIndex だか何だかで NO 返せば良いんだった様な
あとそれスレ違いだ。
そういうのは新Mac板のiPhoneのプログラミングスレで。
レス数が950を超えています。1000を超えると書き込みができなくなります。