Objective c 在objective C中打印数组

Objective c 在objective C中打印数组,objective-c,Objective C,很抱歉问这么简单的问题,但我是自学成才的,我知道我的教育存在差距 要在objective C中打印数组,我相信: NSLog(@"My array: %@", myArray); 如何打印数组的数组 谢谢尝试从NSArray的-description方法记录返回值 NSLog(@"My array: %@", [myArray description]); 或者使用递归描述:) 你想要这个: for(NSArray *subArray in myArray) { NSLog(@"Ar

很抱歉问这么简单的问题,但我是自学成才的,我知道我的教育存在差距

要在objective C中打印数组,我相信:

NSLog(@"My array: %@", myArray);
如何打印数组的数组


谢谢

尝试从
NSArray
-description
方法记录返回值

NSLog(@"My array: %@", [myArray description]);

或者使用
递归描述
:)

你想要这个:

for(NSArray *subArray in myArray) {
    NSLog(@"Array in myArray: %@",subArray);
}

这将适用于嵌套了一层深度的数组。

此外,用于打印所有元素

int i = 0;
int j = 0;
for(NSArray *subArray in myArray) {
    NSLog(@"[%d] %@",i, subArray);

    j =0;
    for(NSObject *element in subArray) {
        NSLog(@"[%d:%d] %@", i,j,element);
        ++j;
    }
    ++i;
}

您不需要做任何不同的事情来记录一组数组;与您编写的代码完全相同的代码已经显示了子数组的内容

即以下程序:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSMutableArray *array = [NSMutableArray array];

    for (int i=0; i<5; ++i) {
        NSMutableArray *sub = [NSMutableArray array];
        for (int j=0; j<=i; ++j) {
            [sub addObject:[NSString stringWithFormat:@"%d", j]];
        }
        [array addObject:sub];
    }

    NSLog(@"Array: %@", array);

    [pool drain];
    return 0;
}

显然,它已经很好地记录了子阵列。如果您想以不同的方式控制格式,您必须手动迭代它们,但是默认情况下,NSArray的
-description
比该数组中每个对象的
-description
稍多,其中包括所有子数组。

因此我对递归描述感到尴尬,所以我在NSArray上写了自己的分类。注意,这段代码将打印出任意深度的数组的描述。描述本身可能比逗号和换行符使用更多的格式。给你:

@interface NSArray (RecursiveDescription)
- (NSString *)recursiveDescription;
@end


@implementation NSArray (RecursiveDescription)

- (NSString *)recursiveDescription {
    NSMutableString *description = [[NSMutableString alloc] initWithString:@"Array (\n"];
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    for (NSObject *child in self) {
        if ([child respondsToSelector:@selector(recursiveDescription)]) {
            [description appendFormat:@"%@,\n", [child recursiveDescription]];
        }
        else {
            [description appendFormat:@"%@,\n", [child description]];
        }
    }
    [pool drain];
    [description appendString:@"\n)"];
    return [description autorelease];
}

@end

虽然我很喜欢在Objective-C中注销一个对象是多么容易,但我不喜欢将2D数组视为一个很长的列表。我在NSArray上创建了一个类别,用于打印2D数组。它不是完美的,可以改进,但它对我很有效

标题:

@interface NSArray (Logging)

- (void)log2DArray;

@end
实施:

#import "NSArray+Logging.h"

@implementation NSArray (Logging)

- (void)log2DArray {
    NSMutableString *formattedString = [[NSMutableString alloc] init];
    NSInteger longestSubarrayLength = 0;
    for (NSArray *subarray in self) {
        if (subarray.count > longestSubarrayLength) {
            longestSubarrayLength = subarray.count;
        }
    }

    for (int i = 0; i < longestSubarrayLength; i++) {
        [formattedString appendFormat:@"\n"];

        for (int j = 0; j < self.count; j++) {
            NSArray *tempArray = [self objectAtIndex:j];
            if (tempArray.count <= longestSubarrayLength) {
                [formattedString appendFormat:@"%@\t", [tempArray objectAtIndex:i]];
            } else {
                [formattedString appendFormat:@"\t"];
            }
        }
    }

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

@end

那是一样的。
%@
格式说明符使用
description
方法的结果(或
CFCopyDescription()
用于CoreFoundation对象)。该方法记录在哪里?它不是
NSArray
的记录方法,因为它不起作用。抱歉,据我和谷歌所知,这只是一个完全错误的答案。我不得不投反对票。如果你能解释一下的话,我会改变的。我的错。这是UIView上未记录的方法,用于转储UIView及其子级的描述;我(错误地)假设该方法适用于所有cocoa touch对象,但实际上它只是UIView。很抱歉添加一个不同的答案,并将此保留在此处作为警告,说明此未记录的方法仅适用于UIView。您是指
NSArray
NSArray
?或者你的意思是像
constcharstuff[3][2]
?因为这两个是完全不同的东西。我指的是一堆堆堆堆。这是迄今为止最好的答案,因为它是最简单的。如果数组中有自定义对象,则始终可以重写
NSObject
-description
方法,使其更适合该类。无需循环。如何直接访问数组项?例如:char a[0]=“x”;库特
@interface NSArray (Logging)

- (void)log2DArray;

@end
#import "NSArray+Logging.h"

@implementation NSArray (Logging)

- (void)log2DArray {
    NSMutableString *formattedString = [[NSMutableString alloc] init];
    NSInteger longestSubarrayLength = 0;
    for (NSArray *subarray in self) {
        if (subarray.count > longestSubarrayLength) {
            longestSubarrayLength = subarray.count;
        }
    }

    for (int i = 0; i < longestSubarrayLength; i++) {
        [formattedString appendFormat:@"\n"];

        for (int j = 0; j < self.count; j++) {
            NSArray *tempArray = [self objectAtIndex:j];
            if (tempArray.count <= longestSubarrayLength) {
                [formattedString appendFormat:@"%@\t", [tempArray objectAtIndex:i]];
            } else {
                [formattedString appendFormat:@"\t"];
            }
        }
    }

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

@end
[myArray log2DArray];