返回
万物起源于id,Apple独门法宝大揭秘!
IOS
2023-09-15 21:26:58
壹. 天道酬勤,何谓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设计之美妙。