案例
@interface SLPerson : NSObject
@property(nonatomic, copy)NSString *name;
  - (void)speak;
@end
- (void)personDemo {
id cls = [SLPerson class];
NSLog(@"1-SLPerson class = %@ 地址 = %p", cls, &cls);
void *obj = &cls;//尝试obj被转化成了一个指向 Person Class的指针
NSLog(@"2-Void *obj = %@ 地址 = %p", obj, &obj);
 //    [(__bridge id)obj speak];//尝试使用id转化成了objc_object类型 //Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
NSLog(@"3-(__bridge id)obj = %@ 地址 = %p", (__bridge id)obj, &obj);
//崩溃原因:创建类对象并不是有效的Objective-C 对象
SLPerson *p = [[SLPerson alloc] init];
NSLog(@"4-SLPerson instance = %@ 地址 = %p", p, &p);
[p speak];
}
这个示例演示了 Objective-C 中类对象、指针和内存地址的关系:
- cls 变量存储 SLPerson 的类对象
 - &cls 获取 cls 变量本身的内存地址
 - void *obj 指向 cls 变量的地址,而不是类对象
 - (__bridge id)obj 尝试将指向变量地址的指针转换为对象,这是不安全的操作
 - 最后创建实例对象演示正确的对象使用方式
 
崩溃原因:[(__bridge id)obj speak] 会崩溃是因为:
- obj 指向的是 cls 变量的地址,而不是一个有效的 Objective-C 对象
 - 桥接转换后,系统会尝试将这个地址当作对象来使用
 - 由于这个地址不包含有效的对象结构(如 isa 指针),访问时触发了内存访问错误