自定义单个KeyValuePair类与NSMutableDictionary

时间:2011-09-27 09:03:53

标签: objective-c performance nsmutabledictionary key-value nskeyvalue

我遇到了一种情况,即如果迭代我必须编写一个具有良好数量的循环,并且在此循环中我有一个NSData对象,我必须与一个键关联。这导致我搜索一个简单的目标-c _KeyValuePair_类,但是找不到一个,所以我写了自己的。现在我很想知道只使用NSMutableDictinoary只持有1个键和值是否有任何好处。在整个项目中尝试这两个之后,我无法在App UI端或使用Instruments Time Profiler来区分。

所以我的问题是:

  • 单个kvpair类可以比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

编辑以修复初始说明。似乎我得到了中途跋涉并且从未回来完成它。

1 个答案:

答案 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];
}