自动释放池
- 在 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