Objective-C [ObjC part:4];
1 :
デフォルトの名無しさん :
2009/04/15(水) 00:11:00
6 :
3 :2009/04/15(水) 23:38:19
短い URL かっこいい
じゃもうぜんぶTinyURLで。
あれはかっこわるい
Cのヘッダファイル#importしたら、idって名前のメンバがある構造体でエラーになった。 これはしょうがないのか…。
エラーにならんよ。
#import <objc/objc.h>
14 :
デフォルトの名無しさん :2009/04/19(日) 22:09:48
Windowsで動く処理系ってありますか? 有ったら触って見たいです。
16 :
デフォルトの名無しさん :2009/04/19(日) 23:20:09
>>15 ありがとう御座います><
早速試してみます^^
MinGW/GCCじゃだめ?
Cocotron は?
Cocotron は XCode でのクロスコンパイルが前提の気がする... つかったことなくてサイトの説明を読んだだけなので何とも言えませんが。
>>20 俺も採用例FileMagnetのWinクライアントぐらいしか知らないな
用途によってはREALBasicとかも検討すべし
>>14 ただ遊びたいなら話は別だが
>>21 >用途によってはREALBasicとかも検討すべし
REALBasic は Objective-C ではないのでは???
>>22 WIn/Mac両対応のソフトウェアを作るという前提での話
どうももう一回読んでみると
>>14 はただObjective-Cの処理系で遊びたかっただけのようだから的外れな指摘だな
たしかLinux系にはgccでobjective-cのコンパイラは提供されていたような...
数度インストールオプションで見た覚えがある
荻原本買って勉強中だけどこれが初プログラムだからどーにもな〜。 やり始めて2週間だからしゃーなか
初プログラミングなら、荻原本でいきなりObjective-C叩くより、 楽しいCocoa辺りのコードを特に理解せず書いて動かして学んでいく方が進み早いんじゃないかな
Dynamic-ObjectiveC を勉強中です。IMP 呼び出しについて教えて下さい。 オブジェクトを返すようなメソッドはそのままのものが返ってきましたが、 値を返すようなメソッドの場合、どうやって返ってくるのですか? @interfae Bar: NSObject { double num; } @property(readwrite) double num; @end @implementation Bar @synthesize num; @end として、Bar のインスタンス hoge を作り、numを適当に設定し、 IMP numImp = [[Bar class] instanceMethodForSelector:@selector(num)]; id num = numImp(hoge, @selector(num)); としたところ、num には hoge が入っていました。method_copyReturnType() では、d が返ってくるのですが…よろしくお願いします。
ええと追記です。id だからオブジェクトを返すものしか駄目なのか、とも考えた のですが、double を試す前にBar の変数に char *name とした場合には、 設定したchar* が返って来たので、やってみた次第です。 int の場合にも設定した値が返ってきました。で、今floatでやってみたのですが、 double と同様、駄目でした。float なら値が返ってくる事を期待したのですが…
キャストしたらどうよ? double(*numImp)(id,SEL) = [Bar instanceMethodForSelector:@selector(num)]; double num = (*numImp)(hoge, @selector(num));
それが正解だよね IMP の定義は typedef id (*IMP)(id, SEL, ...); だから、id 以外を返す場合はキャストして使わないといけない。
>>28 できました!なるほどー、IMPをさらに関数ポインタにしてしまえば良いんですね。
勉強になりました、ありがとうございます。
あと>26の「num には hoge が入っていた」というのはたまたま入っていた
だけのようでしたので訂正します(汗
>>29 ありがとうございます。キャストが必要だろうと思い、そのまま
double value = (double) numImp(hoge, @selector(num));
とかやっていたので、コンパイラに怒られていたんです。Cそのものの経験が
無いのでよく分からずにやってました。関数ポインタのキャスト、ってのが
目から鱗でして (^^;;
KVC準拠を意識して組んでる人いる?
普通に書いてればそうならない?
GUIならバインディング使うだろ バインディング使うにはKVCで書くだろ 普通に書いてりゃkvcで書くと思う
>>33 は他の言語からうつってきたばかりで、
つい getter を -(NSHage*)hoge でなくて
-(NSHage*)getHoge とかいてしまうからそう思うんではなかろうか。
getだったら - (void)getHoge:(NSHoge *) とか言う形? 違和感有るけど
>>37 -(void)getHoge:(NSHoge**)
でないと駄目だとおもう
Apple gcc で -fconstant-string-class オプションが期待道理動かないんだけどなぜでしょう? Linux で GNU の runtime 使ってると動くんですが… #import <objc/Object.h> #import <stdio.h> @interface MyString : Object { char *bytes; unsigned int numBytes; } - (const char *)cString; - (unsigned int)length; @end @implementation MyString - (const char *)cString { return bytes; } - (unsigned int)length { return numBytes; } @end int main(int argc, char* argv[]) { id s = @"Hello, World"; fprintf(stderr, "<%s:%p>\n", [s name], s); return 0; } % gcc -g -fconstant-string-class=MyString -o main main.m -lobjc main.m: In function ‘main’: main.m:19: error: cannot find reference tag for class ‘MyString’ make: *** [main] Error 1
Obj-C 2 だとこんなかんじになります。 #import <Foundation/Foundation.h> // copied from objc/runtime.h // because objc_class is opaque in Obj-C 2 struct objc_class_fake { Class isa; Class super_class; const char *name; long version; long info; long instance_size; struct objc_ivar_list *ivars; struct objc_method_list **methodLists; struct objc_cache *cache; struct objc_protocol_list *protocols; } ; @interface MyString : NSObject { char *bytes; unsigned int numBytes; } - (const char *)cString; - (unsigned int)length; @end struct objc_class_fake _MyStringClassReference; つづく
@implementation MyString +(void)load { memcpy(&_MyStringClassReference,self,sizeof(_MyStringClassReference)); } - (const char *)cString { return bytes; } - (unsigned int)length { return numBytes; } @end int main(int argc, char* argv[]) { [[NSAutoreleasePool alloc] init]; id s = @"Hello, World"; fprintf(stderr, "<%s:%s>¥n", [[[s class] description] UTF8String],[s cString]); return 0; }
コンパイルは
gcc -fno-constant-cfstrings -fconstant-string-class=MyString hogehoge.m -framework Foundation
とかしてください。
ポイントは、Apple runtime だと、
1. no-constant-cfstring で CFString の特殊処理をやめさせてやる
2. constant-string-class=HogeString だと、isa ポインタが
struct objc_class _HogeStringClassReference というシンボルを指します。
だからそれを初期化してやらないといけないです。
http://lists.apple.com/archives/objc-language/2006/Jan/msg00013.html を参照してください。
43 :
39 :2009/04/28(火) 12:28:19
44 :
39 :2009/04/28(火) 18:26:09
#import <objc/Object.h> #import <stdio.h> #import <string.h> #if (defined __APPLE__) && (defined __MACH__) # import <objc/objc-runtime.h> struct objc_class _MyStringClassReference; #endif @interface MyString : Object { char *bytes; unsigned int numBytes; } - (const char *)cString; - (unsigned int)length; @end @implementation MyString #if (defined __APPLE__) && (defined __MACH__) + load { memcpy(&_MyStringClassReference, self, sizeof(_MyStringClassReference)); } #endif - (const char *)cString { return bytes; } - (unsigned int)length { return numBytes; } @end int main(int argc, char* argv[]) { id s = @"Hello, World"; fprintf(stderr, "<%s:%p> : \"%s\"\n", [s name], s, [s cString]); return 0; }
45 :
39 :2009/04/28(火) 18:28:24
Apple % gcc -fno-constant-cfstrings -fconstant-string-class=MyString -o main main.m -lobjc
GNU % gcc -fconstant-string-class=MyString -o main main.m -lobjc
って感じで両方でコンパイル成功して期待した通り動いた.ありがとう
>>42
46 :
デフォルトの名無しさん :2009/05/13(水) 08:16:25
オブジェクト自分で作ったら、リリースせんといかんと思うけど、 そのとき、例えば、AppleのCocoaだと、 NSObject obj = [[NSObject alloc] init]; [obj autorelease]; って出来るよね? このautoreleaseって、要するにGCみたいなもんなの?
>>46 C言語の自動変数に近い。イベントループ開始でAutoreleasePoolが確保
されて、autoreleaseにするとそこに登録される。イベントループ終了で
AutoreleasePoolが解放されて、autoreleaseで登録したオブジェクトは
全てreleaseされる。だから自分でreleaseの手間が省ける。
GCはどこからも参照されていないオブジェクトを見つけて勝手に解放する
機能
あ、日本語のはログインしないと見れないのかな、ごめん
Xcode で、Objective-c (*.m)のクラスから 別の C++(*.cpp) ファイルの グローバル関数を呼ぼうとすると、下記のようなエラーが出てしまいます。 Linking xxx/xxx -[xxx xxx:] in xxx.o Objective-Cのクラスから、C++のグローバル関数を呼べなかったようです。 *.m ファイル内に作ったローカル関数は呼べたのだけど・・・
extern "C"
トン
54 :
デフォルトの名無しさん :2009/05/29(金) 19:54:09
class Test { Test(){} virtual ~Test(){} }; これコンパイルすると、 error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test' ってエラー出ます 何が悪いんですか?
うちでは問題無かったよ。セミコロン付けろゴルァって事かな? % cat foo.cpp class Test { Test(){} virtual ~Test(){} }; % g++ -c foo.cpp % ls foo.o foo.o
56 :
デフォルトの名無しさん :2009/06/01(月) 15:46:54
>>55 いろいろ試しましたが、コンパイル通りません…
自分はiPhoneのOpenGL ESベースのアプリでやっているのですが、それがまずいんでしょうか
プロジェクト作成して、Other SourcesフォルダにTest.hを作成して、
>>54 のコードを記述し、それをmain.mに#importしてるのですが、エラーになります
.mmで定義するようにしないといけないのかなと思い、Test.mmを作成してコンストラクタ・デストラクタの定義をそちらに移してもだめでした
できればコンパイルを通すまでどのような手順で行っているのか教えてください
before 'Test' だから、クラス定義に問題があるんじゃなくて、 その前、恐らく includeファイル内などに問題がありそう。
58 :
デフォルトの名無しさん :2009/06/01(月) 16:33:57
ヘッダーファイルの「情報を見る」とファイルタイプが.h,.cになっていたので、.h.cppに変えました。 が、それでもダメでした。これでいけると思ったんだけどなあ。 この問題ってXcodeスレで聞いた方がいいんですかね?
呼び出し側のmain.mの「情報を見る」でファイルタイプを.c,.objcから.cpp,.objcppに変えたら動きました。 ここら辺説明してるサイトが全然見あたらなかったですよ… 2chのXcodeスレでかろうじて類似の質問があって助かった
System.Generic.List<T>に相当する 記述方式ってないのでしょうか 毎回毎回別々のオブジェクト書くの面倒です 助けてください
>>60 NSArray に突っ込んで、型は気にしないというのが Cocoa 流です。
もしくは Objective-C++ にしてSTL の list を使えばいいと思いますが
その場合は retain/release に気をつけてください。
>>59 それはだって Obj-C の問題というよりは、C, C++ では
当然の話だから... いつもはどんな言語で開発してるんですか?
C, C++, Obj-C の .h ファイルは、コンパイルの際に
どの言語からインクルードされるかわからないので、
XCode 等 IDE で設定するにしても .h に言語を設定しても仕方が無いです。
.h に C++ のクラスがあるなら、
インクルードする側を (Obj-)C++ モードにしないと
そりゃあコンパイルが詰まりますよ。
>>61 それなんてJavaですかw
iPhoneでもObjective-C++できるのですか
C++のテンプレートはオブジェクト指向的じゃないとよく批判されるがな
>>62 iPhone でも Obj-C++ できますよ
というか main.m を cpp モードにした時点で Obj-C++ になってます
>>59 まさかgccでコンパイルしてたとか?
g++じゃなくて。
>>65 そういうことだったんじゃないの。XCode (Mac の IDE) からだと
ファイルの言語設定でコンパイラが変わるので。
まあ確かにそのあたりはやっている人には当たり前すぎて、
解説書にもつい書き忘れてしまう... ということかも知れない
GUI以外の部分で コールバックってどうやって実現すればいいですかね?
>>67 それだけで貴女以外のひとがなにが聞きたいかわかると本当におもってますか?
僕らはエスパーじゃないよ。
ネットワーク処理をコールバックで処理したいの
さっぱり見えてこないんだけど、Objective-Cは関係あるの?
>>70 C#とC++ならコールバックあるでしょ
なんでObjective-Cには無いの?
元のソース移植できないじゃん
メソッドのポインタ取り出したいってこと?
じゃあこれと等価の記述を教えていただけないですか? double g( double x, double (*f)(double) )
それでいいじゃんw
- (double)g:(double)x callback:(double(*)(double))f; こういう事かな?
>>71 いや、C++ のソースがあるなら Obj-C++ つかえば
なにひとつ移植しなくて済むでしょ。何を考えているんだ?アホ?
わかりにくいね
typedefすればいいじゃん。
Obj-Cって型が解らなくなった場合に チェックする方法ってありますか?
正確には無いと思うよ。
>>83 その型ってのは、変数の型? それとも、オブジェクトのクラス?
Objective-Cは変数に型がない(idでかまわない)言語なだけですよ(プリミティブ型は除きますが)
型キャストを許す言語であれば、(変数の)型が分からなくなる事はありえるのでは?
変数の型がどうであれ、オブジェクトが自分自身の型/クラス、もしくは受けられるメッセージを知ってれば問題ないって考え方です
オブジェクトの型が id なんじゃないの? プリミティブがそれぞれの型を持っているのと同じで。
>>87 idは構造体のポインタのtypedefだからそうとも言えるけど、それは変数に型のあるCという言語での実装の話しで...なんというか微妙な感じもする。
idには特別意味もないし、JavaとかC++の縛りのきつい「型/クラス」と、idは別の概念、別のくくりにした方がいいんではないかと。
何なのこの投げっぱなし質問
interface作ったときにメモリ開放メソッドは どのように記述するのが一般的なのでしょうか
独自にObjを定義したとして [[Obj alloc] initHoge : arg]; allocと組み合わせて利用するinitHogeを定義するとき 定義は以下が一般的なのでしょうか? - (id) initHoge : (NSString *) val;
XmlTextWriterみたいなクラスってないですか?
>>93 Obj-C スレにきて、返事をする人が .NET を知っていると仮定するとはいい度胸をしている。読み手のことを考えて、
「.NET ならこれこれができるこれこれというクラスが
あるんですけど、(ドキュメントは
http:// ... に ...)」とか
質問の際に書けんものかね?
とりあえず NSXMLDocument をつかえば規格に準拠した XML データは
つくれますよ。かなりメソッド名が冗長だけど。
手で文字列をつなぎ合わせて XML にするよりは断然いいです。
あと、これ以上は Mac 板の iPhone プログラミングスレか
Cocoa スレに行ったほうがいいとおもいます。ここは一応 Obj-C 言語に特化した
過疎スレなので。
NSMutableDictionaryにオブジェクトをつっこむときに NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; Hoge *hoge = [[Hoge alloc] init]; [dic setObject:hoge forKey:@"hoge"]; とやるのと [dic setObject:[[Hoge alloc] init] forKey:@"hoge"]; とでは、後者はメモリリークするのでしょうか?
何処が違うのかさっぱりわからん
>[dic setObject:[[Hoge alloc] init] forKey:@"hoge"]; て書いたら、 setObject:に渡したHogeインスタンスを後でreleaseする手段が無くなるのでは 上の書き方なら [hoge release]て書けるけど。
>>98 なあにobjectForKey:@"hoge"で取り出してreleaseすればいいさ
[dic setObject:[[[Hoge alloc] init] autorelease] forKey:@"hoge"]; じゃないとだめ
101 :
デフォルトの名無しさん :2009/06/10(水) 16:29:35
改行したいときって何を書けばいいんでしょうか? \nでも\rでもダメだったんですが。
(option + ¥) n
>>104 今の仕様って何?
GCのこと?だとしたらGCは仕様じゃなくてオプションだと思うんだが
>>105 どっちにしてもコレクションに入れたものを
objectForkeyで取り出して開放してもリークするだろ
>>106 意味が分からん、説明して
#import "Hoge.h"
@implementation Hoge
- (void) dealloc
{
NSLog(@"hoge dealloc");
[super dealloc];
}
@end
#import "AppController.h"
#import "Hoge.h"
@implementation AppController
- (void)awakeFromNib {
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:[[Hoge alloc] init] forKey:@"hoge"];
Hoge *hoge = [dict objectForKey:@"hoge"];
[hoge release];
NSLog(@"%d", [hoge retainCount]);
// [dict removeObjectForKey:@"hoge"];
[dict release];
}
@end
これでログ出した時点でhogeのretainCountは1でMutableDictionaryに保持されてるだけの状態。
辞書から取り除くか辞書を解放すればHogeはちゃんとdeallocされるんだけど、どこが違うんだ?
なんならHoge取り出さずに - (void)awakeFromNib { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setObject:[[Hoge alloc] init] forKey:@"hoge"]; [[dict objectForKey:@"hoge"] release]; NSLog(@"%d", [[dict objectForKey:@"hoge"] retainCount]); [dict release]; } これでもちゃんとdeallocされるけど?
ふーん
あーそうかい俺が悪かったよ 謝ればいいんだろゴラぁ
謝ってないんだけど
Cocoaが分からないけど興味があるだけの俺みたいなのもいる訳だが、
結局のところ
>>107 ,108が仕様として正しいということでFAですか?
それ以前に作法として完全に間違っているので気にする必要はありません。
>>99 はネタ。
そもそもNSMutableDictionaryって非推奨のAPIだろ NSMutableDictionaryに入れるとメモリリークするし
>>115 んなわけねーだろ。retain count を勉強し直してこい。
2chで調べ物をしたい時は「教えてください」って書いても
なかなか教えてもらえない。
そういう時は、知ったかぶり風に間違ったことを自信満々に書く。
そうすると、ものすごい勢いでツッコミを入れてもらえる。
コピペ新聞 - 調べ物のコツ
http://copipe.info/archives/9084 ということですか。
>>114 いやネタっつうか、できるできないで言うならできるという意味で書いた
そりゃ普通こんな書き方はしないけど
retain/releaseはObjective-Cと関係ないけどなんでここでやってんの? Cocoaスレでやれば良いのに。
OpenStepで規定されてるしここでいいんでねいの。
正しい書き方は一体どれなの?
そういう大事なことはこんなところで断片的な情報をかき集めるより書籍かなにかで
体系だった解説をきちんと読むべきだと思う。
Cocoa周りはアップルが出しているリファレンスがしっかりしてるから
>>91 の
リンク先でも読むといいよ。
ぶっちゃけOpenStep系以外のObjCフレームワークだってほとんどretain/release採用してるでしょ
ここで出てるような単純なサンプルならいいけど、 一般にはオブジェクトを入れてから取り出すまでに、別スレッドからdictionaryをいじられて、別のオブジェクトをreleaseしてしまう可能性がある。 まあ作法として避けておくのが無難。
あんなコード書いてたらどうしようもない馬鹿だと思われることは確実。
>>126 すまん、初心者でよくわからんのだが、
>>96 のやり方だと何がまずいのか教えてくれ。
>96 のその部分だけ見れは、前者だろうが後者だろうがメモリリークする 実は前者はこの後のコードでリリースしてます、とか オーナーシップとかしらね、後でリリースできれば良いんだよ、 とかって言い出さない限り。
autoreleaseされたインスタンスを返すfactory methodを作るのが普通の感覚でしょ。 そこに思い至らない時点で実力は推して知るべしだから、GC使うかリークなんて 気にしなくて良いよ。リークが問題になる規模の物はどうせ作れないし、多分他にも 問題山積で誰も気が付かない。
OS3.0のiPhoneでも autoreleaseは果てしなく遅いぞ
iPhoneでGCって性能的にやっぱ厳しいのかな
OS X でも GC は案外リソース喰う気がします Core Data で GC つかったフリーウェアつくってますが、使っていると 時々 CPU 使用率があがるのは何故かと問い合わせがあって、 しらべてみたら GC がかなり頑張ってるように見えました。
133 :
デフォルトの名無しさん :2009/06/17(水) 19:24:12
>>134 Runtime Referenceがあることを知りませんでした…
ありがとうございます。
OS3.0だとNSOperationQueueにaddしたOperationが2つしか実行されなくなるんだけど実装方法変わったのかな?
setterが失敗したときって、どういう処理をすべきでしょうか? 1. setterの返り値をBOOLにしてNOを返す。 2. objective-c例外を投げる。 1はsetterの返り値がvoid以外になると、KVCとかでおかしなことにならないか心配。 2は、c++の例外とのすみわけがややこしいので、できればobjective-cの例外は使いたくない。 どうしたもんでしょう。 ライブラリとしては、c++は使わないと割り切ってobjective-cの例外使うべきなのか…
setterが失敗って? 予期しないオブジェクトが渡されたって事ならObjCの例外を投げるのが普通。
あとはデリゲートで処理とか?(それも含めてならごめん)
3. 何もしない 本当に値がセットされてるかどうか知りたかったら getして比較しろや! 4. exit(3)をコール 気に食わなければ黙って帰る 5. abort(3)をコール そんな話聞いてないです!
これじゃだめ? - (void)setHogeHoge:(Hoge *)aHoge error:(NSError **)error;
>>141 KVCしたいってことだからそれじゃ駄目じゃね?
>>137 1.で問題ないんじゃない?Obj-Cのメッソドディスパッチはそんなにヤワじゃないよ。
ええかげんなこと書くな。 NSKeyValueCoding Protocol Reference - (BOOL)validateValue:(id *)ioValue forKey:(NSString *)key error:(NSError **)outError おまいらまぬある嫁。
それだとKVCのときだけしか通用しないよね
KVCはNSKeyValueCodingプロトコルですでに定義されてるんだから、 BOOL返したいんなら同等の別のメソッドとして定義すればいいだけじゃん。 KVC準拠のsetterなら戻り値はvoid。 なんとかしたいなら単に例外投げればいい。
146 :
137 :2009/06/27(土) 22:24:24
>>146 Cocoa API 自体が予期せぬ引数を与えられた場合は
頻繁に Obj-C 例外投げるので、
別に自分が投げても大勢に変化ないと思いますが...
148 :
デフォルトの名無しさん :2009/06/28(日) 15:06:59
ちょっとイニシャライザに関して、質問よろしいですか。
http://wisdom.sakura.ne.jp/programming/objc/objc7.html ここのページの指定イニシャライザのサンプルプログラムなんですが
id pt1 = [Point new];
id pt2 = [[Point alloc] initWithPoint:400 int:300];
メイン関数(メソッド)で、pt2にオブジェクトをセットする際に
initが走ってないように思うんですがこれでいいもんなんですか?
[[クラス名 alloc] init]のセットで覚えてきたので、initしなくて
いいのかなっていう疑問なんですが。
※pt1はinitのオーバーライドで[super init]が走ってるからいいとして。
init自体がよく分かってないから、こういう質問してしまってるのかもしれ
ないですが、この方法は正しいのか誤ってるのか、また正しい場合は何故な
のかご教授下さい。
init〜ではじまるメッセージは内部でinitを呼んでるはずだから大丈夫。
え?逆じゃね? NSObject +newは、内部的に[[NSObject alloc] init]と等価。 指定Initializerは他のinitから呼ばれる基本部分を含んだ、共用部分。 この例では、 [Point new] [Point alloc] init] はどちらも、内部的にinitWithPointを呼んでいるということ。 もちろん引数は初期値を使っている。この場合は0だろうね。
>>150 >>148 はpt2の初期化のことを聞いてるんじゃね?
ちなみに
>>148 のコードをXcode 3.1.3(gcc 4.0.1)で試したところ、正しく動作した(ただしそのままだとコンパイルも通らないので、本質的でないところは改変した)。
ただ、このサンプルコードはPointのインスタンス変数を読んでprintfしているだけだから上手く動いたのかもしれん。
[super init]がないことに関しては、
>>149 の言うとおりなのかもしれんが、そうだとするとメソッド呼び出しが循環するし、そうでないとするとObject部分が初期化されていないということになるから、あまり良い実装ではない気がする。
152 :
デフォルトの名無しさん :2009/06/28(日) 21:07:22
148です。
>>149 様,
>>150 様,
>>151 様ご回答ありがとうございます。
結局はpt2ではinitを明示していないので疑問に思ったのです。
>>149 様が仰っているように、メソッド名にinit〜をつければinitWithPointで
initが自動的に走る、という考えなら納得いきます。
ただ、詳解Objective-C2.0では、サンプルコードのinitWithMinという
メソッド内で[super init]と明示しているので、メソッド名に
init〜を付けただけではinitが走らないとも判断できます。
まあ・・・[クラス名 alloc] init] の形で覚えておけば問題ない所だと
思うのですが。
>>148 のコードは駄目だな。普通はこうだろう。
- (id) init {
return [self initWithPoint:0 int:0];
}
- (id) initWithPoint:(int)x int:(int)y {
if ((self = [super init])) {
self->x = x;
self->y = y;
}
return self;
}
154 :
150 :2009/06/28(日) 23:08:13
ああ理解した。 リンク先のコード見てなかったが、ひどいコードだったのね。
155 :
デフォルトの名無しさん :2009/06/28(日) 23:42:37
148です。
>>153 様、レスありがとうございます。
やっぱり
>>153 様のように[super init]で初期化して判定させた方がいいです
よね。ありがとうございました。
156 :
デフォルトの名無しさん :2009/06/28(日) 23:58:33
>>153 > - (id) initWithPoint:(int)x int:(int)y {
> self->x = x;
> self->y = y;
これってどうなの?
銅ではありません。
160 :
150 :2009/06/29(月) 07:49:54
インスタンス変数なんだよね? 意味府。
148です。やはり、元の情報が古いように感じますね(後に他のページも参照 してみた感想です)。 詳解Objective-C2.0が難しすぎたんで、上記のサイトを参考にしていたんで すが、誤字脱字が多く、たまにコーディングミスもあったりしてかえって混 乱してしまった、というのが素直な感想です。 余談ですがObjective-cってなんか楽しいですね。感覚的に、ですが。。。
ヒレガス本の最新版の和訳は、たのみこむあたりに持ち込むしかないのだろうか…
またまた148です。
>>162 様、書籍紹介どうもです。
ヒレガス本調べてみましたが、かなり評判いいみたいですね。
英語は得意ではないですが、読むこと事態に嫌悪感は無いので是非購入してみ
たいと思います。・・・まあ少々お高いのでまた来月にでも。
教えて頂いたサイトも参考にさせて頂きます。さらっと読んでみましたが図が
あって理解し易いですね!
また勉強して戻ってきたいと思います。できればアドバイスする側で!
貴重なお時間を割いて頂き、皆様には感謝致します。
>>164 2ページに1枚はスクリーンショットがあるレベルだ。安心していい。
ナイトライダーについてWiki辺りで調べておくとなおいい。
>>165 いや、日本人でもナイトライダーしってるだろ...
いまどきの若者はそうでもない?
はい、マイケル
>> 164 Safari Books Onlineで立ち読みしてみたら?
169 :
デフォルトの名無しさん :2009/07/02(木) 21:27:59
fscanfを使いたいのですが、どうしたらいいですか?
そのまま使えば良いんじゃない?
Objective-Cは2次元配列を扱えない糞言語である。
CとC++は?
int x = 20, y = 50; foo[x][y]; 何が不満なの?
放っとけ。
int hoge[10][10] こいつをキャストする時って int(*)[10] get()とかでよかったんだっけ? C99の仕様と同じ?
malloc系使わずに int x = 20, y = 50; int hoge[y][x]; ってできる?
>>179 Cocoa を Obj-C で組んでいると block が非常に欲しくなるのは事実なのだが、
C レベルで言語仕様を追加するのはいかがなものかという気もしないでもない
いつかObjective-C++0xも作られるのかね
なんで? いつかって0xということは今年中なわけだけど そんな情報入ってないぞ
ていうかObjC++ってObjCを普段CとしてコンパイルしてるところをC++としてコンパイルしてるだけだから gccがC++0xに対応すればその瞬間にObjC内でもC++0xが使えるわけだが
Objective-CってQueueクラスってないですよね なんでですか?
NSMutableArrayでまかなうから。 あんま好きじゃないけど
>>186 それは性能が激遅になってありえないですね
STLの50分の1しか性能ないのにありえないじゃないですか?
>>185 Foundationのコレクションて、アプリケーションドメインで必要なものじゃなくて、
APIとのデータ交換に必要なものでしょ。
アプリ内でパフォーマンスを稼ぎたいなら、stlでもboostでも使えばいい。
データ交換には、タプル、配列、ハッシュの三種があれば十分。
189 :
150 :2009/07/29(水) 23:21:15
自分はCFMutableArrayに構造体のポインタぶちこむだけで 普通に満足なんだけど、STLってそんなに早い? CFで固めると、void*埋め込めるしオブジェクトのretain/release すっとばせるし、楽だと思うんだけど。
間違えた NSMutableStringを継承したクラスを作りたいのですが その中で、initWithString:を継承先のクラスに適合させるには どうやってラップすればいいれしょうか
{ if(self=[super initWithString:string]){} return self; }
NSMutableArrayなどのコンテナクラスに オブジェクトを突っ込んだ後 それを取り出すときに、どうやって型判別するのですか? たとえばインターフェイスA、B、C、Dのインスタンスをいくつか 追加しているとの想定時、とどのように判断するのがObj-Cだと一般的なのでしょうか?
isKindOfClass:とか?
>>194 突っ込むインターフェースが増えた場合に、判定する箇所も増えるため、
バグを生みやすくなる(判定箇所の修正忘れ等)
Obj-Cに限らず、コンテナには、同一クラス、または親(先祖)が同一のクラスに制限しておく方が安全と思われます。
どうしても異なるクラス、親、先祖を入れたいのであれば、
全てのクラスにプロトコルを採用し、共通の操作を行える様にするのが落としどころではないでしょうか?
>>194 そのAPIを単純に1億回実行してみたのですが
全然終わる気がしませんでした。たぶん普通の
用途では使えないと思います。
>>195 なるほど勉強になります。
A、B、Cの祖先をRとして
@interface R : NSObject
...
@end
@interface A : R
...
@end
として操作するのはまぁいいのですが、例えば
入れ子になる。つまりCなんかがNSArrayなどの
サブクラスをインスタンスに持ち、再帰的に呼び出す
場合、どのように扱うのが一般的なのでしょうか。
@interface C : R
{
NSMutableArray *array;
...
}
...
@end
一億回呼ぶのが普通という基準がよくわからん
チェックが上手くできず無限ループに入ったって言いたいとか?
>>193 を読んで初心者だと思い安易な回答をしてしまった俺が悪かったよ
>>196 Objective-C に限らない話だとおもうが、
コレクションから A, B, C を取り出すループを書いて、 (全部 R のサブクラス)
そのなかであからさまに C の場合だけ違う処理をさせるというのは
良くないです。
コレクションから取り出すループ内で
クラスが C の場合だけ再帰的にしたい、というのは、
カプセル化に反します。
isKindOfClass: とか、
C++ なら dynamic_cast は最後の手段なので、
使いたくなったら反省すべきです。
ループ内ですべき仕事は R のメソッドにしておいて、
for(R* r in array){
[r doSomething];
}
として、C での doSomething の実装内で NSMutableArray*array の内部の
操作をするのがよい。
>>196 再帰的なら、こういう事?
@interface A:R {…} @end
@interface C:R { NSArray *arrayC; }
- (NSArray *) anUniqueSelector; // セレクタ名を共通に。再帰探索対象を返す
@end
@interface D:NSObject { NSArray *arrayD; }
- (NSArray *) anUniqueSelector; // 必要なら、Rの子クラスチェックも可能
@end
@implementation NSArray (recursive)
- (id) recursiveOp {
for (id obj in self) {
if ([obj respondToSelector: @selector(anUniqueSeleclor)])
[self recursiveOp: [obj anUniqueSelector]]; //注:相互参照で無限ループ
else if ([obj isKindOfClass:[R class]]) {…}
…
}
>>200 Obj-C触り始めて間もないのかな?isKindOfClass: は全く、全然、断じて、1_も、
最後の手段ではない。むしろ型判定の、最初の手段といっても過言ではない。
NSString などのクラスクラスタは、isMemberOfClass: では正しく判定できない。
NSString *hoge = @"~/Documents";
NSString *piyo = [hoge stringByExpandingTildeInPath];
[hoge isMemberOfClass:[NSString class]]; // NO, hoge: NSCFString class
[hoge isKindOfClass:[NSString class]]; // YES
[piyo isKindOfClass:[hoge class]]; // NO, piyo: NSPathStore2 class
KVO では、-(Class) class さえ監視状態によって入れ替えるんだし。
Obj-Cにおいて、isKindOfClass: respondToSelector: object_getClass() 、
何を使おうとも、「正しい」型判定は現状で不可能。NSArray/MutableArray
などは、実際に要素を追加/削除して例外発生させない限り、判定できない。
この場合は型判定を使うのが間違いだといってんだろうよ
呼び出す側で判定して分岐するより、呼び出される側に共通のプロトコルを採用してポリモーフィズム
型判定が最後の手段だというのは極端かもしれないけど、
それにべったり依存して型判定だらけになったプログラムも
オブジェクト指向らしくないと思う。
まずは
>>200 ,204のアプローチで設計し、
どうしようもない時だけ型判定で逃げるのが正道では。
>>202 >Obj-C触り始めて間もないのかな?isKindOfClass: は全く、全然、断じて、1_も、
>最後の手段ではない。むしろ型判定の、最初の手段といっても過言ではない。
ObjC的なオブジェクト指向の思想ではrespondsToSelector:使うのが自然のように思える。
208 :
196 :2009/08/01(土) 13:22:20
>>200 では、基底クラスを設けないで@protocolで
doSomthingを定義し、それを実行するのは
Obj-C的にはどうでしょうか?
>>201 そのようなコードを書いて、これ気持ち悪いコードだと思ったので
ここで質問させてもらいました。
>>207 respondsToSelectorって頻繁に呼び出してもいいものでしょうか?
例えばRSSを解析するなどの用途で何度も何度も呼び出すと
いいのだろうかと疑問に思うのですが
>>208 なんで RSS 処理で respondsToSelector とかの高等手段が必要なのか
わからないんですが、どういう処理を書こうとしてるのか教えてください。
あと、respondsToSelector を頻繁に呼び出して良いか、ですが、
人によって「頻繁」の定義が違うので難しいです。
あなたのばあいは一億回とか平然と言うひとなので
頻繁に呼び出しちゃだめです。
最近はパソコン速いので100回や1000回ぐらいどうってことないです。
あと、スピードが気になったら Instrument 等でスピードを実測して、
プログラムのどこの部分で実際に時間がかかっているかチェックしましょう。
自分の勝手な思い込みで、実際には時間がかかってないところを
最適化してもしかたがないので。
>では、基底クラスを設けないで@protocolで >doSomthingを定義し、それを実行するのは >Obj-C的にはどうでしょうか? 別に基底クラスをつくるのと変わらないです。 R* x のかわりに id<R> x になるだけです。
Tiger環境なんだけどインタフェースビルダーが旧式だと知って絶望した… 豹買ってもいいけどもうすぐ雪豹でるし… でもそうしたら休暇が終わっちまう!
情報の豊富な彪で覚えるまで雪豹は暫く放置で良いじゃん。
Objective-Cって継承でmethodをoverrideしたあとに更にそれを継承してもう一回overrideした場合、superで呼び出すと最終override以外のすべてが呼び出されるもんなの? sample #import <Foundation/NSObject.h> #import <stdio.h> @interface A: NSObject - (void)method1; - (void)method2; @end @implementation A - (void)method1 { printf("method1 of Class A\n"); } - (void)method2 { printf("method2 of Class A\n"); } @end @interface B: A - (void)method2; @end @implementation B - (void)method2 { printf("method2 of Class B\n"); printf("self --> "); [self method1]; printf("super--> "); [super method2]; } @end
@interface C: B - (void)method1; - (void)method2; @end @implementation C - (void)method1 { printf("method1 of Class C\n"); } - (void)method2 { printf("method2 of Class C\n"); printf("self --> "); [self method1]; printf("super--> "); [super method2]; } @end int main(void) { id x = [[B alloc] init]; id y = [[C alloc] init]; printf("--- instance of B ---\n"); [x method1]; [x method2]; printf("--- instance of C ---\n"); [y method1]; [y method2]; return 0; }
結果 --- 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
あ、勘違いしていました。 CのsuperであるBのmethod2で更にsuperであるAを呼び出していました。 継承でoverrideを繰り返してもsuperで呼び出せるのはその一つ前でいいんですよね。
>>213 本題と関係ないが、
#import <Foundation/NSObject.h>
とわざわざ細かく指定するとかえってコンパイルが遅くなりかねないよ。
プリコンパイルドヘッダが使えなくなるので。
#import <Foundation/Foundation.h>
にしておきましょう。
あと printf じゃなくて NSLog(@"hogehoge") をつかうのが一般的じゃないかな。
>>218 萩原Obj-C(1.0のやつ)をはじめたばかりで、本のサンプルみながらやっているもので。
NSLogは索引をみると後半で出てきますが、まだそこまで到達していないです。(今Ch04あたり)
本当は今ならObj-C 2.0をやるべきなのでしょうけれど、実行環境がまだTigerなので1.0でないとたぶん本のサンプルが動かないと思うので1.0の本を使っています。
>>219 なるほど。まあ日進月歩の世界で本はすぐに古くなるけど、がんばってね!
221 :
sage :2009/08/16(日) 08:09:19
>>218 シンプルにコンソールに出力するならprintfでいいと思うけど。
GUIなアプリケーションの動作ログという意味なら、NSLogだが。
正直どっちでもいいけど、 %@ を後々使うかも、と考えると 最初からNSLogにしておいた方がいいかなって思う。
時間がコンソールに出力されるのが邪魔な時はprintfだけど、大体はNSLogかな
Obj-Cとは直接関係はないかもしれないけれど、 荻原本1.0で関数やメッセージ送信の実行速度を求めるサンプルプログラムで 出て来るターミナルのtimeコマンドの結果が違うので教えてください。 荻原本ではtimeコマンドを実行すると 0.990u 0.040s 0:01.04 99% 0+0k 0+1io 0pf+0w というふうにかえって来て、0.990uがCPUの時間らしいのですが、 実際にTiger(10.4.11)で実行すると real 0m0.055s user 0m0.028s sys 0m0.008s と、かえって来てしまい、どれがCPU時間か分かりません。
u=user s=sys
つまり見やすくなったんだね
>>225 thx
これで実行時間の比較が出来ます。
228 :
デフォルトの名無しさん :2009/08/27(木) 12:18:22
クラス変数のような振る舞い試してるのですが static NSString *value = [NSString stringWithString:@"hoge"]; @interface A2 : NSObject + (void) value: (NSString *) val; - (void) printMessage; @end valueの宣言のところで error: initializer element is not constant というエラーが出ます。 static NSString *value = @"hoge"; static int value = 1; この二つは期待通り動きました。 staicな変数の初期化って定数?じゃないとできないとかですか?全インスタンスに共通なオブジェクトを持たせるにはどうすればいいのでしょうか?
Cでは定数じゃないと初期化できないはず。 最初に使うときに初期化すりゃいいんじゃね?
クラス変数をその方法で持たせることは出来る。 このクラス変数はnullで初期化しておいて、 最初のインスタンス生成(init)のときにnullかどうかみて 初期化するのが普通かな。
231 :
228 :2009/08/27(木) 12:37:36
いろいろいじってて違うのペーストしたみたいです。初期化のところは static NSString *value = [[NSString alloc] init]; でした。 すいません。お願いします
232 :
228 :2009/08/27(木) 12:39:27
>>229 ,230
あ、そうか
initilizeでしたっけ?あれで初期化すればいいんですね
ありがとうございます
+initializeな。
234 :
デフォルトの名無しさん :2009/09/02(水) 17:44:00
あるクラスのメッセージの中で(strはメンバ変数) - (void) doSomethig{ NSLog(@"count %d", [str retainCount]); [str release]; NSLog(@"count %d", [str retainCount] ); } 最初のログで2だと二番目で1になるのは問題ないのですが最初で1の時に2番目でもメッセージが送れて1が帰るのですがどうしてでしょうか?retainCountが1のオブジェクトにreleaseを送信後メッセージを送るとランタイムエラーになるんじゃなかったでしたっけ?
retainCount の値なんか気にしているやつはアホです
236 :
234 :2009/09/02(水) 18:00:27
すいません、上と同じことだと思うのですが int main(){ NSObject *obj = [[NSMutableString alloc] init]; NSLog(@"count = %d", [obj retainCount]); [obj retain]; NSLog(@"count = %d", [obj retainCount]); [obj release]; NSLog(@"count = %d", [obj retainCount]); [obj release]; NSLog(@"count = %d", [obj retainCount]); return 0; } これも0にならないですね。NSObjectにすると0になって最後のログでエラーが出ます。これはどうしてでしょうか?お願いします。
プールはどこにある
238 :
234 :2009/09/02(水) 19:04:07
>>237 ありがとうございます。
プール?
retainCountはNSObjectのメンバ変数で
allocでインスタンス作った時は関係ないんですよね?
つまり自分自身にどれだけ参照されてるかの数を持っていて
releaseが呼ばれて0になったときdeallocが呼ばれると。
プールが関係あるのはautoreleaseを自分でした時とそれを呼び出してるような
コンストラクタを呼び出したときですよね?
もしかしてなんか間違って勉強進めてます?
dealloc された object (のアドレス)に retainCount を送ったところで、 まともな結果が戻ってるわけがない。 > retainCountが1のオブジェクトにreleaseを送信後メッセージを送るとランタイムエラーになるんじゃなかったでしたっけ? そんな仕様はない。
>>236 最後のNSLogで存在しない(解放済み)オブジェクトにメッセージを送っているからエラーが出る。
retainCountなんてメンバ変数は存在しないし NSMutableStringはtoll free bridgeになってるから実体はCFMutableStringでしょ。
242 :
234 :2009/09/02(水) 21:22:08
>>239 236をNSObjectでやると
objc[2322]: FREED(id): message retainCount sent to freed object=0x103460
Illegal instruction
というエラーがおきます。NSMutableStringでやるとobjectがないはずのところで1が返ります。これは特に決まった動き(NSMutableStringだからとか)ではなく何がおこるかわからないということなんでしょうか?
>>240 質問がおかしかったですね。すいません。エラーが起きないのはなんででしょうか?と聞きたかったのです。
>>241 retainCountはメソッドでしたね。たしか_rcとかいうメンバだったような。
「NSMutableStringはtoll free bridgeになってるから実体はCFMutableString」というのはわかるのですが、ないはずのobjectにメッセージが送れてしまうのかとおもったのです。
MacsBugみたいなアセンブリレベルでできるデバッガってしらない? 実行中のコードをデバッグできるやつ。
TMON
TMONが見つからない。 どこにいけばある?
遠い昔・・・
そんな 少年の日の心の中にいた青春の幻影 では困るのだけど。
>>242 [[クラス alloc] init] の結果は retain count が 1 であるとは決まってません。
既に存在するオブジェクトが使い回されることもよくあります。
[NSNumber alloc] initWithInt:1] を何回も呼んで NSNumber をつくったとして、
毎回違うオブジェクトを作る必要は全くないでしょ?
だから二回目以降は単にすでにある object をどっかからとってきて、
単に retain して返しているだけかもしれません。
NSString の場合は理由が違って、alloc] init] の段階では
class cluster の中のどのクラスが実際に使われるかきまってないので、
NSPlaceholderString というのの唯一のインスタンスが使い回されてるんです。
とにかくそんなことを気にせずに、retain / release をきちんとしていたら
問題はないようになってます。
250 :
242 :2009/09/05(土) 21:30:20
>>249 レスありがとうございます
クラスクラスターまでまだ行ってないのですが、NSStringの説明でその言葉は見たことがあったので、なんかそれが関係してるのかな、と思ってました。
とりあえず、先へ進もうと思います。
251 :
196 :2009/09/06(日) 22:10:26
Obj-Cって 継承階層増えるだけでどれくらい オーバーヘッドあるのですか?
2cmくらい。
それはひょっとしてギャグで言ってるのか
>>242 >質問がおかしかったですね。すいません。エラーが起きないのはなんででしょうか?と聞きたかったのです。
とても基本的なことなので覚えておくべきなのですが、
C、 C++、 Objective-C などの言語では解放済みのメモリ領域や
オブジェクトに対する操作の結果は決められていません。
そもそも「エラーが起きる」という決まりがないのです。
(処理系によってはデバッグ用のライブラリでは解放後のメモリを
変な数値で埋めるなどして、解放済みのオブジェクトへの操作で
エラーが出やすいようにしてくれるような機能もあります)
257 :
デフォルトの名無しさん :2009/09/10(木) 12:56:51
わけあってCとObjCの混在したプログラムを書いているのですが @interface CHoge : NSObject{ void (*_ptr)(); } // _ptrのアクセサを書きたい @end このインスタンス変数を読み書きするためのアクセサをどうやって書けばよいかわかりません。 わかる方教えていただけますでしょうか?
- (void)_ptr{ //関数取得 return (*_ptr)(); } - (void)set_ptr:(void)(*hoge)() //関数セット { void _ptr = hoge } じゃ駄目なの?
ごめん、最後のvoidいらないや。
>>257 @interface CHoge : NSObject{ void (*_ptr)(); }
@property (nonatmic, assign) void (*ptr)();
@end
と宣言しといて, @synthesize ptr=_ptr; で生成してもらうか、
- (void (*)())ptr {
return _ptr;
}
- (void)setPtr:(void(*)())ptr {
_ptr = ptr;
}
などと自前で書く。
萩原1.0のコードを本見てコメントまで正確に打ち込んでいたら warning: multi-line comment に嵌った・・・ 能で改行するなよぅ。
知らんがな
charからNSStringに簡単に変換する方法はないでしょうか?
264 :
デフォルトの名無しさん :2009/09/12(土) 01:02:59
すみません。情報が少なすぎました。 char buf[1024]; で用意したバッファにreadで文字を読み込みます。 その後、NSStringのプロパティを持つやつに label.text = @"buf"; のように受け取った文字をNSStringに変換して代入したいと考えてます。 今のところ、 NSString *str = [[NSString alloc] initWithUTF8String:szStr]; label.text = str; [str release]; のようにやっているのですが、2回目以降はうまく代入できません。
「うまく代入できません」 ↑ダメな質問の例
267 :
264 :2009/09/12(土) 03:11:05
すみません、根本的に何かが違ったようです。 出直してきます。。。
デバッガの使い方ってアップルからドキュメント出てますか?
>>268 >デバッガの使い方ってアップルからドキュメント出てますか?
Xcodexのドキュメントに乗ってないか? どこにでもあるようなデバッガ
だから、マニュアルなしでも使えるぞ。
270 :
デフォルトの名無しさん :2009/09/15(火) 01:26:27
>>264 label.text = str;
のあとにstr releaseすると、label.textもreleaseされちゃわないか?
プロパティのsetter semanticsがassign(デフォルト)だとそうなんのかね?
NSString をプロパティにするときは copy にしなきゃダメだろ、常識的に考えて。
どういう常識?
NSMutableString が渡されたときに外部で書き換えられたらこまるから、GC使ってるときでもcopyにしておいたほうがいい、場合もあるかもしんない。
NSArrayだとどうするんだろう? 自力DeepCopy?
そこは状況に応じてだろJK 参照を保持させたいのか、それともインスタンスを複製して保持させたいのか、だろ?
277 :
275 :2009/09/15(火) 18:31:34
>>264 get、setメソッドを使わないと、=だとオブジェクトの参照が
代入されるだけだからなぁ。
そりゃ、[str release];は実質、[label.text release];と同じになるだろうな
280 :
デフォルトの名無しさん :2009/09/15(火) 20:53:02
Cocoaのautorelease poolの解放タイミングがいまいちわからない それとも、もうGC導入されて、あんま使ってない?
>>280 自分で明示的にpool作ってないんならイベントループ終了時にそのループ内でのプールが解放される
282 :
デフォルトの名無しさん :2009/09/15(火) 22:49:35
>>281 そう!まさに、そのイベントループとやらがようわからんのです。。。
>>279 >get、setメソッドを使わないと、=だとオブジェクトの参照が
>代入されるだけだからなぁ。
昔はそうだったっけ
>>284 Objective-C 2.0 以降しか知らないけど、
obj.prop = hoge は [obj setProp:hoge] と同義。
>>285 へー、そうなんだ。
勉強になった。
ただ、知らないと、逆に参照渡ししたいときとかハマったりしそう。。
それとも、プロパティの時に限って、=がアクセッサメソッド呼び出し
で実装してくれるのかな?
プロパティでドット構文使った時だけだよ てかなんでみんなCocoaスレでやらないのw
@selector(func_name)って、Cでいう関数ポインタと同じようなもん? (これもCocoaスレでやる話?w)
>>286 いやいやそうじゃなくて、そもそもクラスCにインスタンス変数x があったときに
C* c=...
c.x=
は(xがプロパティでなければ)文法エラーだから。cはポインタだから、やるにしても
c->x=
でしょ。曖昧さはないです。
>>289 なるほど。
確かにObjective-Cのクラスのメンバにはc.xみたいにはアクセス
できないよねprivateメンバじゃなくても
c->xになる。
で、ごめん、質問なんだけど、プロパティって何だっけ?w
>>288 C でいう関数ポインタは特定の関数の実装を直接指示するでそ(実体はアドレスだし)。
C++ のメンバ関数ポインタは、特定のクラス(とその派生クラス)のオブジェクトの仮想あるいは
そうでない関数を間接的にあるいは直接に指示するでそ(実体はvtbl上のオフセットまたはアドレス)。
Objective-C のセレクタは、どのようなクラスあるいはインスタンスのメソッドでも名前で指示する
ことができる(実体は文字列)。
>>291 ggrksって感じですまんかった。
んで、プロパティって、つまりはメンバ変数のことだとおもうけど、
そうするとc.xのようにドットで表すのは間違いじゃねって思ったんだけど
それは間違い?
>>289 が納得できない
まちがい。
>>294 Obj-CのプロパティはC++のメンバ変数じゃないから . で表しても全く問題ない。
最近の言語では当たり前の糖衣構文。C# も同様のシンタックスシュガーを持つ。
とはいえ、foo の bar プロパティが構造体だったとき、foo.bar.baz = 100 で
foo.bar.baz が 100 にならないのはみっともないのは確か。
>>296 始めたばかりの頃コレでハマったのはいい思い出。
298 :
デフォルトの名無しさん :2009/09/17(木) 02:58:22
質問です。 NSDate *now = [NSDate date]; self.lbl.text = [now descriptionWithCalendarFormat:@"%H:%M:%S" timeZone:nil locale:nil]; で、時間を表示させているのですが、この2行目の部分で warning: 'NSDate' may not respond to '-descriptionWithCalendarFormat:timeZone:locale:' (Messages without a matching method signature will be assumed to return 'id' and accept '...' as arguments.) という警告が出るのですが、これはどういう事なのでしょうか?
iPhoneでは-descriptionWithCalendarFormat:timeZone:locale: は梨になった。 NSDateFormatterを使いましょう。Mac側でもやめる気満々なことが書いてあるので できれば移行していった方がよいようだ。
300 :
デフォルトの名無しさん :2009/09/17(木) 10:57:56
>>299 そうでしたか。ありがとうございます!
おかげさまで警告なしでビルドできるようになりました。
またもしかするとiPhoneでは無しになったものかもしれないのですが、 NSHost *host = [NSHost hostWithAddress:@"192.168.0.125"]; の部分で、+hostWithAddreassメソッドが見つからないという警告が出てしまいます。 Mac OSX Reference Libraryを参照しながら作ってるので、見つからないはずはないのですが、 iPhoneで実装するとしたら変わりに何を使えばいのでしょうか・・・。 というか、変わりとなるクラスやメソッドってどうやって調べればいいのでしょうか・・・
alloc] initWithAdress:
>>301 綴りミス?
+hostWithAddre[a]ssメソッドが見つからないという警告が出てしまいます
305 :
デフォルトの名無しさん :2009/09/18(金) 19:03:45
>>304 綴りミスです。ごめんなさい。
プログラムの方はちゃんと書いてあります。
警告あっても、正常に動作はするのですが、警告があるままやるのは気持ち悪いですね・・・
メソッド廃止になったのに使うのは間違い 警告に添え
>>306 で、deprecatedでない代替メソッドはなんなの?
教えてあげないよ!
301≠307ですよ
>>301 CFHostCreateWithName()
311 :
デフォルトの名無しさん :2009/09/19(土) 08:50:39
久しぶりにCocoaで遊んじゃお!!わくわく
連休だもんな!
そうだな! さて、なに作ろうw
連休を有意義に過ごすための予定表アプリを作って連休をつぶすのはどうじゃろか
来年のGW用ですね。
316 :
デフォルトの名無しさん :2009/09/20(日) 22:47:54
NSString *message = [NSString stringWithUTF8String:[messageData bytes]]; NSLog(@"%@", message); [message release]; とある関数の中にこういうコードがあるのですが、 2回目呼び出した時に、メモリ関係のエラーか何かが出てしまいます。 この記述って何か間違ってるのでしょうか?
取り敢えずreleaseすんな。 alloc initWith するか NSLog(@"%@", [NSString stringWithUTF8String:[messageData bytes]]); で
>>317 ありがとうございます。エラーが消えました!
基本的にreleaseするのはallocした時だけって認識持っといていいんですかね・・・
なるほど、ありがとうございます。コンビニエンスコンストラクタは 放っておけば勝手にreleaseされるんですね。
本当に糞面倒な言語だな
基本、Cだからな
言語関係ねえ
324 :
デフォルトの名無しさん :2009/09/23(水) 22:42:16
2009-09-23 22:38:40.195 test[4488:5203] *** _NSAutoreleaseNoPool(): Object 0x101d660 of class NSCFNumber autoreleased with no pool in place - just leaking Stack: (0x305a2e6f 0x30504682 0x2dc4 0x960b0155 0x960b0012) ビルドとデバッグをすると、あるところでこういうメッセージが出るのですが、 これって何か問題が起こっているのでしょうか? その後も特に問題なくアプリは動いているのですが・・・ パッとみた感じだと、NSCFNumberはオートリリースされたってだけで別に問題ない・・・んですかね。。。
325 :
デフォルトの名無しさん :2009/09/23(水) 23:20:20
ちなみに NSNumber *num = [NSNumber numberWithInt:iRet]; NSLog(...); [num release]; こういう場所(NSNumberやNSStringの生成や解放を行う場所)で必ず出てくるっぽいです。
>>324 問題があるので autorelease pool について勉強してください
327 :
デフォルトの名無しさん :2009/09/23(水) 23:30:13
>>326 問題ありですか・・・。
わかりました、ヒントをありがとうございます!
知らない言葉なのでちょっと勉強してきます
328 :
デフォルトの名無しさん :2009/09/23(水) 23:44:52
今度はObjective-Cの質問です!! クラスを作るまでもない関数ってどういう風に宣言すればいいのでしょうか・・・? C言語でいう、ふつうの void swapInt(int a, int b); みたいな感じの関数を作りたいと思ってます。 クラスのメソッドだったら -(void)showMessage:(NSString *)nsstrMsg flag:(BOOL *)flag { ... } みたいな感じで作るのは分かっているのですが・・・。 それとも、Objective-CはC言語のような関数は基本的になくて、それでも使いたい場合は クラスを定義して、クラスメソッドを用意するのが普通なのでしょうか?
329 :
328 :2009/09/23(水) 23:45:36
すみません、誤爆です。
>>328 void swapInt(int a, int b);
じゃだめなの?
331 :
デフォルトの名無しさん :2009/09/24(木) 15:54:11
>>330 今はそのC言語ライクな書き方で対処して正常に動いてるのですが、
なんかObject-Cのソースの中に、Cの記述方法が混ざってるのが気持ち悪くて・・・
その感覚がおかしい。
333 :
デフォルトの名無しさん :2009/09/24(木) 16:13:08
いや、Objective-Cの書き方自体も気持ち悪いんだけど、 その書き方で書くならその書き方でソースコードを統一した方が気持ちいいんだもん・・・
Objective-Cは言語じゃなくて、C言語のライブラリと、それを使いやすくするためのプリプロセッサだと考えるべき。
そんなに気持ち悪いならソースファイル自体をわければいいじゃんか。
どうしてもというのなら。 @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]; あなた以外誰も得しませんが。
>>333 他人のObjCコード一度読んでみるといいよ
みんな平気で使ってるから
気持ち悪さで言うなら "nsstrMsg" の方がよっぽど気持ち悪いがな。
>>338 NSApplicationMain()を実行するとイベントループという名の無限ループが開始される。
各アプリケーションにはイベントキューというキューがある。
イベントループの最初にNSAutoreleasePoolオブジェクトが確保される。
イベントループはイベントキューにイベントがはいってくるまで寝る。
Mac OS Xはイベントが発生すると該当アプリケーションのイベントキューにイベントを放り込む。
またはアプリケーションが自分のイベントキューにイベントを放り込む。
イベントキューにイベントが入るとイベントループは目を覚ます。
アプリケーションはイベントに応じて動作を起こす。
確保されたNSAutoreleasePoolオブジェクトが解放される。
始めの当たりに戻る。
アプリケーションを終了するとなんとexit(3)を呼び無限ループを吹っ飛ばす!!
余分な情報も混ぜてみました。必要な所だけお読みください。
>>338 イベントループ内での autorelease pool は NSPortDelegate の handlePortMessage:
呼び出し前に autorelease pool が作られ、呼び出し後に drain される、と思えばok。
(メインスレッドではこれを勝手にやってくれているのであまり気にしなくてよい)
NSThread 等でワーカスレッドを立ち上げただけでは作ってくれないので、そのときは
ちゃんと自前で作ってやらないとautorelease されるインスタンスが登場する処理
(明示的に使うもの、内部処理で使うもの、のいずれも)が
>>324 の様にエラーになる。
NSThread NSAutoreleasePool でググればたぶん誰かが何か書いてると思う
御指名の 326 じゃないので嫌なら無視してくれ
342 :
338 :2009/09/24(木) 22:45:40
>>340 すばらしい。。。
いままで、いろんな人に訊いてきたけど、ここまで明快に
わかりやすく答えてくれた方はいませんでした。
これで、安心して[obj autorelease];を使えます。
どうもありがとうございました。
343 :
338 :2009/09/24(木) 22:50:07
>>341 おお、更なる詳しい説明!
しかしながら、
>>340 さんの説明までは理解できましたが、
>>341 さんの説明は自分の知識不足でちょっと難解です。。。
はぁ。。
せいぜいがんばります。
どうもありがとうございます。
MOSAの人は早くテクニカルドキュメント要約ライブラリの作成の仕事に戻るんだ
346 :
338 :2009/09/26(土) 00:34:43
>>344 おわっ、これはかなりわかりやすそうな予感
勉強してみます
どうもありがとう!
UIButtonのRounded Rectタイプのボタンで,画像を使わず手軽にボタンの色を変える事は出来ないでしょうか?
>>347 無理です
あと、ここではなくiPhoneアプリ開発のスレに書きこんだ方がいいかと
349 :
デフォルトの名無しさん :2009/10/09(金) 06:08:24
もの凄い初歩的な質問かもしれないのですが、 とあるサイトに↓のようなコードがありました。 NSMutableArray *anArray = [[NSMutableArray alloc] init]; NSString *str = [[NSString alloc] initWithString:@"文字列"]; [anArray addObject:str]; [str release]; NSStringのstrをNSMutableArrayに追加しているのですが、その直後にstrをreleaseしています。 NSMutableArrayに追加するということは、クラスのインスタンスをコピーして追加するという事なのでしょうか? addObjectした後は、元のオブジェクトは必要なくなるって認識でいいのでしょうか?
>>349 retain/release について勉強してください。その辺わかってないと、
プログラム書いてるといずれ意味不明なクラッシュが多発して
どうしようもなくなりますよ。
http://developer.apple.com/iphone/library/documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html release は C++ でいう delete とは違って、即座にオブジェクトを
破壊するわけではないです。retain カウントを減らすだけです。
retain カウントがゼロになれば、自動的に dealloc が呼ばれてオブジェクトが
なくなります。
あるオブジェクトを持っておきたい人は、
retain して retain カウントを増やします。
いらなくなったら、 release して retain カウントを減らします。
誰からもオブジェクトがいらなくなったら、自動的に dealloc されます。
NSMutableArray に addObject すると、NSMutableArray は
そのオブジェクトを保持していたいので、 retain されます。
一方で、
>>349 のコードを書いているあなた自身は
もうそのオブジェクトは直接はいらなくなるので、release しちゃっていいです。
インスタンスがコピーされているわけじゃなくて、
NSMutableArray がこのオブジェクトを保持するぜ!と言っているので、
あなたはもうこのオブジェクトを保持している必要がなくなるわけです。
>>351 ありがとうございます。もんのすごく分かりやすいです。
一応リンク先の方も読んでおこうと思います。
結構既にメモリまわりのエラーが時々出たりしているので・・・
「一応」じゃなくてちゃんと読め。
>>282 GNUSTEPのソースを追えば、理解できると思う。
356 :
デフォルトの名無しさん :2009/10/11(日) 18:49:15
以下のコードで指定のURLからファイルを取得しようとしているのですが、
bad URLというエラーが返されてしまいます。
NSLogでnssUrlを表示させ、そのURLをコピペしてブラウザから閲覧したら確かに見る事ができるのでURLは間違っていないはずです。
NSString *nssUrl = [NSString stringWithFormat:@"
http://%s/%s/%@/%s ", SERVER_ADDR, DIR_AREA, [semanticList objectAtIndex:i], FILE_SUBJECT];
NSURL *url = [NSURL URLWithString:nssUrl];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
NSURLResponse *resp;
NSError *err;
NSData *result = [NSURLConnection sendSynchronousRequest:req returningResponse:&resp error:&err];
NSLog([err localizedDescription]); //←bad URLと表示される
NSString *subjectData = [[NSString alloc] initWithData:result encoding:NSShiftJISStringEncoding];
[subjectData release];
このコードに何か問題がありますでしょうか?
そのコピペしたURLを直接NSStringに nssUrl = @"hoge"ってつっこんだ結果はどうなってるのさ?
>>357 あれ?それだとエラーが出てこなくてちゃんと動きます。
謎なんですけど・・・
nssUrl を characterAtIndex で unichar 出して中身見ると、変なモンが混ざってると思うぞ。
360 :
デフォルトの名無しさん :2009/10/11(日) 19:09:17
NSLog(@"url=%@",[url absoluteString]);
で url の方にちゃんと入ってるかどうか確認したところ
url = (null)
と表示されました。
>>357 さんのようにNSStringに直接ぶちこんだ時はちゃんとurlが表示されました。
でも、NSLog(@"nssUrl = %@", nssUrl);でnssUrlの中身を確かめたら、
stringWithFormat:で生成したときもちゃんとURLが表示されます。
NSURL *url = [NSURL URLWithString:nssUrl];
に何か問題があるのでしょうかね・・・
>>359 おぉ、ありがとうございます。1文字ずつ表示させていったら
[semanticList objectAtIndex:i]のあとに空白?みたいなのが1つ入ってました。
なんでだろう・・・とりあえず後は自分で原因探してみます。ありがとうございました!
あまりスマートじゃないですが、固定長のデータなのでsubstringToIndexで対処しました。 ありがとうございました。
363 :
デフォルトの名無しさん :2009/10/12(月) 00:13:57
char*をNSNumber型に変更するスマートな書き方はありますか?
それポインタだろ。cString のことか?
365 :
デフォルトの名無しさん :2009/10/12(月) 02:01:49
ファイルの削除に関する質問です。 NSError *err; if([[NSFileManager defaultManager] isDeletableFileAtPath:filePath]){ NSLog(@"消すことが可能"); [[NSFileManager defaultManager] removeItemAtPath:filePath error:&err]; NSLog([err localizedDescription]); } 上のコードを実行すると、NSLogの部分でEXC_BAD_ACCESSが出ます。 そもそものNSErrorの使い方が間違ってるのでしょうか?
NSError *err = nil; ってしてみて
>>366 ありがとうございます!
無事エラーが出ないようになりました。
なんかよくわかりませんが、allocもinitもせずに宣言するときはとりあえずnilをぶち込んでおく癖をつけておきます。
>>364 そうです。Cの関数から返されたポインタのcharをNSNumberにしたいです。
今はNSStringに変換してからNSNumberに再変換してます。。
> NSStringに変換してからNSNumberに再変換 何したいのか分からないから、この処理の部分を書いてみて
>>369 char *c = (Cの関数);
NSString *str = [NSString stringWithCString:c];
NSNumber *num = [NSNumber alloc] initWithInt:[str intValue]];
NSStringを介さずNSNumberにしたいです。
[NSNumber numberWithInt : atoi(c)]; ってことか。NSString かませる必要ないね。
>>371 そんな関数があるんですね、ありがとうございました!
>>370 べつにそれでいいでしょう。なんでそれじゃいやなの?
あと、strintWithCString は deprecated なので使わないこと!
文字コードの問題でいずれハマりますよ。
かならず UTF8String か encoding: つきのメソッドをつかってください
意味なく無いだろ
>>375 いや、訳も分からずとりあえずnilを入れるのは良くないよ、て言いたいんじゃないの?
値が未定義な自動変数がクラッシュの 温床になるって書いて置けばまだ 分かりやすいかな。
萩原本にはNSErrorにほ取り敢えずnil入れとく癖を付けろと書いてあったよ。
379 :
デフォルトの名無しさん :2009/10/14(水) 16:51:04
質問です。 クラスAの中でクラスBのオブジェクトを保持したくて、 クラスBの中でクラスAのオブジェクトを保持したいのですが、 それぞれのヘッダファイルの中でimportしようとすると入れ後状態?みたいになって コンパイルが通りません。こういう場合はどうすればいいのでしょうか。
>>379 循環参照が発生してるのかな?
スーパークラスかインターフェイスを作成して、それを保持させるとどうかな?
@class
382 :
デフォルトの名無しさん :2009/10/14(水) 17:00:05
>>380 あーなるほど、そういう方法があるんですね。
ありがとうございました!
>>380 , 382
まてまてまてw
>381 の言う通り、@class をつかえ。
ClassA.h; @class ClassB @interface ClassA : Hoge {ClassB *clsB} @end
ClassA.m; #import "ClassA" #import "ClassB"
ClassB.h; @class ClassA @interface ClassB : Piyo {ClassA *clsA} @end
ClassB.m; #imprt "ClassB" #import "ClassA"
しつれい、@class ClassA; ね。";" が抜けた
>>383 ぎゃー、すでに変更し始めてました。
ちょっとバックアップファイルから復元して@classでやってみます。
>>385 Objective-Cに興味があってこのスレ見てるけど、コードを書いた事が無いのにレスした俺のせいでスマン…
387 :
デフォルトの名無しさん :2009/10/14(水) 18:13:47
@classで一瞬で解決しましたw
ありがとうございました!
>>386 なんという・・・w
>>386 >Objective-Cに興味があってこのスレ見てるけど、コードを書いた事が無い
なんだ、俺は他にもいたのか
一度くらい書けよw
cat > hello.m #include <stdio.h> int main(int argc, char*argv[]){printf("Hello world.\n");return 0;} ^D make hello ./hello サフックスが.mだからObjCとしてコンパイルされます! これでObjCプログラマの仲間入りです!
それでいいなら俺も書いた事あるぜ!w
392 :
デフォルトの名無しさん :2009/10/16(金) 00:58:07
NSStringの中に文章が入っているのですが、その中にあるURLをリンクに置換したいと考えています。
例えば文章の中に
http://www.google.co.jp/ のようなアドレスがあれば、
<a href="http;//www.google.co.jp/>http;//www.google.co.jp/</a>
のように置換したいのですが・・・やり方がいまいちわかりません。
とりあえずNSStringのメソッドを見る限りだと無理で、NSMutableStringのメソッドを見る限りだと、
replaceOccurrencesOfString:withString:options:range:のようなメソッドがあったのですが、
正規表現が使えるのか不明です。何かいい方法はないでしょうか?
regex(3)
>>392 ありがとうございます。
RegexでググったらRegkit liteというのがあったのでそれを使いました。
ただ、URLのマッチングが上手くいかないので見ていただけないでしょうか・・・
NSString *searchString = @"I like
http://www.google.co.jp/ yeah!!";
NSString *regexString = @"(
http://| https:// ){1}[\\w\\.\\-/:\\#\\?\\=\\&\\;\\%\\~\\+]+";
NSString *replaceWithString = @"<a href=\"$1\">$1</a>";
NSString *replacedString = NULL;
replacedString = [searchString stringByReplacingOccurrencesOfRegex:regexString withString:replaceWithString];
これで置換した結果が、
I like <a href="
http:// ">
http://</a > yeah!!
になります。www.google.co.jp/が消えてしまってるのですが、何が間違ってるのでしょうか?
そのライブラリは知らないけど、普通はカッコで囲ってるところしかキャプチャされないのでは?
NSString *regexString = @"(https?://[a-zA-Z\.\-\#\?\=\&\;\%\~\+]+)"; でいいんじゃないの
398 :
デフォルトの名無しさん :2009/10/16(金) 02:44:41
括弧で囲ってるところしかキャプチャされないんですか・・・ 無事マッチできました。ありがとうございました!
399 :
デフォルトの名無しさん :2009/10/17(土) 05:37:25
次のようなプログラムを動かすと配列0番目を参照してるはずなのに 200が返されます。何故なんでしょうか? int main(int argc, char *argv[]) { array = [[NSMutableArray alloc] init]; [self bindInt:0 value:100]; [self bindInt:0 value:200]; Element *h = [array objectAtIndex:0]; printf("value:%d¥n", *(int*)h.p); } - (void)bindInt:(int)holderId value:(int)value { // Elementクラスにはvoid *p変数のみ定義されてる Element *holder = [[[Element alloc] init] autorelease]; holder.p = &value; [array addObject:holder]; } ちなみにbindIntのhoderId引数自体を外すと0が返されます。 これもよく理由がわかりません。。
なんでintのポインタ渡すの? それスグ死ぬやん。
>>400 へ、死ぬんですか。
変数pはvoid*にして、様々な型を格納できるようにしたかったのです。
まだあまり理解できていないのかも。
この辺りは何をキーワードに調べれば良いのでしょうか。
void * に格納できるのはポインタだけで、「様々な型を格納」できたりはしないぞ。
その前に self って誰?
プールもないのに autorelease ?
>>399 >holder.p = &value;
ここでスタック上に一時的に作られたローカル変数のアドレス取ってるから
ゴミを拾って当たり前
Cの初歩で「ローカル変数のアドレス返しちゃダメ」みたいなトピックあると
思うからその辺から読む事
NSImage *backBlock = [[NSImage alloc] initWithContentsOfFile:@"./images/Block_0.png"]; のところで、 initializer element is not constant というエラーが出て途方に暮れています。 何が悪いのか、教えてください。
それを NSImage *backBlock = [[NSImage alloc] initWithData:[NSData dataWithContentsOfFile:@"./images/Block_0.png"]]; とかに変えてもエラーが出るのなら、他の部分が問題。
というか、突っ込みどころが多すぎてどこから突っ込んだらいいのやら。
409 :
デフォルトの名無しさん :2009/10/18(日) 05:31:50
とりあえず俺のケツから突っ込んでこいよ
次のようなコードでmyNotePadオブジェクトのプロパティの値を変えようと試みているのですが、//Diagnosticsの部分でNSLogの結果が 0 や (null)と表示されてしまいます。 // プロパティnoteTextにコンテントの内容をセット myNotePad.noteText = tvContent.text; // プロパティsavedDateに日付をセット myNotePad.savedDate = [NSDate date]; // プロパティsaveCyclesをインクリメント myNotePad.saveCycles++; //////// Diagnostics NSLog(@"in saveData - tvContent.text - %@", tvContent.text); // これはちゃんと表示される NSLog(@"in saveData - noteText - %@", myNotePad.noteText); // nullと表示される NSLog(@"in saveData - savedDate - %@", myNotePad.savedDate); // nullと表示される NSLog(@"in saveData - saveCycles - %d", myNotePad.saveCycles); // 0と表示される 初歩的な質問で申し訳ないのですが、どなたか教えていただけますか? マジで困ってます・・・
すみません自己解決しました
>>411 自己解決したのはいいとして、何が原因だったかくらい書いたらどうかな?
それを読んで役に立つ人もいるはずだし。
ここでいろいろ助けてもらっても、結果は独り占めして誰にも教えたく無い、
っていう性格なら、まあ強制はしないけどね。
変数に入った文字列を=で代入なんてできない。初歩的すぎる。
「myNotePadがnilでした」に 3 retainCount かける。
>>413 なんの話をしているの?
>>412 そうですね。すみません。
実はメモリをallocしてなかったのが原因でした
>>413 初心者は帰れ!!!!
>>414 そうです。nilでした
余計なことを言ったばかりに一気に印象が悪くなる。
馬鹿は死ななきゃ治らないから415の罪じゃないさ。
418 :
デフォルトの名無しさん :2009/10/19(月) 21:55:11
malloc: *** error for object 0x4c52320: pointer being reallocated was not allocated これは一体どういう意味なのでしょうか? メモリを再確保されたポインタはメモリ確保されませんでした? いまいちよく分からないのですが、具体的にどういう時に出るエラーなのでしょうか?
>>418 #include <stdlib.h>
int main(int argc, char **argv)
{
char *foo = "abc";
foo = (char *)realloc(foo, sizeof(char) * 4);
return 0;
}
みたいなことをしたときとか。
再確保しようとしたポインタは確保されませんでした?
422 :
418 :2009/10/19(月) 22:44:28
んー明示的にメモリの再確保してる場所はないんですけどね・・・ NSMutableStringのappendStringあたりで変なことになってるんですかね。 とりあえずどういうエラーなのかは分かったので、地道に問題箇所探していきます。 ありがとうございました!
>>414 413 は、OpenStep API が出る前で NSString* が無かった頃の人なんだよ。
というかここは Obj-C スレなので、Foundation があることを
仮定しないのが自然じゃないかな。
あ、でも、property 使う時点で Obj-C 2 か ...
NSStringが登場する前だってNXStringとかあったじゃん
疑問です。 NSLog(@"%.f", 0.5); NSLog(@"%.f", 1.5); NSLog(@"%.f", 2.5); NSLog(@"%.f", 3.5); NSLog(@"%.f", 4.5); NSLog(@"%.f", 5.5); とした時、四捨五入されて出力結果は 1 2 3 4 5 6 になると思いきや実際には 0 2 2 4 4 6 となりました。偶数時は5以下は切り捨て。奇数時は5以上を繰り上げているようです。 printfでも同様でした。 なぜこうなるのでしょうか? 10.5、10.6、Cocoaアプリケーション、Standard Tool、C89、C99 等いくつか状況を変えて試しましたがいずれも同じ結果でした。
NSURLConnectionを使ってHTTPでデータの差分取得をしたいのですが NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60]; [request addValue:@"Wed, 30 Jul 2008 12:12:12 GMT" forHTTPHeaderField:@"If-Modified-Since"]; [request addValue:@"445-" forHTTPHeaderField:@"Range"]; NSData *data; NSURLResponse *response; NSError *error = nil; data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; とりあえずリファレンスとか見ながら頑張って↑のコード書いたのですが、 結局差分取得はせずに全部ダウンロードしてしまいます。 どうすればいいのでしょうか・・・
>>426 ググってみました。ありがとうございます。
あー、アホだー bytes=が抜けてました。死んできます。
この様はiPhoneさまさまなのかな。
サマーはもう終わりました
次のスレのはじめには、ここはあくまで言語仕様のスレで、 Mac / iPhone Cocoa プログラムはそれぞれのスレにいくよう 強調したほうがよいかも
別にいいんじゃん?暇だし。
まぁね 暇だし 仕事ないし
働いたらそこで試合終了だって安西先生が言ってた
俺は、親父が残してくれた財産で、 働かずに住んでいるよ。 結局、人生は親の財産次第。 馬鹿な親の子に生まれた子は、一生馬鹿。
奇遇だな。俺も2chではそうなんだよ。 相続税のこととか考えると、まったく頭が痛いよ。
>>437 ,438
働かず、暇があるなら税法をやれば良い。
それで今の税法の穴を見つけてこっそり使えばいいんじゃね。
スレ違いうざい。
そういうスレ違いは許さないんだなw まぁ当たり前っちゃ当たり前か。スレ違いというか、板すら違うからなw
国内のMac信者ってなんでこう雑魚ばっかりなんだろう
まぁ荒れる前にこの話題は終わらせちゃおうぜ!! releaseだ!release!!
Cocoa でドットを描くのは NSRectFill(NSMakeRect(x,y,1,1) するのが一般的なの? 難しいな…
445 :
デフォルトの名無しさん :2009/10/21(水) 22:31:28
せっかくだからOpenGL使ったら?
なるほど。GL_POINTS を使って点を描く訳ですね。 お絵描きソフトを作ろうと思っているのですが、NSBezierPath 等 Cocoa の API を 使うのと比べてメリットはどんなところがあるでしょうか。
447 :
デフォルトの名無しさん :2009/10/22(木) 09:44:53
他機種向けのソフトを作る時も、流用しやすい
クロスプラットフォームなのは嬉しいですね。 ただ今回はプラットフォーム固有の機能をガンガン使って コーディングするつもりなので、他機種の事は考えていません。
>>444 みたいな面白いこと言い出す奴にそれは無理だと思うの
ん、どうしてそう思ったの?
何だ、冷やかしか
前々から言おうと思ってたけど、iPhoneアプリ開発スレ行けよ こっちとマルチすんな
前々?マルチ?iPhone? いったい誰に向かって言ってるんだ?
普通の人には見えない何かが見えちゃうと大変だな…
何がしたいのか全く分からん… お大事にね
君らもうMac板に帰ったら
459 :
デフォルトの名無しさん :2009/10/23(金) 02:43:38
おちつけぢょwww
何だ、冷やかしか
ひややっこおいしいです
NSStringに0123918201とか023384722とかの数字文字が入っているのですが、 それらのNSStringを if([numString1 intValue] < [numString2 intValue]){ } else if([numString1 intValue] == [numString2 intValue]){ } else{ } のように数値で比較した時、なぜか絶対にイコールのところに入ってしまいます。 NSLogでそれぞれに入っている数字は違う事を確認してるのですが、 それでも==の条件式に当てはまってしまいます。 どういう原因が考えられますか?
463 :
デフォルトの名無しさん :2009/10/23(金) 16:17:41
すみません、調べてみたら、NSStringに入ってる数字は違うのですが、 intValueにしたら全然違う数値になっている事がわかりました。 NSStringに031424045645って入ってるのに intValueの値は2147483647になってます。 これは何でなんでしょうか・・・?
31424045645 → 7 5104 E24D 2147483647 → 7FFF FFFF
signed int の最大値 INT_MAX が 2^31-1 = 2147483647 って知らないの? doubleでも使え
466 :
デフォルトの名無しさん :2009/10/23(金) 16:39:38
あーなるほど・・・。intは4バイトなのでオーバーフローしちゃってるわけですね。 unsigned型でも全然桁がたりませんね。基本的に12桁以下の数値の文字なのですが、 これを数値的に比較するのにいい方法はないでしょうか?
long longか__int64
468 :
デフォルトの名無しさん :2009/10/23(金) 16:48:28
>>465 doubleValueだと==を検出できなくなる可能性がありますね。
roundとかで切り捨てれば解決なのかな・・・
ちょっとやってきます。
NSLog(@"%ll", [numString1 longlongValue]); でlong long型が表示出来なかったので、数値が確認できず若干不安ではありますが、 期待通りの動作をしているようなので大丈夫なようです。 ありがとうございました。
>>470 わぁ、ありがとうございますw
大丈夫だと言い聞かせながらも、もの凄く不安でしたw
念のためちゃんとなってるか調べてきます。
NSLog(@"%@ %qi", numStringX, [numStringX longlongValue]); 文字とそれをlonglong型に変換したものの対応表ですが・・・ 031423045645 5833744870023364608 031423045646 5833744874318331905 031424045644 5838039833024397314 031424045644 5838039833024397315 031424045645 5838039837319364611 031424045646 5838039841614331908 031425045644 5842334800320397317 031425045644 5842334800320397318 031425045645 5842334804615364614 031425045646 5842334808910331911 全然大丈夫じゃなかったです。一応文字数値が大きいものほど、 longlongの値も大きくなっているので正常に動作はしているのですが、 んー何でこう思った通りに動かないんだろうか(´・ω・`) どこも間違ってるようには見えないんですけど・・・
031423045645 → 7 50F5 A00D 5833744870023364608 → 50F5 A00D 0000 0000 何が起こってるんだろ?
031423045646 → 7 50F5 A00E 5833744874318331905 → 50F5 A00E 0000 0001 二つ目に関してはLSBが1になってますね。 んー・・・元のNSStringに何か問題があるんですかね・・・
試しに↓をやってみたら NSString *testString = [NSString stringWithString:@"012345012345"]; NSLog(@"test: %@ - %qi", testString, [testString longLongValue]); 出力が test: 012345012345 - 12345012345 になってるので、基本的な使い方としては間違ってない感じですね。 numStringの中に入ってるデータに何か罠がありそうな感じですが、 普通にNSLog(numString)で表示させても、特に変な様子は見られないんですけどね・・・
ここはお前のメモ帳だ。いいぞもっとやれ。
何かついてるんでしょうね。とりあえず、NSScanner で読んでみたら? NSString *str = [NSString stringWithUTF8String:"031425045646"]; NSScanner *scan = [NSScanner scannerWithString:str]; NSLog(@"%@, %qu", str, [str longLongValue]); NSLog(@"%qu", value); //031425045646(, 31425045646 //31425045646
あ、ごめん、スキャン部分が抜けてた。 uint64_t value; [scan scanLongLong:(long long*)&value];
NSLog(@"%@ %qi", numStringX, [numStringX longlongValue]); longlongValue なんて method はないよ。 ほんとうにこのコードで出した対応表なの?
480 :
デフォルトの名無しさん :2009/10/23(金) 20:10:37
ちょっとNSScannerでやってみます
>>479 その部分は手打ちなのでタイプミスしました。
ソースの方はちゃんとlongLongValueになってます
NSScannerで確かめて見たら正常に表示されました。 これに関連して、比較用のNSStringを新しくつくって、そこに元のNSStringをぶちこんで 表示させてみたら同様に正常に表示されました。何なんだろう・・・ とりあえず比較用のNSStringを作る事で対処しました。 これで比較部分がようやく安心の動きになるはず・・・ とりあえずありがとうございました!
おまえらメソッド定義の開き括弧って別の行にする派? - (id)fucknglyLongMethodNameContainingThousandsOfCharacters:bar { それともメソッド名の行にまとめる派? - (id)fucknglyLongMethodNameContainingThousandsOfCharacters:bar { あと、メソッドチェインで右の方まで来ちゃったときって、新しい行でメソッド名始めたりする? [[omgThisIsTooLongSoThatTheNextMethedHangsAtFarRightPositionWTF foo] thisIsTheSecondMethodSTFU:bar multipleArgsAnotherPain:poo]; それとも同じ行に置く? [[omgThisIsTooLongSoThatTheNextMethedHangsAtFarRightPositionWTF foo] thisIsTheSecondMethodSTFU:bar multipleArgsAnotherPain:poo];
-(void)括弧は同じ行にする { [[そんなに長いメソッド名 付けたりはしないけど] 基本的には同じ行かな]; id hoge = [コード見やすい方が気分がいいので あんまりにも右に長くなっちゃう場合は]; [hoge コードを分けちゃいますね]; }
WikipediaでCの例文見ると 関数宣言は改行で void a { } 条件式は if () { } while () { } 改行してるみたい。
GNUスタイルは参考にするな、やっちゃダメな例だ Linuxコーディングスタイルがルールも少なく誰でも従いやすい でも、objc的にはAppleのコーディングスタイルをまねるのが一番いいのでは Appleなりの理由があってあのスタイルに落ち着いたんだろうから あと、Perlベストプラクティスのコーディングスタイルも学ぶところが多かった
コーディングスタイルなんて、プロジェクト内で一貫してればなんでもいいべ。
いきなりタブ・インデントは8文字とか書いてあるけど……
基本Appleのサンプルコードを真似する形で。
ここで質問すべき事なのかよく分からないのですが、 Macのシステム終了、再起動、をするプログラムを作ろうと思ってます。 で、実装についてなんですが、よく分からないのでsystem関数で 再起動、システム終了のコマンドでも送ってみようかと思います。 shutdown -h now ですね!でもこれってrootじゃないアカウントからでも効くんでしょうか? あと、保存していないファイルとかは保存されないまま強制終了しちゃうのでしょうか?
492 :
491 :2009/10/26(月) 04:51:26
自分で試す気は無いのでよろしくお願いします。
496 :
デフォルトの名無しさん :2009/10/27(火) 07:55:44
既出かもしれんが、 foo.cppにあるint exec()って関数をbar.mのmain()から呼び出すのってなんか宣言必要なの? ldでexec()のシンボルが見つからないと言われる・・・
>>496 foo.cpp 側で extern "C" しとかんと Obj-C からは呼べないだろ、JK
>>497 Thx。やってたんだが、どうやらヘッダーファイルで宣言してたのがダメだったらしく、cppファイルに直接externしたら動いた。感謝。
原因まではおってないが‥
499 :
デフォルトの名無しさん :2009/10/29(木) 13:23:39
メインスレッドから実行したスレッドAの処理が終わるまで メインスレッドを待機させるにはどう書けば良いのでしょうか。
500 :
491 :2009/10/29(木) 13:33:31
[self performSelectorOnMainThread:<#(SEL)aSelector#> withObject:<#(id)arg#> waitUntilDone:<#(BOOL)wait#>]; じゃねーの。
名前消し忘れてたヨ
502 :
499 :2009/10/29(木) 13:36:38
やっぱりperformSelectorOnMainThread使わないといけないんですね。 あまりメソッド増やしたくなかっただけなんですが、どうもです。
>>502 「使わないといけない」わけじゃねーよ。
>>500 は 物知らずでも使える一番簡単な方法を提示してくれただけだろ。
文句あるなら pthread の関数とか NSCondition でも使ってろ
504 :
デフォルトの名無しさん :2009/11/08(日) 15:04:31
簡単なxmlを解析するクラスを作ってます。char型のメンバ変数を持たせたいと思ったのですが、うまくいきません。 @interface SimpleXml : NSOperation { const char *elementName; } オブジェクトの初期化のところで - (id)initWithRequest: (NSURLRequest*)request name: (NSString *)name { self = [super init]; if (self) { elementName = [name UTF8String]; } return self; } こんな風にしてみた。代入直後でNSLogするとちゃんと代入されてるのですが、実際に使いたいメソッドの中では文字化け?のようなおかしなデータになってます。 比較対象がchar*なので最終的にはchar*が欲しいです。メンバ変数をNSStringにして比較するところでUTF8Stringで変換して比較するとうまくいきます。 ただ、xmlの要素分繰り返し呼ばれる部分なので、毎回UTF8Stringを呼び出すくらいならcharで持たせちゃえと思いました。 それほどおかしなことはしてないつもりなのですが、やっぱりポインタの理解が足りてない感じでしょうか?アドバイスお願いします。
>>504 -[NSString UTF8String] のドキュメントを読みなさい。
ちゃんと注意が書いてあります。
>>504 NSXMLDocument つかえば?
507 :
504 :2009/11/09(月) 02:02:48
>>505 ありがとうございます。
もとのNSStringがreleaseされた時点でfreeされちゃうんですね。
うまくできました。
ドキュメントよく読みます。
iPhoneの開発で初めてObjective-Cを使ったが、良いねこれ。 最初はメソッド呼び出しの[]がきめぇwwwwって感じだったんだが、 デフォでリフレクションできるのは良い。 C++よりこっちが普及していれば自分のプログラマ人生も幸せだったのかもしれない、 と思う今日この頃。
リフレクションって何?
RTTIのすげぇやつ
511 :
508 :2009/11/10(火) 15:25:49
つくづく思うのがC++のvirtualってナンセンス。 id型に何でもぶちこめるのもイイ。まさかCでこんな風に扱えるとはね。 メソッドのprivate/publicの定義ができなかったり不満もあるけど。
それ、Cやない、Objective-Cや
C拡張で、ってことでは。
virtualがナンセンスだなんて思ったことないわ
515 :
508 :2009/11/10(火) 16:40:25
スクリプト言語になれると、基本、親のメソッドはなんでも置き換えられてあたりまえという考えに。 基本クラスが違ってもメソッドの名前と引数の型が一緒なら呼べてしまうのも何気にすごい。 それに甘えて使いまくると死ぬけど。
どれもが同じ実装だったら、何も楽しくないじゃん
既に C++ が存在しているって事は良い事だよね。 ああいうのが好きな人が楽しめる場所が別にあるから、 お互い邪魔せずに、こっちはこっちで自由にできる。 彼らはどう転んでも Smalltalk 風のオブジェクト指向を 消化できないだろうし、C++0x を見ていると、 対岸の火事で良かったなあと心から思う。
無理して語ってる感がすごい
ん、そうか? 前世紀から何度も繰り返し語られてる話だけどな。
C++のメソッドをCの関数ポインタみたいに実行時バインドしようとすると virtualのダメさが際立つな。あれはナンセンスと思う Qtのシグナルスロットとかみたいに言語外の飛び道具が必要になるし
いろんなことを混ぜ込めて、結局は何も言ってないみたいな
伝わる人に伝われば良いんだよ。別に説得するつもりも無いし。
いろんな言語使う人からすると実装の違いがおもしろいんだけどねえ 何か他の言語を否定しがちなのはもったいない感じがする
ObjC 一本槍な人間が居るとでも?
どんな言語にも欠点はあるし、多少叩かれてもカリカリしなくていいんじゃね
526 :
508 :2009/11/11(水) 16:00:50
そもそもobjCってmac、iphone開発くらいにしか使わないし、 WEBプログラミングでrubyかPHPかjava、どれでやるかって話にはならないよね。 で、自分はC++に10年以上お世話になってるが、 歴3ヶ月のobjCのが言語として優れてる気がしている。 なにげに[nil method1]でぬるぽにならないのもいいな。
527 :
デフォルトの名無しさん :2009/11/11(水) 16:08:31
はいはい、もういいから。
冷たいな(´・ω・`) ObjCスレなんだから、もっと激しく愛を語ってもいいじゃないか。
今更30年前に Smalltalk で実現されていたものについてだけ語られても反応に困る .mm で boost:python と混ぜて使うのが最強ですよとかモダンな話をしようよ
じゃあ追加して欲しい言語仕様の話でも
[hoge method1] でマルチスレッドになりますか?
最近 object_getInstanceVariable とかを知って悶絶しそうな程展望が開いて小躍りしてます。
533 :
デフォルトの名無しさん :2009/11/11(水) 22:50:59
>>532 reflection つきの オブジェクト指向言語なら出来て当たり前だろう
>>531 [hoge performSelectorInBackground:@selector(method1) withObject:nil]
でオッケー
昔はこれだけで感動だった。 Smalltalk keys. Lisp だと apropos とか。
Smalltalk で言ったら fork メッセージだな
oneway voidなメソッドなら別スレッドで実行されてもいいよな OSXのランタイムはそういう実装にはなってないけど
>>538 APIが全て thread-safe な理想郷ならそれでもいいけど、
とつぜんあるメソッドが別スレッドで走られると困る事もあるよ
10.5 では NSOperation の concurrent オペレーションは
メインスレッドで動いてたのに、10.6 からそれも別スレッドで
走るようになったので嵌まったのでそういうのはこわいです。
プロパティのデフォルトアクセサは nonatomic を指定しないかぎり スレッドセーフだから多少のオーバヘッドには目をつむって自クラス内でも インスタンス変数は常にプロパティ経由で触るみたいなスタイルが今後は 主流になるのかもね
個々のインスタンス変数やプロパティの読み書きだけスレッドセーフにしても あんまり意味ないから、主流にはならないと思う。
iPhoneのSDKがらみの質問もここでしてよいのかな。 本体の傾きを求めるとかそういう話だが。
544 :
542 :2009/11/19(木) 18:49:07
mac板にあったんだ、iphoneじゃなくて・・・どもです
ブロック構文ってなんじゃらほい。
546 :
デフォルトの名無しさん :2009/11/21(土) 20:37:49
547 :
デフォルトの名無しさん :2009/11/22(日) 21:09:36
NSStringの文字列"0"をASCIIコード10進数の48に変換するにはどう書けば良いのでしょうか?
548 :
547 :2009/11/22(日) 22:30:21
すいません、間違えました。 ASCIIコードの48をcharもしくはNSStringの0に変換するには どう書けば良いのでしょうか。
なんだこのゴミは
>>549 まあまあ。将来有望な小学生が来たのかもしれんじゃないか。
>>548 で、その48は何で表されてんのかな?
char c[128]={0}; c[0] = 48; sprintf(c, "%c", 48); NSString *nss = [[NSString alloc] initWithFormat:@"%c", 48];
>>551 オイコラ、char c[128]ってどういうつもりだ。これだから最近の若いもんは・・・。
553 :
デフォルトの名無しさん :2009/11/23(月) 06:29:27
>>552 えっ、何かマズいっすかね・・・
自分まだ初めて2ヶ月くらいなんです・・・
Mac関連スレってどこも変な物言いのおっさんばっかりなんだよな
>>553 >>551 の2行目のようにchar型のデータが欲しいだけなら何もすることは無いので char c; c = 48; で十分だ。
もし3行目のように文字列として扱いたい場合でも今の場合なら一文字目 '0' == 48 と二文字目の '\0'
の分だけなので char c[2]; でよい。
それにchar c[2] = {0} のように書いた場合、2要素目以降は言語仕様上不定(実装上はほぼ確実に0にセットされるが)。
なんだそんな話か char c[4096]; とか平気でやってるぞ
なんと愚かな!
>>555 なーるほど。そういうことなら問題なっすぃん。
なんか48 61 65 71みたいな数値を文字列に直すのかなーとか思って多めにとっただけっすぃん。
>555 悪意がないことを先にいっておく >char c[2] = {0} のように書いた場合、2要素目以降は言語仕様上不定 なる理由はどこから 気になったので、規格書があればそのセクションをお願いします
>560 確認しました 確かに静的記憶域と同じと書いてありますね
American National Standard Programming Language C 3.5.7 Initialization Semantics If there are fewer initializers in a list than there are members of an aggregate, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
おまいら静的変数と同じとか遠回しなこと言ってないで、
>>555 は間違いで
char c[2] = {0}の様に書いた場合 2 要素目以降は c 言語の
仕様として 0 にセットされる、とストレートに指摘しろyo
564 :
555 :2009/11/25(水) 03:10:05
いい加減なことをいってスマンカッタ。 ヽ(`Д´)ノ ウワァァァン そんなこと言ったら厳密なObjective-Cの規格書なんて無いんだよう(グチグチ
往生際悪すぎ
とはいえ、身を委ねたくはない仕様だな。 明示的に初期化しておきたい。
明示的に bzero() とか memset() すると冗長だと言って怒る人もいる(いた)から難しいね…
こんな基本的な仕様を信用できないなら、ただの代入とかも信用ならんし 関数呼び出しなんて高度なものは余計使えないんじゃないか?
コンパイラにバグがあったりするんだよ そういう経験から、冗長かどうかはともかく おまじないとして書いている処理というのはある
570 :
デフォルトの名無しさん :2009/11/26(木) 18:28:35
信用うんぬんじゃなくて、知らん人が多くて話がややこしくなるからだろ
みんな知ってりゃいいが
>>567 みたいな理不尽なツッコミもありそうだし、
この流れみたいに話がこじれたらかなわん
じゃ信用できるコンパイラ先輩が作ってくださいよwwwwww ってやる夫顔で言ってやればいいんだよ
572 :
デフォルトの名無しさん :2009/11/27(金) 10:52:05
クラス名からそのクラスのインスタンスを生成するにはどうするんでしょうか? クラスオブジェクトの生成は結構見つかるんですけど、 Class cls = NSClassFromString(@"anyClassName"); クラスのインスタンス自体を生成するやり方を教えてください。 出来ない言語もあるけど、objective-cはいかにも出来そうですよね? お願いします
そこまで来てればあとはコンドーム一枚だぞ
574 :
572 :2009/11/27(金) 11:05:28
>>573 あれ?もしかして
id obj = [[cls alloc] init];
でいいんですか?
NSLogでのぞくと出来てるっぽいです。
class_createInstanceというのも見つけたけど上ので良いのかな。
いいんです。
こんなのも Class class = NSClassFromString(@"AnClass"); SEL sel = NSSelectorFromString(@"aSelector"); id obj = [[[class alloc] init] autorelease]; [obj performSelector:sel]; プラグイン書くときはNSClassFromStringは便利だよね。 わざわざバンドルローダー指定する必要ないし。 NSSelectorFromStringの方はごくまれにしか使わないね。 AppleEventDispatchの実装部では使いまくってそうだけど。
newとallocの違いが今イチ分からん。
+newは+alloc -initと同義
580 :
デフォルトの名無しさん :2009/12/01(火) 18:38:18
typedef enum {a,b} defA; といった宣言をヘッダに記述し、これを他のクラスからimportして defA a; のように利用しようとすると、 "expected specifier-qualifier-list before 'c'"とエラーが 起きてしまいます。 どのように定義すれば良いのでしょうか。
enum { a, b, }; typedef NSInteger defA;
583 :
580 :2009/12/01(火) 20:55:30
すいませんちょう単純な勘違いしてました。 他のヘッダが邪魔をしていて、importの前に書いたらうごきました。。
Objective-Cって、メソッド名ひとつ考えるのにも英語力を要求してくるな。 こりゃ、そんじょそこらのなんちゃってプログラマに扱えるしろものじゃねーな。
なんちゃってプログラマでも簡単に使えるよ。英語さえわかれば。
587 :
デフォルトの名無しさん :2009/12/02(水) 04:06:03
辞書が存在していない時代だったらそう言えるかもしれないね。
588 :
デフォルトの名無しさん :2009/12/02(水) 05:26:27
辞書の歴史は紙の歴史より古いからなあ。
DataWoTuika:id KonoIchini:idx omake:option
引数がkonochincoとomekoに見える
けしからん奴じゃ
592 :
デフォルトの名無しさん :2009/12/03(木) 19:40:15
NSStringにHTMLのソースが入ってるんですけど、 そこから<li>〜</li>の部分だけ抜き出したいと考えています。 ただ、それをどうやって実装すればいいのかが良く分からないです・・・。 今頭の中にある感じだと、<li>とマッチする最初の場所と </li>とマッチする最後の場所を探して、その部分を抜き出すという方法なんですけど、 もっと簡単に正規表現みたいな感じでピュッと抜き出したりできないでしょうか?
Google Toolbox for Mac の GTMRegex でも使え。
まさかiPhone初心者スレで聞いてたやつじゃねーだろうな
>>592 とりあえず簡単にやるならスキャナ使えば?
NSString *hoge = "hoge <ol><li>foo</li><li>bar</li></ol>";
NSScaner *scanner = [NSScanner scannerWithString:hoge];
while (YES) {
NSString* itemString;
if (![scanner scanUpToString:@"<li>" intoString:NULL]) break;
if (![scanner scanUpToString:@"</li>" intoString:&itemString]) break;
NSLog(@"item = %@",itemString);
}
596 :
デフォルトの名無しさん :2009/12/04(金) 00:52:37
>>592 NSXML 使って XPath でピョッと
597 :
デフォルトの名無しさん :2009/12/05(土) 22:45:14
なんか、releaseしなきゃならん場合としないでいい場合の違いが良くわからんわ。 本のサンプルとかみても、retainしてるのに、どこにもreleaseがなかったり、allocして autoreleaseも呼んでるのに、deallocでreleaseもしてたりとか、もうわけわかめ。 なんじゃこりゃ、そんなに神経質にならなくてもいいのか?
カウンタ使ってメモリ管理するなら当然覚えないと、意味不明なバグに遭遇することしきり。 自分は Instruments の Leaks 使って、可視化されたメモリリークを見ながら試行錯誤して覚えたけど。
あと初心者は Build & 解析はかなり役に立つんじゃ。
初期化するインスタンスメソッドの他に、勝手にAutoreleaseするクラスメソッドも あったりするからちょっとややこしい。
(あるクラスの init メソッド内で、インスタンス変数に代入するオブジェクトを)retainしてるのに、 (init 内の)どこにもreleaseがなかったり、 (そのクラスを)allocして autoreleaseも呼んでるのに、 (そのクラスの)deallocで(インスタンス変数を)releaseもしてたり と解釈するとしたら、まったく正しいコードけど
>>601 サンプルはあくまでサンプル。アプリまるごと完全詳解みたいのならともかく。
Obj-Cに限らず、その他言語のO'Reilly本やMSDNでも、
サンプルソースと現実的に推奨されるソースは異なる場合は多い。
参照カウンタの説明でretainしたものをreleaseしてないなら問題だと思うけど、
多分、別の説明で使用されているサンプルがそうなってるんでしょ。
>>602 >勝手にAutoreleaseするクラスメソッド
コンビニエンスコンストラクタのこと?
>>604 あぁ多分それ
俺もこの辺、よく迷うわ。propertyの宣下にもretainやassignの指定があるから、
宣言をよく確かめて使わないとかいけないとか気を使うのがちょっと大変。
便乗質問なんだけど、あるクラス(A)で動的にView(B)を作って(alloc & init)、
別のView(C)にaddSubView した場合って、Aで明示的にBをreleaseする必要
があるんだっけ? それとも、Cの解放時にBも勝手にreleaseしてくれる?
当然あるよ。
>>606 何が当然あるか? Aで明示的にBをreleaseする必要があるという意味あるか?
ないあるよ
hoge = [[Hoge alloc] init]; // 1 [foo addHoge : hoge]; // 2 … [foo release]; // 1 よってメモリリークになる。 だから、autorelease か add 後に [hoge release]; の必要がある、筈。
わかったある。謝謝
>>609 エ?こうしとけばリークにならねえだろ?
-(void)dealloc {
...
[mHoge release]; // 0
mHoge = nil;
...
[super dealloc];
}
612 :
デフォルトの名無しさん :2009/12/06(日) 21:02:19
そうか?
そのdeallocは何をトリガーにして呼ばれるんだっちゅう
自分が 609 だけど、foo が dealloc 時に hoge をリリースするのは、 addHoge: (addSubView:)には retain されてるから当然。 でもそれだと±1で、Hoge alloc init 時のカウント1をリリースされてないから、リークになる。
まぁ、init時にautoreleaseつけとくのが無難かな
無難とかそういう問題ではなかろう。
>602 >605 initほげほげ、copyほげほげ は retain されて、 それ以外のメソッドは autorelease されたのが返ってくる。 [obj method:a] としたばあいに、obj が a がずっと必要なら method 内部で retain するし、 いらなかったらそんなことはしない だから、自分があるオブジェクト a を release すべきかどうかは、 自分が呼んだメソッド内でどうなっているかとかは気にしなくてよくて、 単に自分がいらなくなった時点で release すればよい。 まあリリース足りなければメモリ食うだけだけど、 リリースしすぎは一瞬でクラッシュするので、 きちんと理解して書くか、NSZombie でチェックするか、 release しすぎないようにしてください。
ウィーッス
>>618 newほげほげも忘れないであげてください
雑談はスレチだよね。チラ裏すまん。 Objective-Cのオブジェクトの所有権ポリシーって、 (C++におけるメモリ管理と)やることは本質的に同じでありつつ 保守効率が格段に上がる優れた機構ではあるとは思うけど、 Objective-Cってどんなもんだろってちょっとイジってオナりたいとき、 一通り理解するまでとっかかりで苦労するねぇ。 C++慣れしてると、余計なお世話に感じてしまうっていうか。 なんだか好きになれない。
まあ、今はGCがあるし
iPhoneではGCが使えないらしい...ゾ
Objective-Cのメモリ管理3原則 1. alloc,copy,retain,newしたインスタンスはreleaseする必要あり 2. 1した覚えの無いインスタンスは勝手にrelesaeしてはいけない 3. 1してないインスタンスはどこかでreleaseされるので、保持したい場合はretainかcopy
add したら直ぐ release して良いのかと思ってたら、そうじゃないんだね
>>621 オブジェクトプール+手動の参照カウントってのは、大昔の手法だよ。
人頼みだとバグが多くなるし、保守効率も下がる。だからメモリ管理コードを
一々書かなくて済むGCやスマートポインタが主流になってる。
模したSmalltalkみたいに最初からGC付きなら無かった機構だから
>>622 が正解
でも、iPhoneがGCは無効なんでしょう? ここにいる皆さんは、GC派とリファレンスカウンタ派、どちらが多いのでしょうか?
628 :
621 :2009/12/08(火) 11:17:45
あ、すみません、iPhoneアプリ開発でObjective-C処女喪失したもので。
iPhoneはGC無いです。
(ただ、あったとしてもiPhoneはメモリ極小なので、autoreleaseさえ極力避けるべきと公式で指摘されています。)
>>624 の規則だけですが、解れば便利な@propertyと@synthesizeも、
とりあえずちょっとイジってみようレベルの初見だと、
iPhone画面にHelloWorld表示するだけのソースすら、
「@property(nonatomic,retain)何この呪文、この入門書じゃソース解説にも記述無いし、
とりあえず詳細確認は後だな...あれ??実装でretainなんてしてなくね??なんで??
(ポチッ)ちょww動いたwwwけどHelloWorldのソースすらイミフwwww」
みたいな。
結局、入門書はHelloWorldで挫折、とりあえずちょっとイジるだけのつもりが、
公式ドキュメントを片っ端から読み漁って十分理解してから、
入門書のHelloWorldのソースを見直したのはいい思い出。。。
チラ裏に長文、本当にスマンかった。
最後に、InterfaceBuilderについて。
見た目だけでVB.NETくらい優しいお母さん的IDEだろうと思って触ると、火傷するね。
iPhone だと Hello World 如きに property つかわにゃならん訳?
>>628 なんの入門書を読んだか知らんが、それはその入門書があきらかに悪いな
iPhone でプログラムやるには、
(古めかしいとか批判はいろいろあるかもしれないが、実際問題として)
retain/release ができなきゃ話にならない。
わかったつもりで通過すると絶対に意味不明なクラッシュをはじめて
あとで泣く羽目になるのに、説明しないなんてありえない。
とにかく変な入門書を掴んで失敗でしたね。
あなたが公式ドキュメント読める人で良かったですが。
あと、Interface Builder はふつうの(?)と違って、
コントロールダブルクリックしてもメソッド追加できないので、
その辺戸惑うかも知れませんが、ビューとコントローラの独立性が
自然に高まるようになってるのはいいところだと思います。
.Net やさんで iPhone プログラムはじめたひとはみんな
そう感じるみたいね。
http://dotnetaddict.dotnetdevelopersjournal.com/dcacs.htm とか。
>>629 いらないよ。コードなんて1行も書かなくてもHello Worldって表示するぐらいはできる。
完全に入門書が悪いわ。アップルの配布してるPDFのほうが数倍マシ。
633 :
デフォルトの名無しさん :2009/12/09(水) 22:34:49
NSString (NSStringPathExtensions) の - (NSString *)lastPathComponent; でも使え。NSPathUtilities.h に定義されてる。
635 :
デフォルトの名無しさん :2009/12/09(水) 23:13:06
>>634 ありがとうございます。
こんな便利なのがあったんですね。
というか、NSURLにもこのメソッドつけてほしいですねw
10.6にはついてるみたいよ。
ほんとだ。 - (NSString *)lastPathComponent AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER;
638 :
デフォルトの名無しさん :2009/12/14(月) 01:49:22
NSStringをURLエンコーディングしたいと考えています。 例えば てすと → %A4%C6%A4%B9%A4%C8 のようにしたいのですが NSString *test = @"てすと"; [test stringByAddingPercentEscapesUsingEncoding:NSShiftJISStringEncoding]; NSLog(test); のようにしても、 8C48B78C6 のように表示されてしまいます。これを%A4%C6%A4%B9%A4%C8のように表示するにはどうすればいいのでしょうか?
NSLogが%をフォーマット文字と解釈して表示しちゃうせいだから気にしない
1. ソースコード内に日本語文字列 @"にほんご" を書かない。 それによって出来た文字列がどうなるかの動作は未定義です! (うまくうごくときもあるかもしれませんが、コンパイラのデフォルト設定が 次のバージョンでかわると一瞬でおかしくなる可能性があります。) 必ず Localizable.strings を使うようにしてください。 2. NSLog(test) というふうに書かない!NSLog の第一引数は フォーマット文字列です。% があるとフォーマット指示だと解釈されます。 NSString* test = @"%@"; NSLog(test); とすると、NSLog は %@ をフォーマットと解釈するために スタック上に偶然あるポインタの先のオブジェクトっぽいものにアクセスして 異常終了しますよ! 必ず NSLog(@"%@", test) としてください。
NSString *test = @"てすと"; NSLog(@"%@", [test stringByAddingPercentEscapesUsingEncoding:NSShiftJISStringEncoding]); 2009-12-14 02:01:53.361 test[1467:a0f] %82%C4%82%B7%82%C6
なるほどなるほど、勉強になります。 ちゃんと表記したらちゃんと表示されました。 今まで面倒くさがってNSLog(NSString変数)みたいに書いてましたが 今度からちゃんと書こうと思います。ありがとうございました。
>>638 というか URL のエンコーディングって ShiftJIS でいいんだっけ?
最近って真っ当なサイトなら UTF-8 じゃない? Wikipedia とか。
RFCではUTF-8である"べき"とされているな
10.5と10.6は、@"にほんご"は普通に使えてるなぁ。 ソースコードはデフォルトのままUTF-8。
KVC で質問があります。class_addMethod で追加したセッタ、ゲッタが valueForKey: から呼ばれないんですが、なぜでしょう?そういうもの? サンプルコードは以下のとおりです (Obj-C 2 です) #import <Foundation/Foundation.h> #import <objc/runtime.h> @interface Aho:NSObject { } @property(retain) NSString*foo; @end @implementation Aho -(id)getter { NSLog(@"getter:%@",NSStringFromSelector(_cmd)); } -(void)setter:(id)obj { NSLog(@"setter:%@,%@",NSStringFromSelector(_cmd),obj); }
+(void)synthesizeSetterGetter:(NSString*)getterName { NSString*setterName=[NSString stringWithFormat:@"set%@%@:",[[getterName substringToIndex:1] uppercaseString],[getterName substringFromIndex:1]]; IMP getter=class_getMethodImplementation(self, @selector(getter)); class_addMethod(self, NSSelectorFromString(getterName), getter, "@:"); IMP setter=class_getMethodImplementation(self, @selector(setter:)); class_addMethod(self, NSSelectorFromString(setterName), setter, "@:@"); } +(void)load { [self synthesizeSetterGetter:@"foo"]; } @dynamic foo; @end int main(){ NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init]; Aho*aho=[[Aho alloc] init]; [aho foo]; [aho setFoo:@"bar"]; [aho valueForKey:@"foo"]; // ここで例外がでる [aho setValue:@"bar" forKey:@"foo"]; return 0; }
valueForKey: はまずアクセサを探すはずなのにおかしいね。 @synthesize foo; やって、 method_exchangeImplementations(class_getInstanceMethod(self, @selector(foo)), class_getInstanceMethod(self, @selector(getter))); method_exchangeImplementations(class_getInstanceMethod(self, @selector(setFoo:)), class_getInstanceMethod(self, @selector(setter:))); とかやるとちゃんと機能したけど、それは君の望むことじゃないか。
class_addMethod(cls, sel, imp, types) の中の、types が間違ってるから。 typese は(リファレンスで確認してね)、"返り値", "self", "_cmd", "引数..." なので、 class_addMethod(self, NSSelectorFromString(getterName), getter, "@@:"); // ×"@:" class_addMethod(self, NSSelectorFromString(setterName), setter, "v@:@"); // ×"@:@" とやると動く。
ついでに。+load で +synthesizeSetterGetter: を呼ぶとNSAutoreleasePoolがまだ できてないタイミングなので、コンビニエンスコンストラクタを使うとリークする。 setterName = [NSString stringWithFormat:..]; の所。alloc + init + release を 使おう。それか、+load でやる代わりに +initialize で呼ぶとpoolが出来た後なので コンビニエンスコンストラクタが使える。(分かった上でのサンプルならごめんよ)
みなさんありがとうございます、 おかげでうまく行きました。 型のエンコーディングをわかってませんでした。 Pool の件もどうもです。まあ数個ぐらい リークしてもよかんべ という気持ちでしたが、いけませんね。 type encoding は method_getTypeEncoding をつかった方がいいとも 職場で教えてもらいました... マルチポストみたいになってすみません。
654 :
572 :2009/12/19(土) 15:58:57
質問させてください 中にNSMutableDictionaryのインスタンスを持っている独自クラスがあって その中にどんなキーがあるかは不定です。 でそのインスタンスに対して hoge.foo のようにドットでプロパティを呼び出してNSMutableDictionaryのobjectForKeyにアクセスするようなことって出来ますか? 不定じゃなければそういうプロパティを作ってアクセッサを定義してやればイケそうな気もするけど・・ プロパティはコンパイル時の型チェックがあるのでダメそうな気がするんですが、見逃してることがあったら教えてください。
656 :
デフォルトの名無しさん :2009/12/20(日) 01:04:58
NSStringの中にxxx:yyyみたいな文字列が入ってます。 これからxxx、またはyyyを返すようなメソッドってないでしょうか? xxxの中には:は含まれず、yyyの中には:が含まれている可能性があります。 要するの最初のコロンと、それ以降に文字を分けたいのです。
657 :
デフォルトの名無しさん :2009/12/20(日) 01:18:01
rangeOfRegexとsubstringWithRangeでどうにかしました・・・
NSScanner でググると良い
>656-657と>659って同一人物なのか? 俺も普通にNSScannerでがりがりマッチング取ればいいだけ だと思うんだが。
661 :
デフォルトの名無しさん :2009/12/20(日) 11:48:34
>>660 いえ、同一人物じゃないですw
回答くれた人にそんな失礼な返事しないですよw
NSScanner使ったことないので、調べてきます。
Objective-Cというかオブジェクティブ志向のプログラミングは初めて間もないんですが、
結構クラス調べるのは楽しいですね。もっといっぱい知りたい・・・
いいのかい? 俺はノンケでも構わず食っちまう男なんだぜ
いいよ
>>661 NSScanner でももちろん出来るけど、その目的ならNSString の
-(NSArray*)componentsSeparatedByString:(NSString*)separator
でやる方が楽かと。後ろは、NSArray の
-(NSArray*)subArrayWithRange:(NSRange)range で取り出して、
-(NSString*)componentsJoinedByString:(NSString*)separator で戻してやればいい。
>>655 メッセージ式で呼び出すときはウォーニングだけで済むと思うけど、プロパティ構文は静的に解決できないとエラーになると思う。だから、プロパティでやるのは無理なんじゃないかな。メッセージ式で書けばいい話だが。
666 :
654 :2009/12/20(日) 22:36:59
>>655 ありがとうございます
遅レスすいません
別のところ(C言語で文字列の置換)でつまっていて、詳しくテストしてない状況です。ウォーニングはでるけどできるってことですね。試してみます。
リンク先も見てみます。ありがとうございます
キー値コーディングってどんなケースで使うんですかねぇ。 なんか普通のアプリで積極的に使う場面って想像つかないんですけど。 フレームワークの開発とかで使うのかな。
668 :
デフォルトの名無しさん :2009/12/21(月) 23:13:04
次の人が答えます
KVC はそれほど自分で直接呼ぶもんじゃないと思いますが、 Cocoa のいろんな部分 (KVO,バインディング) でランタイムが統一的に オブジェクトを弄れるための下支えになってます 例えば、ソースコードで -foo と -setFoo: を定義しておくと nib ファイルの中からビューをコントローラのキー foo に バインドできますが、その間の通信は KVC でやってるわけです。
結構奥が深そうですね...ちょっとずづでも探ってみまする。
>>667 一々 IBOutlet と Action をおいてセッターとゲッターを作るより、Interface Builder でどうこう出来る分生産性が上がる。
673 :
デフォルトの名無しさん :2009/12/22(火) 22:36:38
すみませんが、質問になります。 Objective-CからCのqsortを呼ぶ事ってできるのでしょうか? 第4引数をどうすればよいのか、途方にくれてます。 よろしくお願いします。
Cそのまんまだろ。それとも オブジェクトのメソッドでも突っ込む気か? その場合は関数でラッパーすれば良いだけだけど。
qsort_b って関数もあるぞ
>>673 C の配列をソートするのなら、C そのままでしょ。
Objective-C のオブジェクトは、C配列にいれないほうがいいです。
NSString* a[10]; とか余程でなければ誰も使わないと思います... よね。
NSArray つかって、ソートするときは、
sortedArray... とかいうメソッドが一杯あるので。
677 :
デフォルトの名無しさん :2009/12/22(火) 23:58:01
>>674 ありがとうございます。そのまんまなんですね。
関数へのポインタを@selectorでとかやってたら、混乱してしまいました。
>>676 そうですか。Objective-Cが独特なんで、なるべく標準を使いたいと思ったりするんですけど、
やっぱり駄目ですかねー。
IMP とかそこら辺を学ぶと幸せになれるかも。
iPhone様々ですか?
>>877 Objective-C は C のスーパーセットだから。
C++ だって C でできる事はそのまま何でも出来るでしょ。
>そうですか。Objective-Cが独特なんで、なるべく標準を使いたいと思ったりするんですけど、やっぱり駄目ですかねー。
う〜ん、他の環境から Mac へ GUI だけ移植してるんなら、そういうのも判らなくないですが、
Mac / iPhone 用に一から書いてるなら諦めて Cocoa の使い方覚えたほうがいいと思います。
どうせ method の引数に文字列なら NSString, 配列なら NSArray を渡さないといけない事が
しばしばあるので、どうせ使い方覚えないといけなくなりますし。
681 :
654 :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をつかうので必要ないといわれればそれまでなのですが。 お願いいたします
なんでココなんだよ。 自分でスレ違いって分かってるんだからC言語のスレ行けよw そっちじゃいけない理由でもあるのか?
gcc の設定の問題で、Obj-C とも Mac と関係ない話だから、適切なところへ行ってくれ
はあ・・・低能さんって・・・
なんだか文法がいちいち長ったらしくて萎えるんですけど.. 文字列比較すんのに if ([a compare:b] != NSOrderedAscending) { : } とか、めんどくせーし、英語に慣れてないとぱっとみどう比較してんのかわからんちゅーの。 VBだったら if a >= b then : end if ちょーシンプル。ほんと萎えるよ。英語が分る人には読み易いのかもしんないけどさ。はぁ...挫折しそ
>>685 そのVBの記述だとエンコーディング考慮出来ないじゃんw
C Stringで出来る所はそうすればいいし。そうでないところは
Foundationでやればいい。どちらも取れるんだから。
>>685 英語の勉強になると思って頑張ってください。
物事こころの持ちようですよ。
挫折したければ挫折しても良いんだし。
688 :
デフォルトの名無しさん :2010/01/11(月) 16:13:44
例えばオブジェクトAがあるオブジェクトBを中で生成(alloc)して帰す場合、そのオブジェクトBをreleaseするのはオブジェクトAの責任なんですよね? で、そのオブジェクトBを配列で返すようなメソッドを書く場合 return [[NSArray alloc] initWithObjects:objectB, nil]; としてしまうと、だれが、このNSArrayをreleaseするのかってなっちゃいますよね? つまり、この場合NSArrayもオブジェクトAのメンバ変数に保持しないといけないってことでしょうか?
つ autorelease
690 :
デフォルトの名無しさん :2010/01/14(木) 19:55:11
return [[[NSArray alloc] initWithObjects:objevtB, nil] autorelease]; とするか、 return [NSArray arrayWithObjects:objectB, nil]; とすべき。
関係ないけど、s無し単数形の -[NSArray initWithObject:]もあるよ。
692 :
デフォルトの名無しさん :2010/01/16(土) 21:17:35
最近 Objective-C 2.0 を始めたんですが、ガベコレについて質問です。 ガベコレって retainCount が 0 になったインスタンスを自動的に解放してくれるだけで、 retain, release によるメモリ管理は必要なんですよね? NSAutoReleasePool でメモリ管理をしないでよくなった、という理解で良いでしょうか。
C++は0xとか模索されてて鋭意進化中だけど、Objective-C は 3.0 が出来るとしたら、どんな拡張になるのかな?
特にこれといって欲しい機能もないしなあ。 名前空間くらいか。
無名関数、ラムダ式、ジェネリックは欲しい。 ちゅうかC++ 0x のコンパイラなんぞ実装するベンダーあるのかね。 IDE込みで考えると、かなり大変そうだけ。
詳しくは知らんのだが、ブロック構文はラムダ式の代わりにはならんの?
>>696 >無名関数、ラムダ式、
無名関数とラムダって違うの?
Blocks のクロージャじゃダメなの?
クロージャなんてものがあるのか。知らなかった。これ使いまくろ。
>>696 >ジェネリック
動的束縛な言語にジェネリックって必要か?
ジェネリック・プログラミングも、カテゴリを利用して出来るんじゃないの?
Blocksなんて機能あったんだ? 荻原本にも書いてないやんけ!
Dyna本にも書いてないよな、何故か知らないけど。
本にのってないのは、block は snow leopard からの機能だからでしょ。 Objective-C の拡張というよりは C そのものの拡張という 位置づけにしたいらしいよ、Apple は。 まあ多分ほかにどこも採用しないから、 実質 Objective-C の機能という認識になるとおもわれるが...
>696 フル実装はしばらくかかるかもしれないけど gcc も VC も既に機能の取り込みを始めてるし、 C99 と比べれば段違いだと思われ。
木下本が出たのは雪豹後だったはず。
>>706 あれは マイコミジャーナルに長期連載されてたのを
まとめただけだから仕方がないね
せめて 2.0 ランタイムについて一章だけでも付け加えてくれたらよかったんだが、
あれを買って 10.6 で実際にやってみようとしてはまってるひとが
ときどきこのスレやら新 mac 板の Cocoa スレにでますね
あるクラスが持つプロパティの属性をassignにするべきか、retainにするべきか、copyにするべきかで悩んでしまいます。 結局わからないから、とりあえずassignにしとけってことが多いです。 独立性の高いクラスの場合はretainで保持した方がいいのかなと思ったりするんですが... 何か指針みたいなものってあるんでしょうか? それとも経験的な勘でみなさん決めてらっしゃるんでしょうか?
最終的にどのタイミングで release されるか、を考えておくべき。
やっぱりオブジェクト型のプロパティはretainしてdeallocでreleaseしといた方が確実なんですかねぇ。 autoreleaseされたプロパティを渡される可能性もあるし。 となるとassignの使いどころって、数値型や文字列とかのプリミティブ型に対してってことになっちゃいますかねぇ... copyは...ゔーん、まいっか。
>>711 delegate や target など、 retain にすると循環参照でリークする人が
出そうなものは少し考えたうえで assign にしたりする。
知らぬ間に内容を変更されたくないオブジェクトで、 retain で受けると
mutable string を渡したあとで中身を変更する人がいるかもしれないな、
などと心配する暇があるときは copy。
面倒なときはどっちも retain にしといて使う側が気を付けることにする。
あぁdelegateね、これは確かにサンプルとかみてもassignにしてあるのが多いですね。 まだ覚束ないですが、少し自分なりに整理できそうです。ありがとうございしました。
Xcodeって「¥」と「¥」(バックスラッシュ)って区別されてんのね。どおりで¥n入れても改行せんわけだわ。
XCode が、じゃなくて、標準のユニコードがそうなだけ
C と c は区別したーい
Google は最早 Apple の敵だが、参考にしよう。
敵判定って空しくなるだけ。
Googleは、アップル製品をアク禁できるんだから、Googleに戦う気があったら勝負にならない。
- (int)hoge:(int)a; みたいなメソッドを、performSelector:withObject: のように(SEL)と引数を与えて動かす方法ってないのかな? int を NSNumber にするしかない?
>>721 面倒くさいが、NSInvocation を作って動かすとか。
id invocation = [NSInvocation invocationWithMethodSignature:
[piyo methodSignatureForSelector:@selector(hoge:)]];
int arg = 1;
[invocation setArgument:&arg atIndex:2];
[invocation invoke];
int rtn;
[invocation getReturnValue:&rtn];
ターゲット設定してなかった。[invocation setTarget:piyo] をやるか、 [invocation invokeWithTarget:piyo];
>>722-723 NSInvocation って以前見かけて、結局使い道が分からなくて放置してたクラスだけど、色々調べてみます。
ありがとう。
725 :
デフォルトの名無しさん :2010/01/31(日) 23:32:14
>>720 Macユーザのシェアがごっそりなくなるから無理だろうな。
それはぶっちゃけ言うほど痛くない
Google使えなくなったら大部分は乗り換えるだけ。
Google社員にもMac愛好家くさるほどいんのにそんな誰得の展開になるわけないだろ 使えなくしたらグーグルの勝ち〜とか発想が幼稚すぎるわ おまえらなんでそんなに頭悪いの とてもプログラミングできるような頭じゃないと思うんだがなんでこのスレにいんの
キミ凄いね
社員の趣味と企業戦略を一緒くたにして話す奴も大概頭悪いと思う
なんでプログラマやデザイナやミュージシャンとかクリエイティブなやつらにMac使いが多いか考えたことないだろ Macを除外する企業戦略とかニートや低脳厨房の発想
理由は唯一つ お洒落だからですが何か
プログラマはねーよww
(クリエイティブな)ブログラマってことだろ
735 :
デフォルトの名無しさん :2010/02/02(火) 22:54:44
>>731 デザイナーとミュージシャンにMacが多い理由は、割れの巣窟だったから。
写真屋とか、9割が違法コピーって言われてた。
開発環境がそっくり入ったUNIXマシンなんだからプログラマが選んでも 何の不思議も無いと思うが
Googleの中の人とか、Ruby on Railsの人とか、イケテルプログラマはMac使いが多いね。
Linus ってイケてたっけ?
PDFをネイティブにサポートしてるからPDFのドキュメントも読み易いしね。 あとLeopard以降は64bitアプリそのまま使えるから、64bit版OSインストール し直しなんて手間も要らない。
MacはUNIXなんだから、ドザじゃないまともなプログラマはMac使う
犯罪者が必死だな。
あらやだ くやしいんですね だいじょうぶですよ がんばって知能つけましょうね
カンファレンスや勉強会に行くと、もう過半数がMacだなぁ。 発表者なんか下手すると9割くらいMac。サポートがしょぼいはずのJava系ですら半分がMac。 個人的に、2kgを超えるモバイルマシンなんざありえねぇと思ってるので、正直理解できん。Airは中途半端すぎるし。
個々は GNUStep, Cocotron もふくめた Objective-C のスレですよ! Mac の話題なんてとんでもない!ぷんすか
StepStone ってどうなったんだっけ?
プログラマは、技術的に面白い物は全部触ってみたくなる人種だ。 OSXとLinuxとWindowsが全部動くマシンがMacしかない以上、 他に選択肢は無い。 電話もiPhone持ちが大半だが、加えてAndroidも持ってたりするぞ。
複数持つだけ 全部動くからという理由じゃ選択しないよ
一人暮らしでもマシンが複数台あってLANでつながってるのが当たり前だと思うんだが。
最近は仮想マシンでも十分な性能が出るから、うちはハードは1台だよ。
はーどうしたどうした
>>750 新しい機種を導入するたびに前のは破棄してるのか
CocotronでWin用のアプリ作ってみたひといませんか? 実用的ならうれしい。
755 :
デフォルトの名無しさん :2010/02/06(土) 22:18:35
初心者です。質問させてください。 stringWithCStringを使うと、コンパイル時に warning: ‘stringWithCString:’ is deprecated がでました。 stringWithCStringの代わりに何を使うのがよいですか?
Xcodeのヘルプメニューからたどれるドキュメントを読みましょう。 またはメソッド名 (stringWithCString:) のところでOption+ダブルクリック
初心者はこのスレに来るな
え〜っ、なんで?
>>752 他人にあげたり、捨てたり、死蔵したり
>>755 >stringWithCStringの代わりに何を使うのがよいですか?
stringWithCString:encoding:
複数のPCがあっても仮想マシン導入して、前のは捨てるのか。 どのくらいのペースで買い替えてるんだろう。 うちはしょっちゅう買ってるから1人暮らしなのにPCは常時7〜8台あるわ
もはやPCを買うことが目的になってるな。
>>758 冗談でつ
でも質問が下らな過ぎてちょっとうんざりした。最近はドキュメント読まないゆとりが増えたのかなー。
>>762 うちはこないだ新人向けに調べ方の調べ方マニュアルを作ったな。
よくあるのがググる先生に頼りすぎて、ヘルプや付属ドキュメントを読まないとか。
調べ方マニュアルじゃなくて、 調べ方の調べ方マニュアル、なのか?それはメタだなぁ...
メタメタにしてやんよ
お願いします。
メメタァ
うわあああああぁぁぁああああ!!!
バルス
ふぅ..
771 :
デフォルトの名無しさん :2010/02/15(月) 02:45:53
Objective-C入門3日目の初心者です。 フォルダのファイル一覧を、とりあえずコンソールに出してみようとしています。 本やWebを参考にして次のようなコードを書いたのですが、エラーがありうまくいきません。 添削していただけないでしょうか。 初心者は来るなってことだったのですが、 Objective-C初心者はどのあたりにいけばよいでしょう? #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSString *rootpath = @"/Public"; BOOL result = YES; NSArray *contents = [[NSFileManager defaultManager] directoryContentsAtPath:rootpath]; int i; for (i = 0; i < [contents count]; i++) { NSString *name = [contents objectAtIndex: i]; NSString *path = [dirPath stringByAppendingPathComponent:name]; BOOL isDir; NSLog(@"\n%@", path); } return 0; }
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; NSString *rootpath = [NSHomeDirectory() stringByAppendingPathComponent : @"Public"]; NSArray *contents = [[NSFileManager defaultManager] directoryContentsAtPath : rootpath]; for (NSString *name in contents) NSLog(@"%@", [rootpath stringByAppendingPathComponent : name]); [pool release]; return 0; }
一見して良いように見えるが、どんなエラーがでるの? 僕らだってエスパーじゃないから、「エラーがでます」じゃわからんよ。 コンパイルエラーならコンパイルエラーを書き写してもらわんと困るし、 実行時のエラーならどんなエラーなのか書いてください。 「エラーがでます」とだけここに書き込むのは、 エラーが出て、エラーメッセージを解読する気がないという気がします それではプログラムは上達しませんよ。 単に ~/Public になんもファイルがないだけでは、と言う気がします。
774 :
デフォルトの名無しさん :2010/02/15(月) 10:58:25
>>772 おお。ありがとうございました。
早速実行したところ、
warning: 'directoryContentsAtPath:' is deprecated (declared at /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSFileManager.h:164)
と警告が出てビルドできませんでした。
これは、どこを見ればよいのでしょう?
というか、NSFileManager.hの164行なんだと思うので、
見たところ、
- (NSArray *)directoryContentsAtPath:(NSString *)path DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
という行でした。
NSString *rootpath = [NSHomeDirectory() stringByAppendingPathComponent : @"Public"];
NSString *rootpath = [[@"~" stringByExpandingTildeInPath] stringByAppendingPathComponent : @"/Public"];
などいくつか試したのですが、どうしてもうまくいきません。
英和辞書をお奨めする
雑談と初心者いじりしかやらないよねMac系の開発スレって
このレベルから教えるのは正直きっついな
警告だからコンパイルは一応通ってるんじゃないの? OS 10.5以降は非推奨メソッドだから使わないでねって警告なんじゃないの?
>>774 コンソールを表示してみ。
> ビルドできませんでした。
嘘付かないでね。
>>776 これがわからないってことは、リファレンスどころか警告すら読めてないってことでしょう。
その状態でObj-Cで開発やるのはかなり厳しいよ。
で、「(やる気があるのなら)英和辞書をお奨めする」ってことなんだけどな。
それとも警告出るたびに聞きに来るの?
そういうレスだけは饒舌だなw
まぁまぁ^^;
むしろ 「Cocoaスレに行け」とか 「Mac プログラミングスレに行け」 って言われなかったのが奇跡だな… # Foundation Framework ネタはどこが適切なんだろ…?
内容ジャンル的にはここでも問題ないと思うが、このレベルの無知無知初心者を相手にするのも大変だろう。
deprecatedはもうすぐなくなるよってこと。今はまだある。 これはすごく親切な警告。 なのでdirectoryContentsAtPath:をopt+ダブルクリックしてみる。リファレンスが表示される。 Special Considerations Because this method does not return error information, it has been deprecated as of Mac OS X v10.5. Use contentsOfDirectoryAtPath:error: instead. って書いてあるので代わりに contentsOfDirectoryAtPath:error: を使う。
調べ方教えたんだから同じ内容ではもう来るなよ
787 :
デフォルトの名無しさん :2010/02/15(月) 19:44:43
>>775-786 まあそうおっしゃらずに、
もうすこしおつきあいいただけないでしょうか。
さきほどのファイル一覧は、あらためてプロジェクトを作り直したら、問題なく動きました。
一覧も取得できました。
失敗したときは、まだトライ&エラーの段階なので、
ひとつのプロジェクトのソースを全選択して、
消しては新しいソースを貼りつけて、
実行していたのです。
ソースじたいは変更していないのですが、
ともあれお騒がせしました。
で、次なのですが、いちおう辞書片手に読んでますけど、
(1)デバッグ中に変数に代入されているデータを見る方法
(2)コンソールコマンドから、テキストエディタとかのGUIアプリケーションを実行できるのか?
の2点を教えていただけないでしょうか。
(1)ブレークポイントを設定してみるものの、
そのデータが具体的になになのか、確認するには、
どこのメニューでどれを見ればよいのでしょう?
(2)ソースは次のとおりで、実行すると、デバッガコンソールでいろいろ表示したあと、
(gdb)というモード? になり、期待していたように、
テキストファイルをテキストエディタで表示はしませんでした。
そもそもこういう方法で、外部のアプリケーションを起動できるんでしょうか?
アドバイスお願いします。
788 :
デフォルトの名無しさん :2010/02/15(月) 19:46:20
#include <Foundation/Foundation.h> int main() { NSTask *noteTask = [[NSTask alloc] init]; NSMutableArray *noteArgs = [NSMutableArray array]; NSString *path; path =[[NSHomeDirectory() stringByAppendingString:@"Public/tmp.m"]; // configure note [noteArgs addObject: path]; [noteTask setLaunchPath: @"/Applications/TextEdit.app/Contants/MacOS/TextEdit"]; [noteTask setArguments: noteArgs]; // launch applications [noteTask launch]; // wait applications return 0; }
>>787 (1)
ブレークポイントで停止したら適当な変数名にカーソル合わせる
またはデバッガコンソールで p コマンドか po コマンド使う
p は C の基本データ型、 po は ObjC のオブジェクトの内容を表示する
p intVar
po object
po [object value]
てな具合
あとは help コマンドで調べて
(2)
>[noteTask setLaunchPath: @"/Applications/TextEdit.app/Contants/MacOS/TextEdit"];
Contants じゃなくて Contents な
「いろいろ表示」された中に手掛かりが書いてある、ちゃんと読めよ
親切だなぁ
791 :
デフォルトの名無しさん :2010/02/15(月) 22:27:00
792 :
デフォルトの名無しさん :2010/02/18(木) 23:36:01
Objective-C気持ち悪い
793 :
デフォルトの名無しさん :2010/02/18(木) 23:48:27
テキストフィールドに入っている文字のバイト数が一定値以上だったらエラーを出したいのですが NSLog(@"OK %d", MAX_TITLE_LENGTH-strlen([[tfThreadTitle text] cStringUsingEncoding:NSShiftJISStringEncoding])); if(MAX_TITLE_LENGTH-strlen([[tfThreadTitle text] cStringUsingEncoding:NSShiftJISStringEncoding])<0) { NSLog(@"haitta"); return; } その一定値を超えてもこのif文に入ってくれません。 NSLogで数値の確認をしてみたのですが、-2となっているのにも関わらず、 直後のif文の判定を素通りしているようです。何が原因なのでしょうか。。助けてください。。
>>793 NSStringのUTF8Stringを使ってconst char *型の文字列の先頭ポインタを取得して使う。
>>793 strlen の戻り値は符号なしだから、> の左辺はマイナスにならないよ。
if (strlen(...) > MAX_TITLE_LENGTH)
と書くべき。C 言語からやり直しだね。
796 :
デフォルトの名無しさん :2010/02/19(金) 02:25:05
>>794-795 ひゃあ、ありがとうございます。
strlenの戻り値はunsignedなんですね。。。
ありがとうございました。
NSString*を返り値として返す関数があるのですが、 NSString* func() { NSString *str = [[NSString alloc] initWithFormat:@"%d", 1]; return str; } 例えばこういう場合って、どうすればいいのでしょうか? releaseしたらreturnできませんし、returnしたらreleaseできませんよね?
>>797 まさにそういう時のためにautoreleaseがあるのだよ
お〜autorelease!! ありがとうございます! [[[NSString alloc] initWithFormat:@"%d", 1] autorelease]; でいいんですよね!ありがとうございますっ!
この場合stringWithFormatもあるけどな。
801 :
デフォルトの名無しさん :2010/03/03(水) 23:55:05
iPhone作りたいんですけど、なにせwin野郎なんでMac全然勝手が分かりませんw とりあえずiPhone用の開発環境揃えたいんですけど、お勧めセット一式誰かお願いできますか? あと、windows系とのネットワークファイル共有って簡単にできるでしょうか?
802 :
デフォルトの名無しさん :2010/03/03(水) 23:57:28
まだ、ソフトもハードも無いので、勧めセット一式はソフトハードセットでお願いできるとありがたいです。
スレ違い。死んでくれ。
804 :
デフォルトの名無しさん :2010/03/04(木) 00:01:26
Objective-C気持ち悪い
じゃあ Objective-C は代わりにおじさんがやっておくわ
806 :
デフォルトの名無しさん :2010/03/04(木) 00:04:27
Appleて、現代的な言語作ってないんだよな
ObjC が最強過ぎるからな
808 :
デフォルトの名無しさん :2010/03/04(木) 00:11:26
Objective-Cなんて糞は正直触りたくない
代わりに俺が触っておくから、寝てて良いよ
お前に触られるぐらいなら死んだ方がまし
いや、お前を触るわけじゃねえw
812 :
デフォルトの名無しさん :2010/03/04(木) 00:25:01
813 :
デフォルトの名無しさん :2010/03/04(木) 00:26:21
iPhone作りたいんですけど、なにせwin野郎なんでMac全然勝手が分かりませんw とりあえずiPhone用の開発環境揃えたいんですけど、お勧めセット一式誰かお願いできますか? あと、windows系とのネットワークファイル共有って簡単にできるでしょうか? まだ、ソフトもハードも無いので、勧めセット一式はソフトハードセットでお願いできるとありがたいです。
>>802 ソフトは登録してダウンロードするだけだよ
ハードは現行機種なら何でも良いけど、メモリ多めの方が何かと良いよ
>>813 iPhone作りたいなら中国の工場に就職しろ
>>813 こんな質問してるくらいだから、多分無理なんだろうな。
下手に教えないほうがいいぞ。手を出し始めたらこのスレがくだらない質問であふれかえってしまう。
>>813 MacProとCinemaDisplayオススメ
あとFinalCutStudioとLogicかな。
なんやかや結局揃えるハメになるので最初にまとめて買っておくが吉。
ノートで十分とか言う奴がたまにいるが、デスクトップだとアプリのビルド時間が断然早く作業効率が非常に良い。
Windowsとの共有は簡単にできるよ。
とりあえずインテルのMac mini買えばあとはオンラインで全部そろう それでエミュレーションで動かしてから考えるといいんじゃないかな
>>818 どもどもです、とりあえずそれでいってみようかと思います。
リソースの編集もMac側でやった方が効率いいですかね?
コードだけそっちで作ってみようかと目論んでいたのですが・・・
>>820 どっちでもいい。
あと最初にしっかりガンマ特性や色温度の管理うぃやっておけば、
実機で印象が変わったりジャギーが目立つ等の問題も避けられる。
(ある程度までは、だけど)
>>818 アプリのビルド時間が早くなるって、どういうことだ?
マシンの性能差だろ。
824 :
デフォルトの名無しさん :2010/03/07(日) 01:53:25
iPhone用のアプリを作っていますが、NSDictionaryの使い方で悩んでいます。 以下の1行で、プログラムの実行が異常終了してしまいますが、理由がわかりません。どなたかヒントをいただけませんか? sControls = [NSDictionary dictionaryWithObjectsAndKeys: display1, card1, display2, card2, display3, card3, display4, card4,nil]; ただし、 IBOutlet UILabel *display1; IBOutlet UIButton *card1; IBOutlet UILabel *display2; IBOutlet UIButton *card2; IBOutlet UILabel *display3; IBOutlet UIButton *card3; IBOutlet UILabel *display4; IBOutlet UIButton *card4; です。 最初は、card1〜card4のいずれかがnilで、その結果NSInvalidArgumentExceptionが起きているのでは?とデバッガで値を検査しましたが、そうではありませんでした。
デバッガのコンソールメッセージは以下の通りです。 よろしくお願いします。 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 )
一旦MutableDict 作って、一個ずつKey と Objectを設定してみろ。
>>824 keys must conform to the NSCopying protocol
メソッド名を良く読めって話だな。割と罠ポイントだとは思うがw
もうvisual studioもeclipseも触りたくない。
そんなあなたにNetBeans
831 :
デフォルトの名無しさん :2010/03/20(土) 09:23:49
ニコ厨死ねよ
口半開きってやっぱダメだな
あの、ポインタに対して使う * っていうのは、内容を複製して渡すのでしょうか? 例えば、NSTextField* field があったとして、 isnumber(*[field.text UTF8String]) としたとしますよね。この場合、[field.text UTF8String] だけで渡そうとすると ポインタだからダメ、みたいな感じで怒られますが、*を付けるという事は その中身を渡すという事ですよね? 中身を渡すというのは、そのポインタが指す中身を複製してその関数に渡して いるのでしょうか? 質問がうまく伝わっていなかったらすみません。どうも中身を渡すというのが どういう意味なのかがよく分からなくて…。Objective-C 以前に C が分かって いないのでおかしな事を言っていたらすみません。
すいません、NSTextField -> UITextField の間違いでした。
>>834-835 Cは(Objective-Cも)値渡しだから、ポインタだろうがなんだろうが
渡すときは常に中身がコピーされる。
ポインタを渡したときは、コピーされるのはポインタの値だから
中身はコピーされないな。
中身を渡したら中身がコピーされるだろう。
>>836 中身っつうか、渡したものが常にコピーされるってことね。
分かりにくかったらすまん。
>>834 >あの、ポインタに対して使う * っていうのは、内容を複製して渡すのでしょうか?
合ってる、けど「中身」が何であるか勘違いしないように
[field.text UTF8String] は char * を返すんだが、この場合の中身は
先頭の1文字であって文字列全体じゃないからな
839 :
834 :2010/03/23(火) 16:42:01
>>836 ありがとうございます。
ポインタを渡したらそのポインタの値がコピーされるという事ですよね。
>>838 ありがとうございます。
そうそう、そこも不思議だったんですよね。実際に isnumber はどう
処理しているのでしょう?アドレスに1ずつ足していきながら NULL 文字
がくるまでを文字列と判断するのでしょうか?
ソースを探したんですが見つからなくて…。
isnumber が扱うのは「(所謂)文字列」ではなく「文字」だよ。
>>839 >アドレスに1ずつ足していきながら
「文字列」(char *、つまり連続した文字の先頭へのポインタ)を受け取る関数についてはその通り
ただ isnumber は
>>840 が言うとおり「文字」(char)を受け取って、
その1文字が数字どうかを判別する
>>840 , 841
げげっ!そうなんですね、という事は、何らかの NSString が数値として
解釈できるかどうかは、何か別の方法で判定しなくてはいけないという事ですね。
Objective-C というよりは Cocoa っぽい話題で申し訳ないですが、皆さんは
ある NSString が数値として解釈できるかどうかはどの様に判定していますか?
NSNumberFormatter ?
!
>>843 NSNumberFormatter 使ってみたんですが、例えば aiu6 とかが蹴られるのは
いいんですが、6aiue とかやると解釈されちゃうんですよね。
厳密モードみたいなものがあるのかと思ったんですがないし…。
正規表現とかでやるしかないんでしょうか。と思ったら Cocoa には正規表現を
するためのクラスがないんですね、ガーン…。困った…。
ogrekit
-[NSNumberFormatter getObjectValue:forString:range:error:] が使えるんじゃないかな。 自分は libc の strtol() 系で事足りてるから使ったことないけど。
sscanf()のObjective-C版が欲しいと思ったことありませんか? UTF-8が処理出来るとかなり違うかと思うのですが。
NSScanner
>>847 やってみたんですが、やはり 0aiu みたいなものは解釈されてしまうみたいですね。
しょうがないので、数値かどうかを判断する関数を作り、とりあえずそこで数値と
判断したものだけ実際に数値に変換させる様にしました。
どうもおさわがせしました。でもなんか楽しいですね、Objective-C を頑張って
覚えたいです。
-getObjectValue:...より簡単な-numberFromString: は使ってみたか?
自分の環境では6aiueはNULLを返す。
厳密モード的な動作は -setLenient: で切り替えられると思うが,NSNumberFormatterのAPIページくらい目を通したか。
ただ6aiueの解釈には影響ないみたいだが。
あるいはgetObjectValue:...を使いたいなら
>>650 の通りだな。
853 :
834 :2010/03/25(木) 18:27:08
>>852 ありがとうございます。
もちろん numberFromString は使ってみたのですが、普通に
数値として返ってきてしまうので困っていました。
setLenient も指定してみましたが、効果がありませんでした。
やり方がいけなかったんですかね…。家に帰ってもう一度やってみます。
shouldNotImplement: や notImplemented: って、 may not respond to '-notImplemented:' ではなくするには何をインポートすれば良いんだ? #import <objc/Object.h> やっても意味無いようだけど。 当方OSX 10.6。
>>854 - (id)hogehoge {
return [self notImplemented:nil];
}
こうなってんじゃないの?
子クラスで -hogehoge を再定義すれば
>>855 ? いや、
- (void)hoge {
[self notImplemented: _cmd];
}
をエラー無くビルドしたいんだけど。notImplementedされてるクラスを云々じゃなくて、自分でnotImplementedしたいんだ。
今クラスクラスタ作ってるところで。
>>856 ああすまん
自分で空の -(void)notImplemented: を定義すりゃいいんじゃね
NSArray* array = [NSArray arrayWithObjects:@"a",@"b",@"c",NULL]; みたいな、オブジェクトをカンマで区切って複数指定できるメソッドって、 定義する側ではどう書くのでしょうか? もしや、カンマで区切って繋げると自動的に NSArray に変換してくれたり しているんでしょうか??
先生、「可変長引数」という単語を知らない人はどうなりますか…。 という冗談は置いておきまして、ありがとうございました。 ただ、可変長引数という単語で検索してもほとんどきちんと解説している サイトってないですね…。「va_list」とか「va_start」とか一体何者なのか 分かりませんし…。まぁとにかくそのあたりから調べてみる事にします。 ありがとうございました。
861 :
デフォルトの名無しさん :2010/04/05(月) 12:54:31
これだからゆとりは
ダイナミック本ってどうなの
索引付いてないし装丁も粗いし、Webの奴読んでりゃ良いと思うよ。
最近のプログラマーはやった物勝ちなんだな
objc2 runtime 関数 const char *class_getIvarLayout(Class cls); について質問です。 この layout というのは、どういうものなのでしょうか? ソースコードを調べていくと、objc-runtime-new.h に class_t 構造体->class_rw_t 構造体->class_ro_t 構造体->uint8_t *ivarLayout となっていて uint8_t*型だとわかりましたが、何の値を示すものなのでしょう? よろしくお願いします。
866 :
865 :2010/04/14(水) 15:44:41
解決には至っていませんが… objc-layout.m に GC につかうもの、っぽいことが 書いてあります。が、いまいちどうなっているのかよく分からないので、 ご存知の方がいらしたら、ご教示お願いいたします。 /********************************************************************** * Object Layouts. * * Layouts are used by the garbage collector to identify references from * the object to other objects. * * Layout information is in the form of a '¥0' terminated byte string. * Each byte contains a word skip count in the high nibble and a * consecutive references count in the low nibble. Counts that exceed 15 are * continued in the succeeding byte with a zero in the opposite nibble. * Objects that should be scanned conservatively will have a NULL layout. * Objects that have no references have a empty byte string. * * Example; * * For a class with pointers at offsets 4,12, 16, 32-128 * the layout is { 0x11, 0x12, 0x3f, 0x0a, 0x00 } or * skip 1 - 1 reference (4) * skip 1 - 2 references (12, 16) * skip 3 - 15 references (32-88) * no skip - 10 references (92-128) * end * **********************************************************************/
コメントを読んだ感じだと、 あるオブジェクトが他のオブジェクトを参照するのに使っているポインタ領域が どのオフセット位置にあるのかを表しているように読める。 例として書いてある { 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 については最近出た本を参照。
868 :
865 :2010/04/15(木) 20:40:07
>>867 「ニブルの上位下位」のところがよく分からなかったんですが、なるほど、
そういう意味だったんですね。分からなかった「ニブル」の意味も何となく
分かりました。ありがとうございます。
もう一つお教えください。GC についてですが、最近新しい本が出たのでしょうか?
> 868 byte : 8 bit nibble: 4 bit これはbyte -> bite (かじる)にひっかけて 「ちょこっとかじる」という意味のnibbleをbyteの半分を 指す様になった。 ほとんど冗談の様なネーミング。
じゃあニブルはニップルをかじってるのか
byte -> bite じゃなくて bite -> byte だよね bite が byte の語源
継手のニップルってそのまま形から来てるのか
874 :
865 :2010/04/15(木) 21:14:47
>>869 レスありがとうございます。
その話、何かで見たことがありました!完全に忘れていましたが・・・
おかげでもう忘れない気がします(笑)
875 :
865 :2010/04/15(木) 21:16:46
あれ、書いてるうちに… みなさん、ありがとう。
ちくびと聞いて
+(void)hoge; じゃなくて +hoge; って宣言を見かけたんだが、これはなんだ?
int hoge;
+ (id)hoge; だよ。
hage
882 :
865 :2010/04/19(月) 09:30:11
>>876 カメレスでごめんなさい。本の情報ありがとうございます、手に入れて読んでみます。
@interface MyObject : NSObject + (void)hoge; - (void)piyo; @end @implementation MyObject + (void)hoge { NSLog(@"hoge");} - (void)piyo { NSLog(@"piyo");} @end @interface MyMyObject : MyObject @end @implementation MyMyObject + (void)hoge { NSLog(@"hogehoge");} - (void)piyo { NSLog(@"piyopiyo");} @end @interface MyMyMyObject : MyMyObject @end となってて、MyMyMyObject で祖父クラスのメソッドを呼ぶ時って、 @implementation MyMyMyObject クラスメソッドの場合はコレで良いとして、 + (void)hoge { [[[self superclass] superclass] hoge]; } インスタンスメソッドの場合は、IMP取得くらいしかないのかね? - (void)piyo { IMP imp = class_getMethodImplementation([[self superclass] superclass], _cmd); (*imp)(self, _cmd); } @end supersuper とか無いし。
>>883 親でover-rideされてるにも関わらず祖父を直接見るなんて、そもそもの設計が大間違いなのでは?
と Obj-C 初心者が言ってみる。
メッセージングでやる場合。 - (void) piyo { struct objc_super superSuper = {self, [[self superclass] superclass]}; objc_msgSendSuper(&superSuper, _cmd); } あとは、class_replaceMthod 等でメソッド入れ替えなども可。
[[self superclass] superclass]とかやると、 MyMyMyObjectのさらにサブクラスを作ったときにハマるな。
[self superclass] == [super superclass] であることを知って驚いた14の春
888 :
デフォルトの名無しさん :2010/05/01(土) 11:17:15
890 :
デフォルトの名無しさん :2010/05/01(土) 20:43:49
superclassメソッドをサブクラスでオーバーライドしないかぎり、[self superclass]とやっても、[super superclass]とやっても、呼び出されるメソッドは同じ。 さらに、[self superclass]も[super superclass]も、レシーバーはselfになる。 詳しくは、Objective-Cのruntime APIを見てください。
>>883 祖父クラスが基本的なメソッドを提供していて、子クラスでオーバーライドしたんだけど
孫からも基本的な処理へのアクセスが必要だというような場合は祖父クラスで hoge を
basicHoge として別名でも提供しておくという Smalltalk 流の作法で済ませられない?
スレ違いかもしれませんが質問ですm(_ _)m NSData型の変数に4バイト、例えば 0x00 0x00 0x00 0x7F と入ってる場合、これをInt型の127に変換するには どうすればいいのでしょうか?
int a = CFSwapInt16(*(SInt32*)[data byte]);
ミスった
895 :
892 :2010/05/09(日) 12:02:34
回答&ヒントありがとうございます。 int a = CFSwapInt32HostToLittle(*(SInt32*)[data bytes]); で、まだ意味はぼんやりとしか分かってないですが、 無事期待の動作が得られました。
896 :
デフォルトの名無しさん :2010/05/18(火) 10:45:41
質問です。iPhone用プログラムを書いていますが。 NSInteger index = random() % count; NSInteger index2 = random() % count; while(index2 == index) {//同じにならないように NSInteger index2 = random() % count; } とやって、二種類のランダムな数字を発生させようとしていますが、 何度かランダム数を発生させるとプログラムがストップしてしまいます。 なにがいけないのでしょうか。どなたかご教授願います。
NSInteger index = random() % count; NSInteger index2 = random() % count; while(index2 == index) {//同じにならないように NSInteger index2 = random() % count; // このindex2と前のindex2は別物 } 一つ目のindex2と二つ目のindex2は別物です。 while(index2 == index) {//同じにならないように index2 = random() % count; // 宣言しない } としてください。 // 変数が隠されてしまっている とか警告出ませんでした? // 変数スコープとかその辺の話も調べてね
日本の未来が心配です。
あまりにもあんまりな問いで最初何が駄目なのかわからなかった
900 :
896 :2010/05/18(火) 11:35:51
>>897 うぉぉ、当たり前ですよね。コピペしてたのが間違いでした。
ホントにあんまりな質問に回答して頂き、ありがとうございました。感謝感激です。
あ〜恥ずかしい。
901 :
デフォルトの名無しさん :2010/05/18(火) 14:20:24
すみません、質問させてください。 iPhone用アプリのプログラムを最近始めた初心者です。 <質問> iPhoneから外部DB(postgreSQL)に接続する手法がわかりません。 色々調べましたがピンと来なかったのですが、Object-Cから直接DBConnect するような方法は無いのでしょうか? XCode自体、初心者なのでよくわからないのですが、 1. Ruby?を利用する 2. java+JDBCを利用する のような感じになるのでしょうか。 ヒントだけでも教えていただけたら助かります。 宜しくお願い致します。
ググレカス
この質問前どっかで見た気がする
904 :
デフォルトの名無しさん :2010/05/18(火) 17:10:02
質問です。 UIScrollViewで画面より大きい画像を表示しているとき、画面に写っているのは、 ScrollView上でどの位置(座標)なのかを取得するにはどうしたら良いでしょう? 検索をしても、タッチした座標の検出しかわかりませんでした。 よろしくお願いします。
スレチ。
906 :
デフォルトの名無しさん :2010/05/21(金) 15:12:54
基本的なことなのですが、いろいろ調べてもわからなかったので質問させてください。 あるファイル(A.m)から、別のファイル(B.m)のクラス( -(void)test{...} )にアクセス するにはどうしたら良いのでしょうか? B.hをA.mにimportして、A.m内で[self test]とやってみましたが、警告が出てうまく ビルドできませんでした。 低レベルな質問ではありますが、よろしくお願いします。
>>906 自分も初心者だけど、A.m内でBのインスタンスを作ってないんじゃ?
A.m内で[self test]ってしても、selfはAのインスタンス自身を参照するよ。
testメソッド(objCはメッセージだっけ?)を持っているのがBのインスタンスだからできないんじゃないかな。
908 :
906 :2010/05/21(金) 15:47:12
>>907 ありがとうございます。できました。
今まで何となく使ってた、selfの意味をようやく理解しました。
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; @try { ここで例外発生。 } @catch (NSException * e) { NSLog(@"%@ @catch in %@", e, NSStringFromSelector(_cmd)); @throw; } @finally { [pool release]; } で、上位のレベルで例外を受ける時、例外は pool に登録されるせいで、@finally 中の [pool release]; で解放されちゃって、 上位のレベルで例外を触るとバッド・アクセスになる。 例外発生時に pool がメモリリークするから @finally に入れたのだが、逆にこんな問題が出てくるとは。 NSAutoreleasePool を作らないという選択肢以外に、何かリークしない上手い対処法無いかな? @throw; しないで、上位には NSError で渡すとか考えてるけど。 例外処理とか今まで殆ど触ったこと無いから、勝手が分からない。
>>909 例外処理に悩むならException Programming Topics for Cocoa
くらいは嫁。その中の
Exception Handling and Memory Managementに、まさしく
あなたが悩んでいることについて書いてある。ピックアップすると
The simplest is to refrain from releasing local autorelease pools in @finally blocks
もっとも簡単な方法はfinalyブロックでローカルなプールを使うなってこと。
912 :
910 :2010/05/25(火) 00:22:43
じゃあどこでpoolをreleaseするのか不安に思ってるかもしれないので、 追記。 Autorelease poolはスタック状のデータ構造になっていて、 最上位でないAutorelease poolが解放されると、それより上の 内側のpoolおよびそれに登録されたオブジェクトはリリースされる (Memory Management Programming Guide for Cocoa; Scope of Autorelease Pools and Implications of Nested Autorelease Pools 参照) Cocoa/Objective-Cでinitとreleaseの対応は金科玉条 (破るとすなわちメモリリーク) だけど、autorelease pool自体はinitとreleaseが厳密に対応していなくても許容される…みたい。下層のpoolがreleaseされるのが前提だけど。
@interface MyAutoreleasePool : NSObject { NSAutoreleasePool *_pool; NSPointerArray *_buf; } - (void)throwToOuterPool:(id)obj; @end @implementation MyAutoreleasePool - (id)init { self = [super init]; if (self) { _pool = [[NSAutoreleasePool alloc] init]; _buf = [[NSPointerArray alloc] initWithOptions: NSPointerFunctionsZeroingWeakMemory]; } return self; } - (void)throwToOuterPool:(id)obj { [_buf addPointer: [obj retain]]; } - (void)dealloc { [_pool release]; for (id obj in _buf) [obj autorelease]; [_buf release]; [super dealloc]; } @end こんなん作って、@catch 中で [pool throwToOuterPool: e]; するコトにしたよ。
Objective-Cの逆コンパイラってありますか?
何悪いこと企んでるんだ?
今月で販売が終了してしまうプリンタのドライバを逆コンパイルしたい。
Objective-CってコンパイルしちゃうとCと区別付かないよね Objective-C特有の関数呼び出しが多数現れるけど
ObjC で書かれたドライバなんてあるの…
馬鹿はレスしなくていいです
>>917 ObjC 特有の関数呼び出しが多数現れるから、コンパイルしても C と区別付くよ。
>>920 そうじゃなくて、>914へのヒントだよ
ObjC のメッセージ呼び出しを解釈するデコンパイラが有っても良いと思うよ?
今まで色々書いてきて萩原本の内容を一通り制覇したけど、「分散オブジェクト」だけは未だどう利用すればいいのか分からない。 どういう処理に使ったとか、実践的・実用的な利用例があったら教えてくれ。
経験談とか。
すでにコンパイルされたiPhoneのアプリを c#のように解析することはできますか?
>>926 >c#のように
具体的に何がしたいの?
>>927 ソースみて参考にしたいのです
特に規約とかないようなので
Objective-C なら結構動的に動いてる部分があるので 逆コンパイルもそれなりな形にできそうだけど いかんせん逆コンパイラが作られるほど有名な言語でもないというのが
>>928 デコンパイルしたいってことか。
残念ながら iPhone アプリのデコンパイラは知りません。
アプリの動きを知りたいなら、Instruments でカスタム
DTrace スクリプトを書くのが一番良いと思います。
932 :
931 :2010/06/06(日) 15:20:47
Cocoaスレと間違えた。めんご
規約がないってのは リバースエンジニアリングを禁止する規約がないって意味でしょ
見落としてるだけだろ
いや、パクる気満々だな
936 :
デフォルトの名無しさん :2010/06/08(火) 07:45:09
いえ、解析してそのゲームでチートしようと思ってます
ageんな死ね。
Objective-Cでは、厳密にprivateやpublicと明示的に記述し、スコープ分けしないのでしょうか? 入門書を何冊か読んだのですが、どれもインスタンス変数のスコープ分けをしていないので、気になっています。
@interface AClass : NSObject {
そのあたりに言及してるのは荻原本ぐらいじゃないかな
@privateでもKVCとかでアクセスできるし プライベートであるという表明だけは出来るけど 静的チェックは甘いよね。
>>940-941 ありがとうございます。
自分はJavaやってから始めたので、クラス内でしか使わない変数を隠蔽していないと
どうも気になってしまって…。
荻原本は読みました。解説はしてるのですが、以降の章のサンプルコードでは積極的に
使ってませんよね。
>>941 さんがおっしゃるように、
「スコープ分けしてもKVCでどうせアクセスできるんだから、細かい事は気にすんな」
って事なのでしょうかね。
表明するのは大事だよ 通常アクセスならエラーが出るし、 迂闊に触ってしまうことへの注意喚起も出来るから それで慣れている人は続ける方がいいよ Appleのやり方も色々だよね。 昔から有るクラスはコメントで「privateだ」って書いてあったり idな型不明のオブジェクトに隠蔽したり @privateで宣言したり。
>>943 なるほど、ありがとうございます。
書いている方が安心できるので、書く事にします。
少しでも単純なバグを減らせるなら、これを書くぐらいなんとことないですしね。
id型で思い出しましたが、参考書はかなりid型を使っていますが、Objective-Cは動的型結合があるのでid型で書いた方が、何かと都合が良いのでしょうか。
「ここは絶対hoge型でしょう」みたいな箇所でid型を使うのは、Javaのような静的型付け言語に慣れ親しんでいた私の身には抵抗がありまして…。
「ごちゃごちゃ言う前に慣れろ」と言われれば、それまでなんですけど、ハイ…。
荻原本持ってるなら64ページに静的な型について書いてあるよ。 「明確な指針はないので好きにすれば良い」みたいなことが書いてある。 俺はクラス型を指定すると、コンパイル時に警告を出してくれるメリットがある のでどんどん使っていけば良いと思うよ。 ただ、コンパイル時には静的な型チェックを行ってくれるが、実行時にはすべて id型になっているということがJavaとは違うので注意。 id型の代わりにクラス型を指定したせいでデメリットが生まれることはあまり ないと思われる。
>>945 ありがとうございます。書いてました。申し訳無いです。
>ただ、コンパイル時には静的な型チェックを行ってくれるが、実行時にはすべて
>id型になっているということがJavaとは違うので注意。
この違いは大きいですね。注意します。ありがとうございました。
>>943 WebViewはちょっと面白いよね。
@privateでWebViewPrivateクラスのインスタンス変数を持ってるだけだし、
WebViewPrivateクラスの実装とかはなぜかWebViewDataにある。
948 :
デフォルトの名無しさん :2010/06/11(金) 16:03:43
CFIndex型の変数indexに、どんな値が入っているか見ようと思うのですが、 NSLog("%O", index); としましたが、ポインタコンパチブルなんたらと怒られました。 何が間違っているのでしょうか?と質問しようとして、 よく見たら、1つ目の引数のポインタが型違うやんみたいなことを言われました。 NSLog(@"%O", index); としたら、うまく行きました。自己解決しました。ありがとうございました。 以前にもこういうミスがありまして、こういうミス起きないようにするには どうすればよいでしょうか。変な質問ですがよろしくお願いします。
文字列の前には@を付けると頭に叩き込むしかないんじゃないかな。
>>948 一度遭遇したエラーや警告を、その原因、対処方法とともに意識して憶えていく努力をする。
次に948は、 CFIndex型の変数indexに、どんな値が入っているか見ようと思うのですが、 printf(@"%O\n", index); としましたが(ry
952 :
948 :2010/06/12(土) 14:48:06
みなさんアドバイスありがとうございます。
>>949 「あっと驚くNSString」これで頭に叩き込もうと思います。
頭に叩き込んでいたら怪我をしてしまいまして、これから病院に行ってきます。
>>950 そうですよね。がんばります。
>>951 次は無いようにしたいですね。
そこで新たな質問ですが、
NSLog(@@"%O", index);
のところでエラーが出ます。
原因はなんでしょうか?
バカかお前は。
バカの相手するのもなんなんだが、log って打って補完すれば NSLog(@""); って補完してくれて "" の中にキャレット動かしてくれるぞ
>log って打って補完すれば NSLog(@""); 俺、べつのバカだけど、そうなんだ!べんりだなー
スレチ。というか Mac も持ってないのにコード書いても意味ないだろ。
>>957 そうなんですか 初級過ぎてすみません><
アップル公式のSDKもよく見たらMAC限定みたいですね 出直してきます
ちょっとわらった
>>960 サイドバーの
「ターゲット」を展開→アプリ名になってる項目を右クリック→「追加」→「新規ビルドフェーズ」→「新規コピーファイル」
開いたパネルの「デスティネーション」を「フレームワーク」に設定
アプリ名の項目を展開→「ファイルをコピー」の上に JSON.framework をドロップ
JSON.framework は実際のファイルではなくて サイドバーの <プロジェクト名>/Frameworks 項目の中に入ってるやつ
>>961-962 ありがとうございます。前進できました。
ビルドすると、JSON Frameworkのいくつかのファイルが見つからないというエラーが出ましたので、
私の設定のどこかがまずいのでしょう。
頑張って潰したいと思います。
楽しいココアのレヴューにこういう↓のあったんだが、実際のところどう? あと萩原本以外にいいのないですか?自分はCは中級くらいやれてます ********************* Leopardにアップグレードしてしまった方、 この本は使えません。Xcode Toolに大幅な変更があったからです。 まだTigerを使っている方。この本は貴方のためのものです。 本の通り作業して行けばCocoaのいろはのい位まではモノになるはずです。
スレチ。
966 :
964 :2010/06/21(月) 20:09:39
すみませんでした 新macのcocoaスレ行ってきます
967 :
デフォルトの名無しさん :2010/06/24(木) 03:59:04
969 :
968 :2010/06/28(月) 17:59:49
Appleで聞いてくる
970 :
デフォルトの名無しさん :2010/06/29(火) 18:10:59
V V (´・ω・`) うさちゃんピース
971 :
デフォルトの名無しさん :2010/07/02(金) 05:44:56
すみません。 1ヶ月未満の初心者なんですが、初歩的なことでつまずいています。 ヘッダファイルで @interface PListReadViewController : UIViewController { NSArray* persons; } @property(nonatomic,retain) NSArray* persons; で、ソースファイルで @synthesize persons; -(void)hogehage{ NSBundle* bundle = [NSBundle mainBundle]; NSString* path = [bundle pathForResource:@"test" ofType:@"plist"]; NSArray* persons = [NSArray arrayWithContentsOfFile:path]; } としてるんですが、hogehageのpersonsはローカル変数として扱われてしまうみたいですね。 interfaceで定義してるpersonsに、パッケージにバンドルされてるplistを配列として展開して、 別の関数内でpersonsを使いたいんですけど、どうしたらいいんでしょうか?
972 :
971 :2010/07/02(金) 06:11:49
[NSHoge hoge~~] ってのは自動で autorelease に登録されてると覚えよう。
とは限らないけどね
[NSHoge new~~] ってのは release されていないってのも併せて覚えよう。
976 :
名無しさん@そうだ選挙に行こう :2010/07/10(土) 15:46:20
スレチ。
978 :
名無しさん@そうだ選挙に行こう :2010/07/10(土) 17:17:49
JAVAスクリプトのライブラリを参照する事てできますか?
JavaScript ? HTMLかXMLで実装した後、NSWebViewで参照すればイイんじゃない?
980 :
名無しさん@そうだ選挙に行こう :2010/07/11(日) 12:32:02
ありがとうございました
複数の入門書で勉強をし始めてるんだけど、参考書によって、 NSString* str = @"hoge"; と、 NSString *str = @"hoge"; て感じで、クラス名の後ろに*が付いてるのと、変数名の前に*が付いてるので書き方が分かれてて混乱中。 どっちの方が一般的な表記なんですかね? 一応、どっちもコンパイルは通るんだけど…
NSString* str1,* str2; NSString *str1, *str2; あとはわかるな?
「NSStringへのポインタ」という型だと考えるなら NSString* str
>>982 のように変数を複数宣言したときとの整合性を取るなら NSString *str
どっちも一般的だから好きなほうで
984 :
981 :2010/07/14(水) 01:29:03
ありがとうございます。 クラスのインスタンスはポインタ型の変数と思えば良いのかな。 Objective-Cに慣れるのに、時間掛かりそうだ…
クラスって、単にポインタだから。 Cで関数形式マクロを使ってポインタを隠蔽したような感覚で考えれば簡単。
>>981 C ファミリは区切り部分に空白がいくつ入ってもいい。改行でもいい。
> どっちの方が一般的な表記なんですかね?
{ 前後の改行の仕方に複数の流儀があるのと同じこと。
>>984 > クラスのインスタンスはポインタ型の変数と思えば良いのかな。
C はできるの?
malloc() するときはポインタで受け取るでしょ?
[[NSString alloc] init] の alloc はそういうこと。
>>981 t* v; ってのは c++ で一般的な書き方です。
合理性はともかく c++ のコードの大半はこのスタイル。
Blocksって一体なんなんすか?
無名関数 qsort(3)の第4引数に関数ポインタを渡す代わりに比較用関数を直接書ける みたいな
990 :
デフォルトの名無しさん :2010/07/14(水) 21:37:44
テーブルビューのセル削除時にデリゲートメソッド(tableView:commitEditingStyle:forRowAtIndexPath:)が呼ばれてスワイプ消去の機能が自動的にアクティブになりますが、スワイプ消去の機能を非アクティブにさせる方法はありますか?
スワイプで編集されたくないときは canEditRowAtIndex だか何だかで NO 返せば良いんだった様な
>>990 あとそれスレ違いだ。
そういうのは新Mac板のiPhoneのプログラミングスレで。