gpt4 book ai didi

ios - 为什么 NSDictionary 实现为类簇?

转载 作者:可可西里 更新时间:2023-11-01 05:54:05 36 4
gpt4 key购买 nike

类簇将许多私有(private)的具体子类分组在一个公共(public)抽象父类(super class)下。 Apple's documentationNSNumber 为例;以下每个便捷构造函数都返回一个不同的 NSNumber 私有(private)子类:

NSNumber *aChar = [NSNumber numberWithChar:’a’];
NSNumber *anInt = [NSNumber numberWithInt:1];
NSNumber *aFloat = [NSNumber numberWithFloat:1.0];
NSNumber *aDouble = [NSNumber numberWithDouble:1.0];

文档中解释了此处使用类集群的动机:

Because numbers of different types have many features in common (they can be converted from one type to another and can be represented as strings, for example), they could be represented by a single class. However, their storage requirements differ, so it’s inefficient to represent them all by the same class.

类簇的其他示例包括 NSStringNSDataNSArrayNSDictionary。基于上面的解释,我理解了为什么NSStringNSData 可能被实现为类簇。毕竟,NSString 实例的存储要求可能会有所不同,具体取决于它是使用 C 字符串还是使用 CFString 进行初始化。

但为什么是 NSArrayNSDictionary?似乎应该将这两个类实现为 CFMutableArrayCFMutableDictionary 的包装器。毕竟,NSDictionary 可以将任何内容存储为键或值;不知道存储要求是什么。因此,存储 CFDictionary 似乎是可行的方法。

例如,NSDictionary 可以实现为下面的 NSXDictionary:

// NSXDictionary.m

@interface NSXDictionary ()
@property (nonatomic, assign) CFMutableDictionaryRef dictionary;
@end

@implementation NSXDictionary

- (instancetype)init {
self = [super init];
if (self) {
_dictionary = CFDictionaryCreateMutable(NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
}
return self;
}

- (void)dealloc {
CFRelease(_dictionary);
}

- (NSUInteger)count {
return CFDictionaryGetCount(self.dictionary);
}

- (id)objectForKey:(id)aKey {
return CFDictionaryGetValue(self.dictionary, (__bridge const void *)(aKey));
}

@end

我的问题是:为什么 NSDictionary 实现为类簇?将它实现为一个具体类并让 NSMutableDictionary 子类化它不是更简单吗?

最佳答案

你可以用多少种不同的方式构造 NSDictionary?

有几种方法(initWithContentsOfFile、initWithObjectsAndKeys 等)更容易通过创建内部可变大小对象、填充它然后将其标记为不可变来实现。

Others (initWithObjects:forKeys:count:, initWithDictionary, init, @{}) 可以通过固定大小(但仍然暂时可变)的对象很好地服务。

然后你在上面有了可变/不可变的变体。

不是简单的类层次结构。从性能、占用的空间和创建的对象数量的角度来看,包装类不如类层次结构理想。

(此外,当然,最重要的答案是:因为 Apple 做主,这就是他们的决定。)

关于ios - 为什么 NSDictionary 实现为类簇?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23716037/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com