Preface

Objective-C

NSArray & NSMutableArray

我们都知道,NSArray 是 Obj-C 中的不可变数组,而 NSMutableArray 是 Obj-C 的可变数组。这里我将 Obj-C 中几乎所有可能涉及到的数组对象,进行尝试打印其类别信息:

NSLog(@"%@", [[NSMutableArray alloc] class]);                                 // __NSPlaceholderArray
NSLog(@"%@", [[NSArray alloc] class]);                                        // __NSPlaceholderArray
NSLog(@"%@", [[[NSArray alloc] class] superclass]);                           // NSMutableArray
NSLog(@"%@", [[[[NSArray alloc] class] superclass] superclass]);              // NSArray
NSLog(@"%@", [[[[[NSArray alloc] class] superclass] superclass] superclass]); // NSObject

NSLog(@"%@", [[NSArray array] class]);                                        // __NSArray0
NSLog(@"%@", [[[NSArray alloc] init] class]);                                 // __NSArray0
NSLog(@"%@", [[[[NSArray alloc] init] class] superclass]);                    // NSArray

NSLog(@"%@", [[NSMutableArray array] class]);                                 // __NSArrayM
NSLog(@"%@", [[[NSMutableArray array] class] superclass]);                    // NSMutableArray

NSLog(@"%@", [@[@1] class]);                                                  // __NSSingleObjectArrayI
NSLog(@"%@", [[@[@1] class] superclass]);                                     // NSArray

NSLog(@"%@", [@[@1, @2] class]);                                              // __NSArrayI
NSLog(@"%@", [[@[@1, @2] class] superclass]);                                 // NSArray

NSMutableArray *arr = [NSMutableArray array];
NSLog(@"%@", [arr class]);                                                    // __NSArrayM

[arr addObject:@1];
NSLog(@"%@", [arr class]);                                                    // __NSArrayM

由以上结果,我们可得出下图的继承树:

1

显而易见,NSArrayNSMutableArray 都属于类簇(Class Cluster),其并不代表数组对象的真实类型。

Swift

Array

Reference