我试图在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而且不可变吗?我该如何解决?如果有人能向我解释这一点,那将非常有帮助。感谢
答案 0 :(得分:1)
根据您的描述,一切正常。当执行流程转到字符串for (NSString *string in self) {
您的self
数组已完全填充 - 之前已在main()
您的cap
已被声明并初始化,但尚未填充 - for
循环未执行一次。
您的string
已声明但未初始化 - 它存在,但指向内存中的某个随机位置。它没有破碎。如果您将在调试器中跳过,您会看到string
变为@"alpha"
,但cap
仍为空。还有一步 - string
仍为@"alpha"
,cap
填充了一个对象。
一切都应该运转正常。随意问一些不清楚的事情