【问题标题】:Problems passing NSString as argument in iPhone app在 iPhone 应用程序中将 NSString 作为参数传递的问题
【发布时间】:2011-04-13 13:56:58
【问题描述】:

这是我的问题的背景。首先有一个线程开始:

-(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, &size_vocal); 

// more code....

奇怪的是,none 的 NSLogs 打印 。没有。纳达。压缩。然后应用程序在尝试将位置传递给 read wav 方法时崩溃(可能是因为字符串有问题)。

当我从使用 NSTemporaryDirectory 切换到 NSBundle 时,这一切都开始发生了,但我不确定这是否与它有关。有什么建议吗?

我接受了 Joetjah 的建议并开始改用:

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

现在我得到了这个:

第二次运行,来自 Joetjah 的第二条建议

【问题讨论】:

  • 能够在控制台中看到调用堆栈和错误会非常有用。
  • @Eric Brotto:我也想查看崩溃日志。我想将行更改为[self runAllAdioRoutines:local_recordFilePath_NSString]; 并将无效行更改为-(void) runAllAudioRoutines:(NSString*) file { 不起作用?只是为了检查^^
  • 我在控制台中没有收到任何错误或调用堆栈。除非它在别处(?)
  • @Joetjah,好建议。我试试看。
  • @Eric Brotto:很高兴看到它取得了一些进展(?)。崩溃发生在哪一行?日志似乎表明 runAllAudioRoutines 方法获得了一个 nil 对象,但我看到了别的东西。您的日志没有说run thread : path %@ 尝试分配字符串为:NSString *local_recordFilePath_NSString = [[NSString alloc] initWithString:file_path_NSObject]; 而不是您的行NSString *local_recordFilePath_NSString = (NSString *)file_path_NSObject;,看看是否有任何效果?

标签: iphone objective-c cocoa-touch nsstring nsbundle


【解决方案1】:

您收到的消息说SpeakHereController 没有实现方法runAllAudioRoutines:

您是否在正确的对象上调用了runAllAudioRoutines:

扩展:Objective-C 是一种动态语言。您可以在任何对象上调用任何方法,但如果该对象没有实现该方法,则应用程序将崩溃,并显示消息:

"无法识别的选择器发送到实例..."

C++ 是一种静态语言。如果您尝试调用未为对象定义的函数,它将无法编译。在 Objective-C 中,它会编译,但在运行时会出现错误。这就是发生在你身上的事情。

【讨论】:

  • 我不确定你的意思。你能扩展吗?
猜你喜欢
  • 2020-01-19
  • 1970-01-01
  • 2016-05-25
  • 2013-06-10
  • 1970-01-01
  • 2018-08-16
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多