3

私はObjective-Cクラスを持っています。私がやっていることは、目的の C クラスで C 関数を呼び出していることです [このサンプル ios プロジェクトの一部である 1 つのファイルに実装したこの C 関数]。すべての C 関数は正常に動作しています。これまでのところ問題はありません。

C file で非同期関数を呼び出そうとすると、しばらくするとその関数が object-c クラスに応答します。Objective-C クラスで適切にトリガーされる C の関数ポインターを呼び出しました。次のコード スニペットを確認してください。コールバック メソッドで UI 関連のアクションを実行したいと考えています。それは可能ですか?いいえの場合、他の方法はありますか? 至急回答をお願いします。ありがとう。

C ファイル :

void my_int_func(int x);

void test_asyn_fun ()
{
    /* This code is for Sleep logic */
    for (int i=0; i<50000; i++) {
        // sleep
    }
    /* Sleep End */
    void (*foo)(int);
    foo = &my_int_func;
    foo(25);
}  

Objective-C ファイル:

void my_int_func(int x) // this is call back method 
{
    printf( "%d\n", x ); // working properly 
    [self anyMethodInMyClass]; // I am unable to use self in this function.
}

実際に私の要件は

Voip 通話機能を実行する C コードがあります。Objective-C [iOS] コードから C 関数を呼び出しています。呼び出しが受信者によって切断された場合、私の C 関数の 1 つが呼び出され、プロセスが停止します。しかし、それでも私のUIは呼び出し関連のUIを表示しています。私はそれを却下したい。

here 、C関数からobjective-cクラスに通知を送信してUIViewを閉じるにはどうすればよいですか。誰でも親切に助けてもらえますか。

実際には関数ポインタを使用しましたが、機能していません。

4

4 に答える 4

2

まず、Ricardo Kloth のおかげで、今ではうまくいっています。

これが私のコードです...

Objective-C コード:

static id staticObject = nil;

@Implementation MyObjCclass

init
{
    ....

    staticObject = self;
}

// C fun
void functionPointer() 
{ 
    [staticObject message]; // it's working 
}

-(void) message
{

}

@end
于 2012-08-30T15:20:21.000 に答える
2

私もこの問題に遭遇しました。VoIP アプリに PJSIP を使用していると思います。

やりたいことは、メッセージを送信したい Objective-C クラスへのポインタを作成することです。C コールバックから Objective-C 関数を呼び出せないことはすでにわかっています。

static YourObjCClass *objCClassPtr

@property (nonatomic, retain) YourObjCClass *class

上記のクラスを初期化するときは、静的ポインターが目的の C オブジェクトのポインターを指すようにします。(オブジェクトへのポインターへのポインター)

objCClassPtr = class;

[objCClassPtr message]C 関数から次のように使用して、Objective-C オブジェクトにメッセージを送信できるようになりました。[class message]

self同じように指すことができます。

于 2012-08-30T13:51:01.390 に答える
0

ブロックでも、インスタンス変数に正しくアクセスできません。次のコード スニペットを確認してください。

// これは単純なブロック コードです

NSString* (^trimTheStr)(NSString*) = ^(NSString *str) {

[self myInstanceMethods]; // This will show error right 

NSString *result = nil;

result = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

return result;

};

于 2012-08-30T10:35:36.570 に答える
0

ブロックを使用できます。ブロックは純粋な C および C++ で使用できます。ブロックは常に Objective-C オブジェクトでもあります。

C++ ブロック オブジェクト

于 2012-08-30T09:40:17.033 に答える