- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
类簇将许多私有(private)的具体子类分组在一个公共(public)抽象父类(super class)下。 Apple's documentation以 NSNumber
为例;以下每个便捷构造函数都返回一个不同的 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.
类簇的其他示例包括 NSString
、NSData
、NSArray
和 NSDictionary
。基于上面的解释,我理解了为什么NSString
和NSData
可能被实现为类簇。毕竟,NSString
实例的存储要求可能会有所不同,具体取决于它是使用 C 字符串还是使用 CFString
进行初始化。
但为什么是 NSArray
和 NSDictionary
?似乎应该将这两个类实现为 CFMutableArray
和 CFMutableDictionary
的包装器。毕竟,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/
我在使用以下代码来创建NSDictionaries的NSDictionary时遇到麻烦。没有编译错误,但是在运行时,此代码失败。 NSDictionary *section0 = [NSDiction
我得到了 '[NSDictionary]!? is not convertible to [NSDictionary]?' error on following code. var jsonRes
我有以下代码: NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSMutableDictionary *g
目前我有以下代码可以从 xml 文件中获取数据。这到目前为止有效 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)el
在 Objective C 中,我们将字典值的 NSArray 分配给 NSDictionary 变量并获取键的值,如下所示,NSDictionary *dictValue = [array obje
将对象从一个 NSDictionary 复制到另一个 NSDictionary 的最简洁方法是什么?我必须从字典中提取特定值并将它们存储在新字典中。目前我有一些简单的代码,像这样...... NSSt
希望有人能帮助我: 我正在使用 NSDictionary 来填充 UITableView。它的模型类似于 [key:userID => value:userName]。tableView 只填充了 u
我有一本字典,其中包含从解析 JSON 中提取的其他字典中的子项。结构如下所示: { children = (
我需要检查 nsdictionary 中的元素是否不等于 normal,然后将该元素复制到一个数组中作为我的 UITable 的数据源。 这是一个条目的例子: Trailer = {
我正在尝试将数据添加到嵌套在其他词典中的 NSMutableDictionary。 在添加数据的代码运行之前开始输出 DayData Dictionary { //DayData
我的应用程序有一个 NSDictionary,其中包含许多其他 NSDictionary。如果我打印出这本词典,它的内容如下: oxip = { created = "2014-02-
我有一个 NSDictionary 记录这个: address = "30 East 23rd Street"; address1 = "30 East 23rd Street";
好的,我有一个 .plist 文件, 其中我有一个 NSDictionary *StoredAddresses, 在 StoredAddresses 中,是另一把 NSDictionary 我知道我可
您好,我在将数据从一个 NSDictionary 复制到另一个我使用的 NSDictionary 时遇到问题 [dicForFoodproduct_fromWeb initWithDictionary
我有一个包含四个对象的NSDictionary。每个对象都是一个包含数千个对象的 NSDictionary。我已经通过记录顶级字典的描述来验证它包含它应该包含的内容。但是,当我运行下面的代码以枚举该顶
给定的图像具有数据结构 我能够从 FirstText 和 LastText 获取数据,NSPredicate 是 subData.FirstText contains[cd] %@ OR subDat
我有一些装满书籍的 [NSDictionary],我正在检查这些书籍的值以便更好地在 UICollectionView 中显示内容。我正在检查一个 key 是否包含多个 ISBN 编号。如果是这样,我
我有一个很大的 NSDictionary,里面有一个较小的 NSDictionary。我想自动释放较大的一个,并保留第二个。我的初始化方法中有这段代码: // Autoreleased stage d
我对 Objective C 比较陌生。我有一个包含 NSDictionary 对象的 NSArray。我正在调用网络服务来获取数据。我有一个 PickerView,这是它的数据源(我实现了 numb
我想添加一个不同的字典作为另一个键字典的值,但在我的循环中,我发现相同的值添加到我所有的字典键。这是我的代码: for (MyObject *message in messages) {
我是一名优秀的程序员,十分优秀!