我有一個的NSDictionary數據如下:訂單NSArray的使用對象
(lldb) po allFriends
{
71685207018702188 = {
id = 71685207018702188;
name = "mikeziri ";
username = mi;
};
93374822540641772 = {
id = 93374822540641772;
name = "Alan Weclipse";
username = zuka;
};
96553685978449395 = {
id = 96553685978449395;
name = "Monica Weclipse";
username = amonica;
};
96556113096345076 = {
id = 96556113096345076;
name = Xavier;
username = branko;
};
97017008427632119 = {
id = 97017008427632119;
name = "Dario Weclipse";
username = tarzan;
};
}
我整理基礎上,名這些對象,如果他們沒有名,我將使用用戶名。要做到這一點,我創建了一個新的的NSDictionary與名和ID,並在方法結束時,我用名排序。對它們進行排序的代碼如下:
- (NSArray*)orderFriends
{
NSMutableDictionary* newFriendsDict = [[NSMutableDictionary alloc] init];
for (int i=0; i<[allFriends count];i++)
{
NSMutableDictionary* friendsDict = [[NSMutableDictionary alloc] init];
NSDictionary* friend = [allFriends objectForKey:[NSString stringWithFormat:@"%@", [sortedKeysFriends objectAtIndex:i]]];
if ([[friend objectForKey:@"name"] length] != 0)
{
[friendsDict setObject:[friend objectForKey:@"id"] forKey:@"id"];
[friendsDict setObject:[NSString stringWithFormat:@"%@", [friend objectForKey:@"name"]] forKey:@"name"];
}
else
{
[friendsDict setObject:[friend objectForKey:@"id"] forKey:@"id"];
[friendsDict setObject:[NSString stringWithFormat:@"%@", [friend objectForKey:@"username"]] forKey:@"name"];
}
[newFriendsDict setObject:friendsDict forKey:[NSNumber numberWithInt:i]];
}
NSArray* sp = nil;
sp = [[newFriendsDict allValues] sortedArrayUsingComparator:^(id obj1, id obj2){
NSString *one = [NSString stringWithFormat:@"%@", [obj1 objectForKey:@"name"]];
NSString *two = [NSString stringWithFormat:@"%@", [obj2 objectForKey:@"name"]];
return [one compare:two];
}];
return sp;
}
的問題是,最終的結果是錯誤的:
(lldb) po sp
<__NSArrayI 0x160491a0>(
{
id = 93374822540641772;
name = "Alan Weclipse";
},
{
id = 97017008427632119;
name = "Dario Weclipse";
},
{
id = 96553685978449395;
name = "Monica Weclipse";
},
{
id = 96556113096345076;
name = Xavier;
},
{
id = 71685207018702188;
name = "mikeziri ";
},
)
任何時候你使用構造函數'stringWithFormat:@「%@」'你犯了一個錯誤。除了浪費內存和處理器時間之外,這絕對無所不能。不要這樣做。只需使用原始字符串,而不使用stringWithFormat,它只是以一種處理器密集型的方式創建一個不需要的字符串副本。 – 2014-10-29 17:21:48