【问题标题】:NSMutableArray of ObjectsNSMutableArray 对象
【发布时间】:2010-04-11 14:31:53
【问题描述】:

首先,我对 Objective C 和 iPhone 编程非常陌生。现在这已经不成问题了。我已经阅读了大部分 Apple 文档以及一些第三方手册。

我想我只是想知道我是否以正确的方式处理这件事......

- (NSMutableArray *)makeModel {

    NSString *api = @"http://www.mycoolnewssite.com/api/v1";

    NSArray *namesArray = [NSArray arrayWithObjects:@"News", @"Sports", @"Entertainment", @"Business", @"Features", nil];

    NSArray *urlsArray = [NSArray arrayWithObjects:
                      [NSString stringWithFormat:@"%@/news/news/25/stories.json", api],
                      [NSString stringWithFormat:@"%@/news/sports/25/stories.json", api],
                      [NSString stringWithFormat:@"%@/news/entertainment/25/stories.json", api],
                      [NSString stringWithFormat:@"%@/news/business/25/stories.json", api],
                      [NSString stringWithFormat:@"%@/news/features/25/stories.json", api], nil];

    NSMutableArray *result = [NSMutableArray array];

    for (int i = 0; i < [namesArray count]; i++) {
        NSMutableDictionary *objectDict = [NSMutableDictionary dictionary];
        NSString *name = (NSString *)[namesArray objectAtIndex:i];
        NSString *url = (NSString *)[urlsArray objectAtIndex:i];
        [objectDict setObject:name forKey:@"NAME"];
        [objectDict setObject:url forKey:@"URL"];
        [objectDict setObject:@"NO" forKey:@"HASSTORIES"];
        [result addObject:objectDict];
    }

    return result;
}

结果的输出是...

(
    {
    HASSTORIES = NO;
    NAME = News;
    URL = "http://www.mycoolnewssite.com/api/v1/news/news/25/stories.json";
},
    {
    HASSTORIES = NO;
    NAME = Sports;
    URL = "http://www.mycoolnewssite.com/api/v1/news/sports/25/stories.json";
},
    {
    HASSTORIES = NO;
    NAME = Entertainment;
    URL = "http://www.mycoolnewssite.com/api/v1/news/entertainment/25/stories.json";
},
    {
    HASSTORIES = NO;
    NAME = Business;
    URL = "http://www.mycoolnewssite.com/api/v1/news/business/25/stories.json";
},
    {
    HASSTORIES = NO;
    NAME = Features;
    URL = "http://www.mycoolnewssite.com/api/v1/news/features/25/stories.json";
}
)

任何见解将不胜感激;-)

【问题讨论】:

  • 也许......你想要完成什么? (例如,您要检查哪一部分的正确性?)

标签: iphone objective-c ipad nsmutablearray


【解决方案1】:

看起来不错。如果您关心,可能会有一些小的改进。

1.

[NSString stringWithFormat:@"%@/news/news/25/stories.json", api]

可以替换为

[api stringByAppendingString:@"/news/news/25/stories.json"]

如果api 不可能出现在中间或接受其他参数。

2.

    NSString *name = (NSString *)[namesArray objectAtIndex:i];
    NSString *url = (NSString *)[urlsArray objectAtIndex:i];

显式转换是不必要的。 id 可以隐式转换为其他 ObjC 对象。

3.

您可以使用方便的方法-dictionaryWithObjectsAndKeys:一次性构建字典,因此您不需要临时字典:

[result addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:
   name, @"NAME",
   url, @"URL",
   @"NO", @"HASSTORIES", nil]];

4. (可选)

如果函数不是热点,则此转换无用。

由于数组只在本地使用,所以使用 C 数组效率更高。

static const int arraySize = 5;
NSString* namesCArray[] = {@"News", @"Sports", @"Entertainment", @"Business", @"Features"};
NSString* urlsCArray[arraySize];
urlsArray[0] = [api stringByAppendingString:@"/news/news/25/stories.json"];
...
for (int i = 0; i < arraySize; ++ i) {
  ...
  NSString* name = namesCArray[i];
  NSString* url = urlsCArray[i];
  ...
}

这消除了重复的-count-objectAtIndex: 调用,这与直接元素访问相比非常慢。

5. (可选)

如果数组很短,这种转换就没有用了。

您可以使用快速枚举来遍历 ObjC 容器:

int i = 0;
for (NSString* name in namesArray) {
  NSString* url = [urlsArray objectAtIndex:i];
  ...
  ++ i;
}

6.

通常我们使用[NSNumber numberWithBool:NO] 来表示一个装箱的真/假值,而不是字符串@"NO"。当原始数字(intfloat 等)无法使用(例如,存储在 NSArray 中)时,也经常使用 NSNumber。我不知道你的 API 是否明确要求字符串 NO,所以它可能不适合你。

【讨论】:

  • 哇!这是很棒的东西肯尼。我现在有很多关于这些主题的研究要做。谢谢你把我送到不同的方向;-)
  • 顺便说一句,肯尼。我在code.google.com/p/networkpx 向您的 Google 代码项目捐赠了 5 美元,再次感谢 ;-)
  • 特里,我会认真看看ericasadun.com 并阅读 iPhone Cookbook。它让我在 2 周内起床并开始工作。我是一名 perl 程序员,Erica 的书让我对基本要素和一些巧妙的技巧足够熟悉。 ps:问得好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多