一个UI控件弱引用问题

今天学习的过程中看到如下代码:


@interface ViewController ()
@property (weak,nonatomic) UIButton *buttonA;
@property (weak,nonatomic) UIButton *buttonB;
@property (strong,nonatomic) UILabel *theLabel;

- (void)initInterface;
- (void)updateInterface;
- (void)handleButton:(id)sender;
@end


@implementation ViewController
<p class="p1"><span class="s1">- (</span><span class="s2">void</span><span class="s1">)initInterface {</span></p><p class="p2"><span class="s3">    </span><span class="s2">self</span><span class="s3">.</span><span class="s4">buttonA</span><span class="s3"> =[</span><span class="s5">UIButton</span><span class="s3"> </span><span class="s1">buttonWithType</span><span class="s3">:</span><span class="s1">UIButtonTypeRoundedRect</span><span class="s3">];</span></p><p class="p2"><span class="s3">    [</span><span class="s2">self</span><span class="s3">.</span><span class="s4">buttonA</span><span class="s3"> </span><span class="s1">addTarget</span><span class="s3">:</span><span class="s2">self</span><span class="s3"> </span><span class="s1">action</span><span class="s3">:</span><span class="s2">@selector</span><span class="s3">(handleButton:) </span><span class="s1">forControlEvents</span><span class="s3">:</span><span class="s1">UIControlEventTouchDown</span><span class="s3">];</span></p><p class="p2"><span class="s3">    [</span><span class="s2">self</span><span class="s3">.</span><span class="s4">buttonA</span><span class="s3"> </span><span class="s1">setTitle</span><span class="s3">:</span><span class="s6">@"Button A"</span><span class="s3"> </span><span class="s1">forState</span><span class="s3">:</span><span class="s1">UIControlStateNormal</span><span class="s3">];</span></p><p class="p3"><span class="s1">    </span></p><p class="p2"><span class="s3">    </span><span class="s2">self</span><span class="s3">.</span><span class="s4">buttonB</span><span class="s3"> =[</span><span class="s5">UIButton</span><span class="s3"> </span><span class="s1">buttonWithType</span><span class="s3">:</span><span class="s1">UIButtonTypeRoundedRect</span><span class="s3">];</span></p><p class="p2"><span class="s3">    [</span><span class="s2">self</span><span class="s3">.</span><span class="s4">buttonB</span><span class="s3"> </span><span class="s1">addTarget</span><span class="s3">:</span><span class="s2">self</span><span class="s3"> </span><span class="s1">action</span><span class="s3">:</span><span class="s2">@selector</span><span class="s3">(handleButton:) </span><span class="s1">forControlEvents</span><span class="s3">:</span><span class="s1">UIControlEventTouchDown</span><span class="s3">];</span></p><p class="p2"><span class="s3">    [</span><span class="s2">self</span><span class="s3">.</span><span class="s4">buttonB</span><span class="s3"> </span><span class="s1">setTitle</span><span class="s3">:</span><span class="s6">@"Button B"</span><span class="s3"> </span><span class="s1">forState</span><span class="s3">:</span><span class="s1">UIControlStateNormal</span><span class="s3">];</span></p><p class="p3"><span class="s1">    </span></p><p class="p1"><span class="s1">    </span><span class="s2">self</span><span class="s1">.</span><span class="s4">theLabel</span><span class="s1">=[</span><span class="s5">UILabel</span><span class="s1"> </span><span class="s7">new</span><span class="s1">];</span></p><p class="p4"><span class="s3">    </span><span class="s2">self</span><span class="s3">.</span><span class="s4">theLabel</span><span class="s3">.</span><span class="s5">text</span><span class="s3">=</span><span class="s1">@"Welcome"</span><span class="s3">;</span></p><p class="p5"><span class="s3">    [</span><span class="s2">self</span><span class="s3"> </span><span class="s1">updateInterface</span><span class="s3">];</span></p><p class="p1"><span class="s1">}</span></p>

@end


同是UI控件,作者将button设为weak的,而label却是strong的,在updateInterface方法中我们看到button和label都被初始化,可为什么一个是strong另一个却是weak呢?

仔细观察initInterface方法我们发现他们使用的初始化方法是不同的,button用的是buttonWithType方法,而label用的是new方法。

先来说label,因为new方法分配的对象必须被一个指针强引用,否则在执行完这句代码后对象就 会因为没有被强引用而释放掉,因此label必须是强类型的。那button是弱类型的话难道对象不会被释放吗?问题就出在这个buttonWithType方法上。

根据ARC规则,所有非alloc/new/copy等开头的方法返回的对象都是autorelease的(参见点击打开链接 ),因此buttonWithType方法返回一个autorelease对象,即使不被任何对象所强引用,它也不会立即释放,而是要等runloop结束后才释放。因此

self.buttonA =[UIButton buttonWithType:UIButtonTypeRoundedRect];
之后self.buttonA指向的内存依然存在,使用没有问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值