2014-01-13 2 views
5

Я разрабатываю приложение, которое должно определять частоту определенного звука. Я основал мое приложение на Pitch Detector. Я импортировал файлы, которые находятся в примере Pitch Detector, затем я исправил свой код, чтобы принять эти новые классы. Я пост здесь свой код, чтобы объяснить вам мой вопрос:Определить значение частоты с помощью iPhone

ViewController.h

#import <UIKit/UIKit.h> 

@class RIOInterface; 

@interface ViewController : UIViewController { 
    BOOL isListening; 
    float currentFrequency; 
    RIOInterface *rioRef; // HERE I'M GETTING ISSUE 
} 
- (IBAction)startListenWatermark:(UIButton *)sender; 

@property(nonatomic, assign) RIOInterface *rioRef; 
@property(nonatomic, assign) float currentFrequency; 
@property(assign) BOOL isListening; 

#pragma mark Listener Controls 
- (void)startListener; 
- (void)stopListener; 

- (void)frequencyChangedWithValue:(float)newFrequency; 

@end 

ViewController.m

@synthesize isListening; 
@synthesize rioRef; 
@synthesize currentFrequency; 

- (IBAction)startListenWatermark:(UIButton *)sender { 
    if (isListening) { 
     [self stopListener]; 
    } else { 
     [self startListener]; 
    } 
    isListening = !isListening; 
} 

- (void)startListener { 
    [rioRef startListening:self]; 
} 

- (void)stopListener { 
    [rioRef stopListening]; 
} 

- (void)frequencyChangedWithValue:(float)newFrequency { 
    NSLog(@"FREQUENCY: %f", newFrequency); 
} 

В коде вы можете увидеть, где моя проблема и Xcode говорит: Existing instance variable 'rioRef' with assign attribute must be __unsafe_unretained. Если я удалю строку, которая дает это сообщение, приложение не вызывает метод [rioRef startListening:self]; и [rioRef stopListening];.

В файле RIOInterface.mm я получаю другую ошибку в строке 97 и Xcode предложил мне изменить его с:

RIOInterface* THIS = (RIOInterface *)inRefCon; --> RIOInterface* THIS = (RIOInterface *)CFBridgingRelease(inRefCon); 

Чем она дает мне эту другую ошибку на линии 283:

callbackStruct.inputProcRefCon = self; 

Это говорит мне это: Assigning to 'void' from incompatible type 'RIOInterface *const__strong', так что я посмотрел в Интернете, и я нашел это решение:

callbackStruct.inputProcRefCon = (__bridge void*)self; 

Я не уверен, правильно ли это сделать или нет, надеюсь, вы поможете мне решить эти проблемы, спасибо вам за консультацию.

+0

Что декларация 'callbackStruct.inputProcRefCon'? Если это механизм C-обратного вызова, то вы не передадите ему объект Objective-C, не так ли? – trojanfoe

+0

Я так думаю, я не написал эту часть кода, это в библиотеке 'RIOInterface' – lucgian841

+0

Попробуйте удалить строку: RIOInterface * rioRef; а также @synthesize rioRef; – Greg

ответ

3

Для 2-й и 3-й проблем, которые я решил, отключив ARC для файла, в котором есть код, приведенный выше. Для первой задачи я решил, написав этот код:

rioRef = [RIOInterface sharedInstance];

+0

Вы нашли способ решить вторую и третью проблемы без отключения ARC? – webdev

Смежные вопросы