Кому-нибудь удалось портировать SpeakHere для ARC? - PullRequest
3 голосов
/ 07 сентября 2011

Мой компилятор сообщил об ошибке, когда я пытался интегрировать код записи / воспроизведения из SpeakHere.Я следовал советам использовать файл .mm для включения файла включения cpp, единственное исключение - я использую iOS 5 с включенным ARC.

Мой код:

//header file
#import "AQPlayer.h"
#import "AQRecorder.h"

@interface MyClass : NSObject {

UIButton *record;
UIButton *cancel;
UIButton *stop;
UIButton *play;

//
AQPlayer*                   player;
AQRecorder*                 recorder;
BOOL                        playbackWasInterrupted;
BOOL                        playbackWasPaused;

CFStringRef                 recordFilePath; 
}

@property (nonatomic, retain) IBOutlet DrawerAudioNote *dnote;
@property (nonatomic, retain) IBOutlet UIButton *record;
@property (nonatomic, retain) IBOutlet UIButton *cancel;
@property (nonatomic, retain) IBOutlet UIButton *stop;
@property (nonatomic, retain) IBOutlet UIButton *play;

- (IBAction) doRecord:(id)sender;
- (IBAction) doStop:(id)sender;
- (IBAction) doCancel:(id)sender;
- (IBAction) doPlay:(id)sender;

//
@property (readonly)            AQPlayer            *player;
@property (readonly)            AQRecorder          *recorder;

//.mm file (no compile error)
@import "MyClass.h"
@implementation MyClass

@synthesize record, cancel, stop, play;
@synthesize playbackWasInterrupted;
@synthesize player, recorder;

//CAXException.h (an example cpp file with compile errors)
......
class CAX4CCString { 
//ERROR: Expect ';' after top level declarator
//ERROR: Unknown type name; do you mean 'Class'?
public:
    CAX4CCString(OSStatus error) {
        // see if it appears to be a 4-char-code
        char *str = mStr;
        *(UInt32 *)(str + 1) = CFSwapInt32HostToBig(error);
        if (isprint(str[1]) && isprint(str[2]) && isprint(str[3]) && isprint(str[4])) {         
            str[0] = str[5] = '\'';
            str[6] = '\0';
        } else if (error > -200000 && error < 200000)
            // no, format it as an integer
            sprintf(str, "%d", (int)error);
        else
            sprintf(str, "0x%x", (int)error);
    }
    const char *get() const { return mStr; }
    operator const char *() const { return mStr; }
private:
    char mStr[16];
};

При компиляцииошибки в классе 'CAX4CCString', кажется, компилятор не понимает, работает ли он с файлом CPP.Я знаю, что где-то что-то пропустил, кто-нибудь может указать?

Заранее спасибо,

Шон

Ответы [ 2 ]

2 голосов
/ 20 апреля 2012

Почему бы не отключить ARC для определенных файлов? Ваш проект остается с ARC, за исключением проблемных файлов. Добавьте -fno-objc-arc к флагам компилятора для файлов, которые вам не нужны с ARC. В XCode вы можете сделать это под вашей целью -> Build Phases -> Compile Sources.

0 голосов
/ 24 апреля 2012

Вы объявляете класс C ++

class CAX4CCString { 

внутри класса Objective-C MyClass. Боюсь, что это не поддерживается Objective-C.

Я думаю, вы могли бы объявить CAX4CCString в глобальной области видимости, а затем создать экземпляр и использовать его из своего класса Objective-C:

//.mm file

class CAX4CCString { 
   ....
};


@implementation MyClass

@synthesize record, cancel, stop, play;
@synthesize playbackWasInterrupted;
@synthesize player, recorder;
...
   <do something with CAX4CCString>
@end
...