【问题标题】:Objective-C crash on appending array to textview's text field将数组附加到文本视图的文本字段时,Objective-C 崩溃
【发布时间】:2012-06-25 17:41:21
【问题描述】:

虽然我曾使用过 Java、C 和 C++,但我对 Objective-C 还比较陌生,而且我还在学习 Objective-C。

我有一个套接字、一个接收数据函数和一个文本视图。当数据进来时,我想将它附加到文本视图中。现在我的 textview 在开始时有一些预填充的文本。如果在每次调用接收数据的数据时,我只获取文本视图的当前文本,将其附加到 nsstring 中:

 NSString *oldtext = [mTextViewAlias text];
 NSString *toSend = [oldtext stringByAppendingString: oldtext];

然后将文本视图设置为toSend,它工作正常,我看到我的文本视图中的数据增长了。

问题是,我想追加:

 UInt8 buffer[len]; // which has data from the socket. len is set to amount of data on each call of receive data as follows
 int len = CFDataGetLength(df);

我一直在尝试做的是将缓冲区转换为nsstring 并追加。例如:

NSString *newdata = [NSString stringWithUTF8String: buffer];

我想到缓冲区可能不会以 '\0' 字符终止,因此我什至创建了一个名为 char newbuffer[len+1]; 的新缓冲区,并将缓冲区复制到其中并添加了 \0 作为最后一个字符。

我可以在第一次传递新数据时追加第一次,但第二次追加,追加到将缓冲区中的字符追加到文本一次之前总是崩溃的内容。

我在if len > 10 assign buffer[10]='\0' 处做了一个小技巧。它实际上让我在第三次崩溃之前抓取了两次数据。

我似乎遇到了两个问题之一,但我不确定如何解决它。一个是我只能抓取缓冲区中的数据,并且不知何故这些nsstrings 依赖于它,当我在接收数据时更改缓冲区时,再次调用它会导致崩溃。或者也许它仍然是'\0' 不存在的问题,尽管我不知道如何。

【问题讨论】:

  • 使用 NSMutableData 类作为缓冲区而不是纯 C 数组可能会更好。当我为 Obj-C 编程时,我尝试将其全部保留为 Obj-C,因为转换可能会有点麻烦。我将不得不查找有关某些内容的文档,然后我可能会为您提供实际的答案
  • 您介意显示从套接字接收数据的代码和/或函数吗?您是否仅将其作为 C 数组接收?我还假设您不只是从 URL 获取数据,因为 API 中有非常好的函数可以自动为您完成。
  • 这是一个更像 telnet 的套接字。该连接用于聊天和游戏服务器,但它有一些格式,您可以打开它来组织原始提要,但它仍然发送原始文本,我只知道如何使用格式更好地组织它。得到这样的东西:CFDataGetBytes(df, range, buffer);

标签: ios objective-c nsstring uitextview


【解决方案1】:

试试这样的:

NSMutableData *buffer = [[NSMutableData alloc] init];
[buffer appendBytes:aCArray length:lengthOfaCArray];
NSString *newdata = [[NSString alloc] initWithData: buffer encoding:NSASCIIStringEncoding];

//When your finished with newdata and buffer, dont forget to release it
//This might be done automatically if you have Automatic Reference Counting (ARC) on
[newdata release];
[buffer release];

编码类型here的完整参考。 不能保证这会有效,因为我是从 Windows 机器上编写这段代码的,并且在 Apple 的开发人员网站上打开了几个选项卡。但应该可以帮助您朝着正确的方向前进。

【讨论】:

  • 我尝试按照以下方式进行操作:char buffer2[len]; for(int a=0; a 10) // newbuffer[10]='\0'; // NSString *newdata = [NSString stringWithUTF8String: newbuffer]; NSString *toSend = [oldtext stringByAppendingString: newdata];
  • 没有被注释掉的行是:char buffer2[len]; for(int a=0; a
  • 只想添加: NSString *newdata = [NSString stringWithUTF8String: newbuffer];而且我只是将文本字段设置为当前数据(丢失历史记录)它确实可以正常工作。用我原来的方法,除了第一个之外,似乎有多个新数据附加,崩溃了。
  • 不,我错了,你似乎是对的。得到它的工作。显然,在我的崩溃快结束时,我以某种方式创建了一个断点。删除它并运行您提供的代码并且它有效。我现在唯一的问题是何时释放。我会尝试在函数结束时释放两者,看看是否有效。我确实有自动引用计数。谢谢迈克
  • 你应该可以在函数结束时释放(释放)两者。当您为文本字段分配 NSString 时,它应该将值复制到自己的变量中。此外,如果您只打算使用一次数据,并且不需要可变版本,您可以使用类似 NSData *buffer3 = [[NSData alloc] initWithBytes:cArray length:len]; 的东西可能想查一下,因为我可能没有完美的参数,Xcode 自动完成功能很好它虽然。我认为 ARC 会为您处理内存管理,因此您不必担心释放,而不是 ARC 专家
猜你喜欢
  • 1970-01-01
  • 2016-05-11
  • 2015-03-16
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 2010-10-24
相关资源
最近更新 更多