2、class与内存地址

案例

@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 中类对象、指针和内存地址的关系:

  1. cls 变量存储 SLPerson 的类对象
  2. &cls 获取 cls 变量本身的内存地址
  3. void *obj 指向 cls 变量的地址,而不是类对象
  4. (__bridge id)obj 尝试将指向变量地址的指针转换为对象,这是不安全的操作
  5. 最后创建实例对象演示正确的对象使用方式

崩溃原因:[(__bridge id)obj speak] 会崩溃是因为:

  • obj 指向的是 cls 变量的地址,而不是一个有效的 Objective-C 对象
  • 桥接转换后,系统会尝试将这个地址当作对象来使用
  • 由于这个地址不包含有效的对象结构(如 isa 指针),访问时触发了内存访问错误
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容