试图为 NSArray 创建类,但不明白为什么线程stalls/breaks

Trying to create a category for NSArray, but do not understand why the thread stalls/breaks

我正在尝试学习 treehouse 团队在 objective-C 上的课程。

这部分课程试图教我们实现类别。所以我有下面的代码

main.m

#import <Cocoa/Cocoa.h>
#import "NSArray+mahem.h"
int main()
{
    NSArray *letters = @[ @"alfa", @"bravo", @"charlie"];
    NSLog(@"letters %@", letters);

    NSLog(@"cap %@", [letters capitalizeStrings]);
    return 0;
}

NSArray+mahem.h

#import <Foundation/Foundation.h>

@interface NSArray (mahem)
-(NSArray *)capitalizeStrings;
@end

NSArray+mahem.m

#import "NSArray+mahem.h"

@implementation NSArray (mahem)
-(NSArray *)capitalizeStrings{
    NSMutableArray *cap = [NSMutableArray array];
    for (NSString *string in self) {
        [cap addObject:[string capitalizedString]];
    }
    return cap;

}
@end

基本上,我试图将 NSArray letters 中的每个单词大写。但是,当我在xcode6中运行main.m时,程序到达文件NSArray+mahem.m中的for (NSString *string in self) {行处的断点。

我以前从未使用过 xcode 调试器,所以我不确定我看到了什么或我应该如何解决这个问题。好像说self确实有3个对象(@"alfa"、@"bravo"、@"charlie"),但是cap有0个,而string 显然等于 0xa1a1a1a1。我假设这意味着它在第一个循环中就中断了,否则 cap 至少会有一个对象。为什么 string 会出现乱码?

这是因为 NSArray 是常量而不是可变的吗?我该如何解决?如果有人可以向我解释这一点,那将非常有帮助。谢谢

根据您的描述,一切正常。当执行流到达字符串 for (NSString *string in self) {

  1. 您的 self 数组已完全填充 - 它是先前在 main()

  2. 中创建的
  3. 您的 cap 已声明并初始化,但未填充 - for 循环未执行一次。

  4. 您的 string 已声明但未初始化 - 它存在,但指向内存中的某个随机位置。它没有坏。如果您将跨过调试器,您会看到 string 变成了 @"alpha",但 cap 仍然是空的。再向前一步 - string 仍然是 @"alpha" 并且 cap 填充了一个对象。

一切正常。有什么不明白的地方欢迎提问