0

我在将 NSArray 转换为 NSString 时遇到了一些问题。

这是代码。

- (void)createStringWithArray:(NSArray *)arr_1 andTheOtherArray:(NSArray *)are_2
{
     NSString *outputString = @"Start";

     if (arr_1) {
         for (Object *object in arr_1) {
             outputString = [outputString stringByAppendingFormat:@"\n(%f, %f)", object.value1, object.value2];
         }
         outputString = [outputString stringByAppendingFormat:@"\nArray 1 End"];
     }
     if (arr_2) {
         for (Object *object in arr_2) {
             outputString = [outputString stringByAppendingFormat:@"\n(%f, %f)", object.value1, object.value2];
         }
         outputString = [outputString stringByAppendingFormat:@"\nArray 2 End"];
     }

     NSLog(@"%@", outputString);
}

are_1 和 are_2 各有 48 个对象和 1568 个对象。

我找不到 iPhone Simulator 的任何问题,但是应用程序崩溃,iPad mini 和 iPhone5 设备没有日志。它发生在第二个循环函数上。

我想一定是内存问题,但我不知道到底出了什么问题。

请帮助解决这个问题。

4

4 回答 4

2

在方法中,您声明您有两个数组(arr_1 和 are_2),但在 IF 中您使用的是 arr_1 和 arr_2,因此即使您不执行代码,编译器也应该显示错误。

于 2013-06-05T08:12:13.757 回答
1

您应该使用NSMutableString而不是NSString. 字符串应该是可变的

 - (void)createStringWithArray:(NSArray *)arr_1 andTheOtherArray:(NSArray *)arr_2
    {
        NSMutableString *outputString = [[NSMutableString alloc] initWithString:@"Start"];

        if (arr_1) {
            for (Object *object in arr_1) {

               [outputString appendFormat:@"\n(%f, %f)", object.value1, object.value2];
            }
            [outputString  appendString:@"\nArray 1 End"];
        }
        if (arr_2) {
            for (Object *object in arr_2) {
                [outputString appendFormat:@"\n(%f, %f)", object.value1, object.value2];
            }
            [outputString appendString:@"\nArray 2 End"];
        }

        NSLog(@"%@", outputString);
    }
于 2013-06-05T09:16:34.863 回答
0

您将两个数组分配给单个变量outputSting。使其成为不同的变量并将它们连接起来。还要注意在方法内部传递参数。

于 2013-06-05T08:20:54.063 回答
0

如果您的数组中有很多项目,那么您可能会消耗大量内存。每次你有:

outputString = [outputString stringByAppendingFormat:@"..."];

您一遍又一遍地创建新字符串,但旧字符串使用的内存仍在使用中。您无法手动释放此内存,因为您不拥有它,它会在下次自动释放池耗尽时被释放,但由于该池在您的方法中的任何地方都没有耗尽,因此您冒着耗尽内存的风险。

这可以通过简单地使用可变字符串来解决。

- (void)createStringWithArray:(NSArray *)arr_1 andTheOtherArray:(NSArray *)are_2
{
     NSString *outputString = [NSMutableString stringWithString:@"Start"];

     if (arr_1) {
         for (Object *object in arr_1)
             [outputString appendFormat:@"\n(%f, %f)", object.value1, object.value2];
         [outputString appendString:@"\nArray 1 End"];
     }

     if (arr_2) {
         for (Object *object in arr_2)
             [outputString appendFormat:@"\n(%f, %f)", object.value1, object.value2];
         [outputString appendString:@"\nArray 2 End"];
     }

     NSLog(@"%@", outputString);
}
于 2013-06-05T12:52:16.073 回答