iOS---自动释放池

本文详细介绍了iOS中的自动释放池,包括自动释放对象的工作原理、MRC和ARC下的表现,以及解决经典面试题的策略。在MRC中,没有autorelease的对象可能会导致野指针错误,而在ARC下,系统类方法创建的对象会自动添加autorelease标记,以延迟释放。文中通过实例代码展示了如何避免内存问题,特别是在大量自动释放对象可能导致内存溢出时,提出了在循环内部添加自动释放池的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自动释放池

  • 在 mrc 的代码中,没有 weak,只有 assign
  • assign 修饰符号,对对象不做任何操作,只是简单的记录地址
  • weak 是 ARC 专有的,如果对象没有其他任何对象做强引用,会被立即释放!
  • weak 的效率非常差!
  • assign 会记录住地址,对象释放后,地址仍然保留,在 MRC 开发中,野指针错误非常频繁
  • weak 安全性很好!一旦没有强引用,自动将地址设置为 nil,OC中可以向 nil 发送任何消息都不会抱错!

  • autorelease 作用就是延迟释放,给对象添加延迟释放的标记

自动释放对象 atuorelease

自动释放对象
  • 所有 "autorelease" 的对象,在出了作用域之后,会被自动添加到"最近创建的"自动释放池中!
  • 在自动释放池被销毁或者耗尽的时候,会向池中所有对象发送 release 消息,释放池中对象
  • 自动释放池,在 ARC & MRC 程序中,同样有效!

MRC 下系统变量的测试

声明变量

@property (nonatomic, assign) UIButton *btn;

向控制器View中添加按钮:

// alloc / init - 应该出了作用域才会被释放
    //
    self.btn = [[UIButton alloc] init];
    self.btn.frame = CGRectMake(40, 40, 100, 100);
    self.btn.backgroundColor = [UIColor orangeColor];

    [self.view addSubview:self.btn];
    NSLog(@"%@", self.view.subviews);

    // 类方法创建的 - 是 ‘autorelease’ 的
    // 出了作用域,会被添加到自动释放池中
    // 自动释放池被销毁前,才释放对象!
    self.btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
    [self.view addSubview:self.btn];
    NSLog(@"%@", self.view.subviews);

    // ARC 上述演练不好使!以 weak 为主!

运行结果:

2015-03-25 10:31:20.055 09-自动释放池[27279:718327] (
    "<_UILayoutGuide: 0x7fc5d0d346b0; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x7fc5d0d2d810>>",
    "<_UILayoutGuide: 0x7fc5d0e77950; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x7fc5d0e77790>>",
    "<UIButton: 0x7fc5d0e7b230; frame = (40 40; 100 100); opaque = NO; layer = &l
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值