返回

万物起源于id,Apple独门法宝大揭秘!

IOS

壹. 天道酬勤,何谓id指针?

iOS中,你的一举一动,一言一行,皆与id指针息息相关。变量、函数、对象指针,皆可归为id类型。其中对象指针本质上是结构体struct objc_object类型的指针,其本身仅有一个isa成员变量,存储的是Class类型,Class又是一个struct objc_class结构体。

贰. 缘分伊始,邂逅id指针

Objective-C,作为一门面向对象的编程语言,自然离不开对象指针,这可是管理对象内存的关键所在。引入id指针,可谓顺理成章,一个标准的例子是NSMutableArray的定义:

@interface NSMutableArray : NSArray
- (void)addObject:(id)anObject;
- (id)objectAtIndex:(NSUInteger)index;
...
@end

这里addObject:(id)anObject方法,允许你将任何对象添加到NSMutableArray中,而objectAtIndex:(NSUInteger)index方法,将从该数组中返回一个id类型对象。

叁. 刨根问底,探寻id指针的奥秘

为何设计id指针?归根结底,它能让Objective-C代码更加灵活,打破了强类型语言的束缚,无需关心对象类型,即可将之存储或取出。譬如:

id object = [[NSObject alloc] init];
if ([object isKindOfClass:[NSString class]]) {
    NSString *string = object;
} else if ([object isKindOfClass:[NSArray class]]) {
    NSArray *array = object;
}

肆. 细致入微,窥探id指针的内部构造

id指针内部结构如何?使用objc-dump工具即可一探究竟:

typedef struct objc_object {
    Class isa;
} *id;

typedef struct objc_class {
    Class isa;
    ...
} *Class;

可见,struct objc_object仅有一个Class类型的成员变量isa,存储的是Class对象指针,而Class类型又是一个名为struct objc_class的结构体,其中同样包含一个isa成员变量,指向元类。

伍. 从心出发,揭秘Apple内存管理秘笈

id指针的作用,可谓博大精深,它深入Apple内存管理理念的方方面面,探索无穷尽。继续探寻,方能感受到Apple设计之美妙。