2011-07-12 4 views
2

私は脱獄の開発/調整を手掛けていますが、これはAppleのSDKの権利などに反していることをすでに知っています。私は客観的なことをかなり新しくしていますし、値へのポインタへのポインタへのアクセス方法が不明です。ここでは、ヘッダ機能は次のとおりです。idオブジェクトのポインタへのポインタにどのようにアクセスしますか?

- (id)_newCKSMSMessage:(id *)arg1; 

私は、引数1の値へのアクセスを得るためにいくつかの試みを試してみました:

id msg = &arg1; 
id *msg = &arg1; 

私は値が引数1によるへのポインタであることにアクセスするにはどうすればよいですか?

+1

'id *'は目を痛くします – sidyll

+1

@sidyll:これはちょっと厄介ですが、同じことを達成するためのより良い方法はないので、すべてを吸い上げる必要があります。 – Chuck

答えて

3

を行う必要があり、私はあなたがあなたが持っているかわからない別の問題があると思います。

このメソッドの引数は、おそらくであり、有効なオブジェクトではありませんです。オブジェクトへのポインタへのポインタを見ると、それはほとんどの場合、「参照渡し」のパラメータになります。呼び出し元は変数のアドレスを渡します。このメソッドは変数をオブジェクトに設定することになっています。たとえば:

- (void)tellMeHello:(id *)message { 
    if (message) { 
     *message = @"Hello!"; 
    } 
} 

// It's used like this: 

id thisWillBeTheMessage; // it's nothing right now 
[someObject tellMeHello:&thisWillBeTheMessage]; 
NSLog(@"%@", thisWillBeTheMessage); // prints "HELLO!" 

私はここで問題になっている方法に慣れていないんだけど、Objective-Cのオブジェクト私の知る限りへのポインタへのポインタを渡すために、他の理由はかなりありません。

編集:OK、私はちょうど別の理由を考えました:オブジェクトのC配列を渡している場合。しかしそれはあまり一般的ではありません。これは、NSArrayの2つのイニシャライザでのみ行われます。これはルールよりも例外です。

+0

これは、特に "addMessage"や "setMessage"のような名前を持つ同じヘッダ内の他のメソッドでは意味があります。これをありがとう、それはおそらく間違ったことを試して私の数時間を保存! –

2

ポインタを逆参照する前に、NULLであるかどうかを確認する必要があります。

if(NULL != arg1) { 
    id msg = *arg1; 
    NSLog(@"msg = %@, [msg class] = %@", msg, NSStringFromClass([msg class])); 
} 

オブジェクトを_newCKSMSMessage:(id *)arg1に渡すと、次のようになります。

id gak = [[Gak alloc] initWithInterestingStuff:interestingStuff]; 
[something _newCKSMSMessage:&gak]; 

「_」で始まるメソッドは不適切です。あなたがそうするなら、あなたはAppleの個人的な方法と衝突する可能性が高いです。

+0

これはAppleのプライベートメソッド(ダンプされたヘッダーから)の一つです。私はそれをフックし、arg1を理解して元の関数を返そうとしています。id msg = * arg1を試しましたが、msgを記録しようとすると__NSCFTypeが出ます。私は&msgにアクセスしようとしましたが、クラッシュが発生します。私は素早い返信を感謝します –

+1

あなたはAppleがそこで何をしているのか理解しようとしていますか?おそらく、私たちはバックアップし、あなたがしようとしていることについて話し合うべきです。 NSLog(@ "%@"、msg)でロギングし、「__NSCFType」を取得している場合は、フリーダイヤルフリーブリッジオブジェクトの1つです。 –

+0

私はMobileSMS.appに移動してから現在のアプリケーションに戻る必要がなく、返信ボックスをポップアップできるように、着信SMSメッセージに送信者の番号を代入しようとしています。これは私が物事の仕組みを学ぶための学習プロセスの多くです。私は、必ずしも、Appleがやっていることすべてを理解する必要はなく、arg1を理解できる構造、辞書、または情報の配列に変える方法だけを理解する必要はありません。私はあなたがフリーダイヤルフリーのブリッジオブジェクトで何を意味するのか不明です(申し訳ありませんがまだ新しい) –

2

これは、ここではC.の基本であるが例です:

int val = 5; 
int* valPtr = &val;  //valPtr points to val; 
int** valPtrPtr = &valPtr; //valPtrPtr is a pointer to a pointer to val 
int newVal = **valPtrPtr; //newVal = 5 

はあなたがvPtrと呼ばれるポインタへのポインタを持っているとしましょう。 vPtrの参照を外したいときはいつでも、ある種のkには(**vPtr)または*vPtr[k]を使用し、j,kにはvPtr[j][k]を使用します。配列表記で値にアクセスする場合は、正しい境界があるかどうかを確認してください。そうでないと未定義の動作が発生します。

+0

これはうまくいくはずですが、@ Chuckは私の問題はポインタの基礎を超えていて、Appleこのメソッドを呼び出しています。ありがとう、結構です! –

0

&address ofですか?

のでid msg = &arg1arg1へのポインタを意味します(第3レベルを!)

あなたはid msg = *arg1

関連する問題