CCCallFuncNDのvoidポインタの理解
最近ゲームのゲームはメモリのテストをして、たくさんのメモリが漏れて、頭を見て大きくて、当初コードを書く時よく書いていないだけで、今その後悔!
昨日同僚はCCCallFuncNDにも問題があるかもしれないと言っていましたが、後で見てみました.ついでにCCCallFuncNDの定義について調べてみました.cocos 2 dの中にあります.
CCCallFuncND *callFun = [CCCallFuncND actionWithTarget:(id) selector:(SEL) data:(void *)];
その中の(void*)いわゆるvoidポインタが私の興味を引き起こして、以前はずっと使って、ただそれがどんなタイプのデータポインタを指すことができることを知っていて、しかしどうしてこのようにするとは思わなかったで、後で関連資料を調べて、やっと高く理解しました.
1つのポインタには、変数またはオブジェクトを指す「アドレス」と「長さ」の2つの属性があることがわかりますが、ポインタは「アドレス」のみを格納し、長さはポインタのタイプに依存します.エディタは、ポインタのタイプに応じてポインタの「アドレス」から後方にアドレスし、ポインタが異なる場合、アドレス範囲も異なります.たとえば、int*が指定したアドレスから4バイトの変数として格納ユニットを後方にアドレスします(コンパイラによって異なる場合があります).double*は、指定されたアドレスから変数のメモリセルとして8バイト後方にアドレスします.voidポインタには次のような特徴があります.
1、voidポインタは特別なポインタで、タイプがないので、つまり私たちはその長さを知らない.
void *vp;
2、任意のポインタはvoidポインタに値を付与することができる.
type *tp;
vp = tp;//変換不要
//tpのアドレスのみ取得
3、voidポインタが他のタイプのポインタに割り当てられたときに変換する必要がある.
type *tp = (type *)vp;//これでアドレスと長さが得られます
4、voidポインタは再参照できない.voidポインタはポインタの長さを知らないからだ.
*vp;//エラー
5、voidポインタは、先に変換しない限り、ポインタ演算に参加できません.
CCCallFuncNDのvoidポインタは以下の2つの例でどのように使用されているかがよくわかります.
例1:
例2:
昨日同僚はCCCallFuncNDにも問題があるかもしれないと言っていましたが、後で見てみました.ついでにCCCallFuncNDの定義について調べてみました.cocos 2 dの中にあります.
CCCallFuncND *callFun = [CCCallFuncND actionWithTarget:(id) selector:(SEL) data:(void *)];
その中の(void*)いわゆるvoidポインタが私の興味を引き起こして、以前はずっと使って、ただそれがどんなタイプのデータポインタを指すことができることを知っていて、しかしどうしてこのようにするとは思わなかったで、後で関連資料を調べて、やっと高く理解しました.
1つのポインタには、変数またはオブジェクトを指す「アドレス」と「長さ」の2つの属性があることがわかりますが、ポインタは「アドレス」のみを格納し、長さはポインタのタイプに依存します.エディタは、ポインタのタイプに応じてポインタの「アドレス」から後方にアドレスし、ポインタが異なる場合、アドレス範囲も異なります.たとえば、int*が指定したアドレスから4バイトの変数として格納ユニットを後方にアドレスします(コンパイラによって異なる場合があります).double*は、指定されたアドレスから変数のメモリセルとして8バイト後方にアドレスします.voidポインタには次のような特徴があります.
1、voidポインタは特別なポインタで、タイプがないので、つまり私たちはその長さを知らない.
void *vp;
2、任意のポインタはvoidポインタに値を付与することができる.
type *tp;
vp = tp;//変換不要
//tpのアドレスのみ取得
3、voidポインタが他のタイプのポインタに割り当てられたときに変換する必要がある.
type *tp = (type *)vp;//これでアドレスと長さが得られます
4、voidポインタは再参照できない.voidポインタはポインタの長さを知らないからだ.
*vp;//エラー
5、voidポインタは、先に変換しない限り、ポインタ演算に参加できません.
CCCallFuncNDのvoidポインタは以下の2つの例でどのように使用されているかがよくわかります.
例1:
NSString *s = @"hhhhhhh";
CCCallFuncND *cafnd =
[CCCallFuncND actionWithTarget:self selector:@selector(callback:data:) data:s ];
- (void)callback(id)sender data:(void *)data {
NSString *str = (NSString *)data;
// void NSString.
}
例2:
int temp = 100;
CCCallFuncND *cafnd =
[CCCallFuncND actionWithTarget:self selector:@selector(callback:data:) data:(void *)temp ];// xcode .
- (void)callback(id)sender data:(void *)data {
int t = (int)data;
// xcode .
}