对象的NSMutableArray

问题描述:

首先我对Objective C和iPhone编程非常陌生。现在已经不存在了。我已经阅读了大部分关于这个和一些第三方手册的Apple文档。对象的NSMutableArray

我想我只是想知道如果我要对这个正确的方法...

- (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"; 
} 
) 

任何有识之士将不胜感激;-)

+0

也许...你想完成什么? (例如,你在检查什么部分是正确的?) – 2010-04-11 14:35:28

看起来不错。如果你在意,可以有一些小的改进。

[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对象和从其他ObjC对象。

你可以使用一个方便的方法-dictionaryWithObjectsAndKeys:构建字典一拍,所以你并不需要一个temperary字典信息:

[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"。每当原始数字(int,float等)不能被使用(例如被存储在NSArray中)时,NSNumber也被使用很多。我不知道你的API是否明确需要一个字符串NO,所以它可能不适合你。

+0

哇!这是肯尼的好东西。我现在有更多的研究要做这些话题。谢谢你送我在不同的方向;-) – 2010-04-11 15:25:31

+1

顺便肯尼。我向http://code.google.com/p/networkpx/ 上的Google Code项目捐赠了5美元;再次感谢;-) – 2010-04-11 15:31:39

+0

特里,我会认真考虑http://ericasadun.com/并阅读iPhone食谱。它让我起床,并在2周内进入。我是一位perl程序员,Erica的书对我的要领和一些巧妙的技巧足够熟悉。 ps:好的问题,tho。 – Jann 2010-04-15 04:24:13