2

我遇到了一种情况,我必须编写一个大量迭代的循环,并且在这个循环中NSData,我有一个必须与键关联的对象。这导致我搜索一个简单的objective-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

编辑以修复初始解释。似乎我在句子中间偏离了方向,再也没有回来完成它。

4

1 回答 1

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];
}
于 2011-09-27T12:47:05.153 回答