Я разрабатываю приложение, которое должно определять частоту определенного звука. Я основал мое приложение на 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;
Я не уверен, правильно ли это сделать или нет, надеюсь, вы поможете мне решить эти проблемы, спасибо вам за консультацию.
Что декларация 'callbackStruct.inputProcRefCon'? Если это механизм C-обратного вызова, то вы не передадите ему объект Objective-C, не так ли? – trojanfoe
Я так думаю, я не написал эту часть кода, это в библиотеке 'RIOInterface' – lucgian841
Попробуйте удалить строку: RIOInterface * rioRef; а также @synthesize rioRef; – Greg