SORU
29 HAZİRAN 2009, PAZARTESİ


Objective-C yöntem C yöntem arıyor?

Sorunsuz C bir sınıf yöntemi çağıran bir sınıf (EAGLView) var. Şimdi, sorun aramam lazım C sözdizimi yapamam ki C a sınıfı 12* function [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; *.

I could wrap bu Objective-C aramak için aynı Objective-C sınıf ilk yer olarak adlandırılan C sınıfı, ama istediğim şekilde arama yöntemi C ve anlamadığım nokta nasıl.

EAGLView C yöntemi nesneye bir işaretçi vermeye çalıştım ve "EAGLView.h" C sınıf benim başlık ama 3999.. hataları var . içinde vardır

.. Bu ne yapmalıyım? Bir örnek ben sadece bunu C saf örnekler buldum güzel olurdu...

CEVAP
30 HAZİRAN 2009, Salı


Eğer dikkatli bir şekilde yaparsanız Objective-C ile C karıştırabilirsiniz. Birkaç uyarılar ama karışık olabilir genelde vardır. İsterseniz onları muhafaza etmek ayrı, edilebilir bir standart C sarıcı işlev verir Objective-C nesne kullanılabilir C-tarzı bir arabirim olmayan Objective-C kodu (seç daha iyi isimler için dosyalarınızı, ben seçtim bu isimler için ayrıntı):

MyObject-C-Arayüzü.h

#ifndef __MYOBJECT_C_INTERFACE_H__
#define __MYOBJECT_C_INTERFACE_H__

// This is the C "trampoline" function that will be used
// to invoke a specific Objective-C method FROM C  
int MyObjectDoSomethingWith (void *myObjectInstance, void *parameter);
#endif

MyObject.h

#import "MyObject-C-Interface.h"

// An Objective-C class that needs to be accessed from C  
@interface MyObject : NSObject
{
    int someVar;
}

// The Objective-C member function you want to call from C  
- (int) doSomethingWith:(void *) aParameter;
@end

MyObject.mm

#import "MyObject.h"

@implementation MyObject

// C "trampoline" function to invoke Objective-C method
int MyObjectDoSomethingWith (void *self, void *aParameter)
{
    // Call the Objective-C method using Objective-C syntax
    return [(id) self doSomethingWith:aParameter];
}

- (int) doSomethingWith:(void *) aParameter
{
    // The Objective-C function you wanted to call from C  .
    // do work here..
    return 21 ; // half of 42
}
@end

MyCPPClass.cpp

#include "MyCPPClass.h"
#include "MyObject-C-Interface.h"

int MyCPPClass::someMethod (void *objectiveCObject, void *aParameter)
{
    // To invoke an Objective-C method from C  , use
    // the C trampoline function
    return MyObjectDoSomethingWith (objectiveCObject, aParameter);
}

Sarıcı işlevideğil ihtiyacı varObjective-C sınıfı olarak .m aynı dosya içinde olmak, ama bu dosya mevcutObjective-C kodu . olarak derlenmesi gerekir . Sarıcı işlevi İlan Başlığı ve Objective-C hem CPP kodu dahil edilmesi gerekiyor.

(NOT: Eğer Objective-C uygulama dosya uzantısı verilmezse "."böyle büyük mükafat altında birleştirecek. m ".mm" uzantısı bir arada beklemesini söyler Güncellemelerinden Objective-C ve C , yani, Objective-C .)


PİMPL deyimi kullanarak Nesne-Orientented bir şekilde yukarıda uygulayabilirsiniz. Sadece uygulama biraz farklıdır. Kısacası, sarıcı işlevleri yerine ("MyObject-C-Arayüzü.ilan") h sınıfı (özel) içindeki boşluğu Sınıfım örneği için bir işaretçi.

MyObject-C-Arayüzü.h(PİMPL)

#ifndef __MYOBJECT_C_INTERFACE_H__
#define __MYOBJECT_C_INTERFACE_H__

class MyClassImpl
{
public:
    MyClassImpl ( void );
    ~MyClassImpl( void );

    void init( void );
    int  doSomethingWith( void * aParameter );
    void logMyMessage( char * aCStr );

private:
    void * self;
};

#endif

Sarıcı yöntemler artık Sınıfım örneği için geçersiz işaretçi gerektirir dikkat edin; şimdi MyClassİmpl özel bir üyesidir. Init yöntemi Sınıfım bir örneğini başlatmak için kullanılır;

MyObject.h(PİMPL)

#import "MyObject-C-Interface.h"

@interface MyObject : NSObject
{
    int someVar;
}

- (int)  doSomethingWith:(void *) aParameter;
- (void) logMyMessage:(char *) aCStr;

@end

MyObject.mm(PİMPL)

#import "MyObject.h"

@implementation MyObject

MyClassImpl::MyClassImpl( void )
    : self( NULL )
{   }

MyClassImpl::~MyClassImpl( void )
{
    [(id)self dealloc];
}

void MyClassImpl::init( void )
{    
    self = [[MyObject alloc] init];
}

int MyClassImpl::doSomethingWith( void *aParameter )
{
    return [(id)self doSomethingWith:aParameter];
}

void MyClassImpl::logMyMessage( char *aCStr )
{
    [(id)self doLogMessage:aCStr];
}

- (int) doSomethingWith:(void *) aParameter
{
    int result;

    // ... some code to calculate the result

    return result;
}

- (void) logMyMessage:(char *) aCStr
{
    NSLog( aCStr );
}

@end

Sınıfım MyClassİmpl bir çağrı örneği olduğuna dikkat edin::ınit. MyClassİmpl yapıcı olarak Sınıfım oluşturmak, ancak bu genellikle iyi bir fikir değil. Sınıfım örneği MyClassİmpl bu yıkıcı tahrip olmuştur. C-stil uygulama olarak, sarıcı yöntemler sadece Sınıfım ilgili yöntemleri erteleme.

MyCPPClass.h(PİMPL)

#ifndef __MYCPP_CLASS_H__
#define __MYCPP_CLASS_H__

class MyClassImpl;

class MyCPPClass
{
    enum { cANSWER_TO_LIFE_THE_UNIVERSE_AND_EVERYTHING = 42 };
public:
    MyCPPClass ( void );
    ~MyCPPClass( void );

    void init( void );
    void doSomethingWithMyClass( void );

private:
    MyClassImpl * _impl;
    int           _myValue;
};

#endif

MyCPPClass.cpp(PİMPL)

#include "MyCPPClass.h"
#include "MyObject-C-Interface.h"

MyCPPClass::MyCPPClass( void )
    : _impl ( NULL )
{   }

void MyCPPClass::init( void )
{
    _impl = new MyClassImpl();
}

MyCPPClass::~MyCPPClass( void )
{
    if ( _impl ) { delete _impl; _impl = NULL; }
}

void MyCPPClass::doSomethingWithMyClass( void )
{
    int result = _impl->doSomethingWith( _myValue );
    if ( result == cANSWER_TO_LIFE_THE_UNIVERSE_AND_EVERYTHING )
    {
        _impl->logMyMessage( "Hello, Arthur!" );
    }
    else
    {
        _impl->logMyMessage( "Don't worry." );
    }
}

Şimdi MyClassİmpl özel bir uygulama yoluyla Sınıfım erişim çağırır. Bu yaklaşım olabilir avantajlı olsaydın gelişmekte olan bir taşınabilir uygulama; olabilir sadece takas uygulaması Sınıfım ile belirli bir diğer platform ... ama dürüst olmak gerekirse, bu olup olmadığını daha iyi bir uygulama, daha fazla bir maddenin tadı ve ihtiyacı var.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Police

    Android Poli

    21 NİSAN 2010
  • Kupa World

    Kupa World

    1 EYLÜL 2011
  • TheDamnWreckless

    TheDamnWreck

    12 Temmuz 2010