Проблемы с передачей NSString в качестве аргумента в приложении для iPhone

#iphone #objective-c #cocoa-touch #nsstring #nsbundle

#iPhone #objective-c #cocoa-touch #nsstring #nsbundle

Вопрос:

Вот контекст моей проблемы. Сначала запускается поток:

 -(void)run_thread: (NSObject* )file_path_NSObject
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSString *local_recordFilePath_NSString = (NSString *)file_path_NSObject;

NSLog(@"run thread : path   %@     ", local_recordFilePath_NSString);

printf("Running Thread...n");

runAllAudioRoutines(local_recordFilePath_NSString);

// more code....
  

Все, что указано выше, корректно выводится на консоль. Затем вызывается метод:

 void runAllAudioRoutines(NSString *file)

{

NSLog(@"running All Audio Routines method...n");

NSString *truncatedFilePath = [file stringByReplacingOccurrencesOfString:@"LoopExtended.wav"
                                                                withString:@"recordedFile.wav"];

NSLog(@"FILE for  !!!! -->  %@",truncatedFilePath);

const char *location  = [truncatedFilePath UTF8String];
const char *write_location = [file UTF8String];

int *vocal_data = read_wav(location, amp;size_vocal); 

// more code....
  

Странно то, что ни один из NSLogs не печатается вообще. Ничего. Nada. Zip. И затем приложение выходит из строя, когда оно пытается передать местоположение методу read wav (предположительно, потому что со строкой что-то не так).

Все это начало происходить, когда я переключился с использования NSTemporaryDirectory на NSBundle, но я не уверен, имеет ли это какое-либо отношение к этому. Есть какие-нибудь советы?

Я воспользовался предложением Joetjah и начал использовать вместо этого:

 [self runAllAudioRoutines:local_recordFilePath_NSString];
     -(void)runAllAudioRoutines:(NSString*) file
  

и теперь я получаю это:введите описание изображения здесь

Второй запуск со 2-м предложением от Joetjahвведите описание изображения здесь

Комментарии:

1. Было бы весьма полезно иметь возможность видеть стек вызовов и ошибки, которые вы получаете в своей консоли.

2. @Eric Brotto: Я бы тоже хотел посмотреть журнал сбоев. Я предполагаю, что изменение строки на [self runAllAdioRoutines:local_recordFilePath_NSString]; и пустой строки на -(void) runAllAudioRoutines:(NSString*) file { не работает? Просто чтобы проверить ^^

3. Я не получаю никакой ошибки или стека вызовов в консоли. Если только это не в другом месте (?)

4. @Eric Brotto: приятно видеть, что в этом есть некоторый прогресс (?). На какой строке происходит сбой? Кажется, журнал указывает, что метод runAllAudioRoutines получает нулевой объект, но я вижу кое-что еще. В вашем журнале не написано, run thread : path %@ попробуйте выделить строку с помощью: NSString *local_recordFilePath_NSString = [[NSString alloc] initWithString:file_path_NSObject]; вместо вашей строки NSString *local_recordFilePath_NSString = (NSString *)file_path_NSObject; и посмотрите, имеет ли это какой-либо эффект?

5. @Joetjah, извините, но поток запуска действительно вызывается. Я просто не включил это на фото. Я все равно принял ваше предложение. Снимок экрана прилагается.

Ответ №1:

В сообщении, которое вы получаете, говорится, что SpeakHereController не реализует метод runAllAudioRoutines: .

Вы вызывали runAllAudioRoutines: правильный объект?

Расширение: Objective-C — динамический язык. Вы можете вызвать любой метод для любого объекта, но если объект не реализует метод, приложение завершит работу с сообщением:

«нераспознанный селектор, отправленный экземпляру …»

C — это статический язык. Если вы попытаетесь вызвать функцию, которая не определена для объекта, она не будет компилироваться. В Objective-C он будет скомпилирован, но вы получите ошибку во время выполнения. Это то, что происходит с вами.

Комментарии:

1. Я не уверен, что вы имеете в виду под этим. Не могли бы вы расширить?