2013-11-24 19 views
5

Objective-C ve C kodunu aynı sınıfta uygulayan iOS projemde Objective-C sınıfım var. Uzantıyı .mm olarak değiştirdim ve bu bölüm iyi gidiyor. Şimdi aynı sınıfta Objective-C yöntemini çağıran bir C yöntemini ayarlamak istiyorum. Benim aldığım sorun, C yönteminden self'u aramaya çalıştığım zamandı.C yönteminden Objective-C "self" nasıl çağrılır

void SetNotificationListeners(){ 
    [self fireSpeechRecognition]; 
} 

hatadır:

Use of undeclared identifier 'self' 

bunu nasıl yönetebilir İşte kodudur?

void SetNotificationListeners(void *myObj){ 
[(MyClass*)myObj fireSpeechRecognition]; 
} 

//in objC 
SetNotificationListeners(self); 

veya referansı

//global variable 
static MyClass *myObj; 

//in obj c 
myObj = self; 
SetNotificationListeners(); //use myObj instead of self in function 

ilk Bence iyidir tutan bir küresel değişkeni vardır:

+0

Bu iOS değil, IOS. Her neyse, niçin “self” 'in sınıfa ** değil ** bir işlevin içinden erişilebilir olmasını beklersiniz? Bu sadece mantıklı değil. Örnekte (nesne) argüman olarak geçmeniz gerekir. –

+2

Objective-C ve C kullanırken (C++) belirtmediğinizde, uzantıyı neden .mm olarak değiştirdiniz? – trojanfoe

cevap

10

Sen var kullanmıyorsanız .mm dosya uzantısını değiştirmek gerekmez:

void SetNotificationListeners(void *uData) 
{ 
    MyClass *obj = (__bridge MyClass *)(uData); 
    [obj fireSpeechRecognition]; 
} 

- (void)myMethod 
{ 
    // Call C function from Objective-C method: 
    myFunction((__bridge void *)(self)); 
} 

("brigde" yalnızca ARC ile derlerseniz bu işlem gerekir.)

+0

Bu yazıyı okudum, C de C nesnesini aradınız mı? Burada "C nesnesinden C çağrısı" dedin ... anlamadım ... bu bana kafa karıştırıyor! rs –

0

işlev çağrısına bağımsız değişken olarak kendini vermek Ya.

+3

İkincisi deliliktir :) – zoul

+0

Dediğim gibi ilk seçeneği tercih ediyor. Nasıl aşağı düştüğümde, bu soruya ilişkin olarak şu ana kadar 10'luk oy ile işaretlenmiş cevabı aldığımda, oylamadan hemen sonra aynı "çılgınlık" dan bahseder .... – Mario

1

Objective-C yöntemlerinde, her yönteme örtülü olarak iletilen iki parametre vardır; bunlar, self ve _cmd. Bu nedenle bir yöntem içinden self'a erişebilirsiniz.

Bir Objective-C yöntemini çağırırken c işlevinize bir argüman olarak self'u geçebilirsiniz, ancak bu önemsiz örnekle neden bir yöntemi kullanamayacağınızdan emin değilim.

Sen C işlevine örnek işaretçisi geçmesine Amaç-C++

2

Dosya uzantısını değiştirmek zorunda değilsiniz. Objective-C, C'nin bir üst kümesidir; bu, Objective-C dosyalarınızda düz C'yi istediğiniz gibi kullanabileceğiniz anlamına gelir. Bir Objective-C yönteminin uygulamasını yazarken

, bu yöntem her zaman self parçası, bazı belirli örneği bağlamında yürütür. Hepsini kapa Bu Sayfada Belirtiler self, bir Objective-C yönteminde otomatik olarak alırsınız, ancak sahne arkasında, yönteme yalnızca bir argüman olarak geçti, bkz. obc_msgsend.

Kişisel düz C fonksiyonu örtülü hiçbir self var, bu nedenle bunu çağırdığınızda onunla ilişkili hiçbir örnek yoktur sınıfın (düz C fonksiyonları asla) bir parçası değildir. Işlevin bir örnek çağırmasını isterseniz, işaretçiyi açıkça bu örneğe iletmeniz gerekir. Örneğin, düz C API'lerinin bir kısmı, geri arama için kayıt yaparken geçirebileceğiniz bir “bağlam” işaretçisine sahiptir. Bunun örnekleri için komşu cevaplara bakın.

İlgili konular