试图为NSArray创建一个类别,但不明白为什么线程停止/中断

时间:2015-11-03 10:23:15

标签: objective-c xcode xcode6 categories

我试图在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中的每个单词都大写。但是,当我在xcode 6中运行main.m时,程序到达文件for (NSString *string in self) {NSArray+mahem.m行的断点。

我之前从未使用过xcode调试器,所以我不确定我看到了什么,或者我应该如何解决这个问题。似乎说self确实有3个对象(@&#34; alfa&#34;,@&#34; bravo&#34;,@&#34; charlie&#34;)但{{1}有0,cap显然等于0xa1a1a1a1。我假设这意味着它在第一个循环中断开,否则string将至少有一个对象。为什么cap得到胡言乱语?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  4. 您的string已声明但未初始化 - 它存在,但指向内存中的某个随机位置。它没有破碎。如果您将在调试器中跳过,您会看到string变为@"alpha",但cap仍为空。还有一步 - string仍为@"alpha"cap填充了一个对象。

  5. 一切都应该运转正常。随意问一些不清楚的事情