NSArray到NSString ....发生了一些崩溃

时间:2013-06-05 07:55:36

标签: ios objective-c nsstring nsarray

将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有48个对象和1568个对象,并且是_2。

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

我猜必须有内存问题,但我不知道到底出了什么问题。

请帮忙。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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);
    }

答案 2 :(得分:0)

您将botharrays分配给单个变量outputSting。将它作为不同的变量并将它们连接起来。还要注意在方法中传递参数。

答案 3 :(得分:0)

如果您的阵列中有很多项目,那么您可能会占用大量内存。每次你有:

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

您正在反复创建新字符串,但旧字符串使用的内存仍在使用中。您无法手动释放此内存,因为您不拥有它,它会在下次自动释放池耗尽时释放,但由于池中没有耗尽池,因此存在内存不足的风险。 / p>

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

- (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);
}