09/02/23 13:46:53
カテゴリでは同名のメソッドは追加できない気がする。
URLリンク(journal.mycom.co.jp)
にやりかたがのってますが、Leopard になってすこし runtime がかわったので
10.5 でコンパイルする場合は 10.4 用にインスペクタで設定しないと
そのままではコンパイルエラーがでるでしょう。
何にせよその連載は勉強になります。
また、メソッドの呼び出しの際に performSelector: がいつでも呼ばれるか
というとそうではないので...
URLリンク(developer.apple.com)
URLリンク(developer.apple.com)
URLリンク(developer.apple.com)
URLリンク(developer.apple.com)
のあたり参照。
853:デフォルトの名無しさん
09/02/24 16:03:34
>>851
> 呼びだされたメソッド名を逐一NSLogで出力したい
それはずばりアスペクト指向の典型的な活用例なんで、素のObjC/Cocoaでは難しい。
URLリンク(journal.mycom.co.jp)
854:デフォルトの名無しさん
09/02/25 03:05:20
そういうのは DTrace が得意そうだね >> 呼び出されたメソッドの書き出し
855:デフォルトの名無しさん
09/02/25 03:57:43
>>854
DTraceはカーネルの呼び出しだけでしょう? ユーザー空間内での
やり取りは無感知。
856:デフォルトの名無しさん
09/02/25 09:34:51
>>855
そうでもないよ。objc????:: という provider があります。
URLリンク(www.mactech.com)
とか参照。
857:デフォルトの名無しさん
09/02/25 11:37:13
>>855
そんな事無いですよ。DTrace 自体はプローブポイントさえあれば、カーネルか
ユーザープロセスかは無感知。
858:デフォルトの名無しさん
09/03/01 12:49:31
objective-cで、あるパターンの中から文字列を抽出したいと思っています
<p class="info"><strong class="number">6</strong>|<strong class="time">3:16</strong>...
上記のような文字列から 6 と 3:16 の部分だけをそれぞれ取得したいのです
C#ではSystem.Text.RegularExpressionsのRegexクラスを使用して取得できたのですが、Objective-Cで同様の処理はどのように取得すればいいのでしょうか?
ちなみにiPhone上で動かそうと思っています
859:デフォルトの名無しさん
09/03/01 13:14:10
>>858
標準の NSScanner つかって頑張ってもいいけど、
個人的には RegEx Kit Lite がおぬぬめ。
URLリンク(regexkit.sourceforge.net)
860:デフォルトの名無しさん
09/03/01 13:29:01
>> 859
おおおまさにこれです!
ありがとうございました
861:デフォルトの名無しさん
09/03/03 01:59:36
質問です。
カテゴリを利用して、(ある1つのクラスの)ソースファイル
の分割を行うとします。
クラスAの実装ファイルを、
ファイル1とファイル2に分割、といった具合です。
そのとき、ファイル1で定義、実装されているプライベートメソッドを、
ファイル2で使おうとすると、ビルドのときに警告がでますが、これを
なんとかできないものでしょうか。
解決策として、そもそも、同一のプライベートメソッドを利用する
メソッド群を分割するな、という考えもあるかと思います。
また、コンパイラの警告レベルの調節でも、できるのかもしれません。
ですが、ほかにいい方法をご存知の方がいればご教示下さると助かります。
もしも、こういうこと(プライベートメソッドの他ファイルでの利用)
がプログラミングのマナー違反であれば、ご指摘下さい。
862:デフォルトの名無しさん
09/03/03 06:12:25
プライベートメソッドをならべたヘッダをひとつつくればいいんでは?
ClassAPrivate.h に
@interface ClassA (Private)
-(id)hoge:(id) ...
@end
とかしておいて、それを実装ファイルで #import すればいいとおもいます。
Obj-C では@interface ClassA (CategoryX) で宣言したやつの
実装を @implementation ClassA (CategoryX) の中でしないといけないという
ルールもないので、自由自在です。
863:デフォルトの名無しさん
09/03/03 12:43:26
その方法も頭に浮かんだのですが、ビルドのときに2重定義の警告と
なる気がして試してみませんでした。
864:デフォルトの名無しさん
09/03/03 17:17:10
>>861
分からないので聞くのですが、他から参照したいならなんでプライベートにするのでしょうか?
865:デフォルトの名無しさん
09/03/03 23:31:08
他から、といっても同じクラスなのです。
866:デフォルトの名無しさん
09/03/04 22:26:48
>>865
なるほど。
どうも私の頭がJAVA脳だったようです。
867:デフォルトの名無しさん
09/03/07 18:35:46
ClassA.hで
#import <Cocoa/Cocoa.h>
#import "ClassB.h"
@interface ClassA : NSObject {
ClassB* b;
}
@end
ClassB.hで
#import <Cocoa/Cocoa.h>
#import "ClassA.h"
@interface ClassB : NSObject {
ClassA* a;
}
@end
というように、互いにインスタンスを持ち合うとコンパイル時にエラーが出ますが、
ClassA.h内で
#import "ClassB.h"
@class ClassB;
ClassB.h内で
#import "ClassA.h"
@class ClassA;
というふうに@classディレクティブを付けることでエラーが出なくなります。
@class classnameが、classnameがクラスであることを宣言しているのはわかるのですが、
なぜこれをやると、ClassA.h、ClassB.hを互いにimportしているにもかかわらずエラーが出なくなるのでしょうか。
逆に、付けないとなぜエラーになるのでしょうか。
また、@classを付ける基準ですが、
・そのクラスのスーパークラス
・Cocoa等のフレームワーク内のクラス
を除く全てのクラスを使用する時、必ず@classをつけるという考え方で良いのでしょうか。
どなたか詳しくご存知のかたよろしくお願いします。
868:デフォルトの名無しさん
09/03/07 19:01:04
>>867
詳しくはないが、自分ならこう考える
Objective-Cの背後にある仕組みは結局Cと何もかわらない
importは本質ではなくひとつのファイルに連続して次のように書けるかという問題
Cではこう書けない
struct A { struct B *b; };
struct B { struct A *a; };
なぜならAの宣言時にBはまだ宣言されていないから。しかしCでは不完全型を定義できて、
struct B;
struct A { struct B *b; };
struct B { struct A *a; };
こう書く事ができる。Aの定義時にBは不完全型なのでインスタンスは作れないが、ポインタは作れる。ポインタのサイズはどの構造体でも固定だからだ
で、Objective-Cでも背後で同じようなことが起きてるんだと思うよ
@class B;
として不完全型を定義すればそのポインタを次の行からは使えるようになる
だからエラーにならない
どう?
869:デフォルトの名無しさん
09/03/07 19:10:43
>>867
だから、@classを付ける基準は
相互に依存するクラスを定義しなければならない時、またこのときは@classを書かざるを得ない
だけ
それ以外は冗長で無駄
870:デフォルトの名無しさん
09/03/07 19:18:21
>>868
ありがとうございます。今までずっと悩んでたのですが、すっきりしました。
>>869
特別な場合を除いて不要という形ですか、ありがとうございます。