我遇到了一种情况,即如果迭代我必须编写一个具有良好数量的循环,并且在此循环中我有一个NSData
对象,我必须与一个键关联。这导致我搜索一个简单的目标-c _KeyValuePair_
类,但是找不到一个,所以我写了自己的。现在我很想知道只使用NSMutableDictinoary
只持有1个键和值是否有任何好处。在整个项目中尝试这两个之后,我无法在App UI端或使用Instruments Time Profiler来区分。
所以我的问题是:
NSMutableDictionary
NSMutableDict
是否会分配更多的空间,这样做部分代码:
for (int i = 0, count = [photoUrls count]; i < count; ++i) {
// Example usage of the kvp class
NSMutableDictionary *imageRequest = [[NSMutableDictionary alloc] init];
JHKeyValuePair *kvPair = [[JHKeyValuePair alloc] initWithKey:@"DAILY" andValue:[NSNumber numberWithInt:i];
[imageRequest setObject:self forKey:@"delegate"];
[imageRequest setObject:kvPair forKey:@"userInfo"];
[kvPair release];
[imageRequest setObject:[dailySpecialData objectForKey:@"IMAGE_URL"] forKey:@"url"];
[imageDownloader addDownloadRequestToQueue:imageRequest];
[imageRequest release];
}
JHKeyValuePair.h
@interface JHKeyValuePair : NSObject {
id key;
id value;
}
@property (nonatomic, retain) id key;
@property (nonatomic, retain) id value;
- (id)initWithKey:(id)aKey andValue:(id)aValue;
@end
JHKeyValuePair.m
#import "JHKeyValuePair.h"
@implementation JHKeyValuePair
@synthesize key;
@synthesize value;
- (id)initWithKey:(id)aKey andValue:(id)aValue {
if ((self = [super init])) {
key = [aKey retain];
value = [aValue retain];
}
return self;
}
- (void)dealloc {
[key release], key = nil;
[value release], value = nil;
[super dealloc];
}
- (id)copyWithZone:(NSZone *)zone {
JHKeyValuePair *copy = [[JHKeyValuePair allocWithZone:zone] init];
[copy setKey:self.key];
[copy setValue:self.value];
return copy;
}
- (BOOL)isEqual:(id)anObject {
BOOL ret;
if (self == anObject) {
ret = YES;
} else if (![anObject isKindOfClass:[JHKeyValuePair class]]) {
ret = NO;
} else {
ret = [key isEqual:((JHKeyValuePair *)anObject).key] && [value isEqual:((JHKeyValuePair *)anObject).value];
}
return ret;
}
@end
编辑以修复初始说明。似乎我得到了中途跋涉并且从未回来完成它。
答案 0 :(得分:1)
如果你真的想要获得速度,你会做很多不必要的保留版本,每次设置你的密钥/值时都不需要这些版本。如果你使用一个结构和一些基本的c代码,你可以更快地实现一些东西,但是你牺牲简单而一致的内存管理,你可以从目标c方式做到这一点。
typedef struct {
id key;
id value;
} Pair;
BOOL isEqual(Pair a, Pair b); //...
// You will need to clean up after yourself though:
void PairRelease(Pair p) {
[p.key release];
[p.value release];
}