美文网首页
iOS weak避免强引用objc对象

iOS weak避免强引用objc对象

作者: Qing学 | 来源:发表于2018-02-01 15:40 被阅读0次

如果我们用对象A的属性(strong修饰)去指向一个objc对象B。那么如果对象A没有被释放对象B永远不会被释放。如果对象B是一个view当我们已经把B添加到视图上的时候。有些情况下可能希望提前释放掉对象B。这种情况下我们可以使用weak修饰符指向来达到可以提前释放的效果。
代码如下

@interface ViewController ()
//使用weak修饰weakView
@property (nonatomic, weak) UIView *weakView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.weakView = [[UIView alloc]initWithFrame:CGRectMake(0, 20, 300, 40)];
    _weakView.backgroundColor = [UIColor redColor];
    [self.view addSubview:_weakView];
}

通过结果发现weakView并没有强引用新创建的View。新创建的View呗创建出来之后直接被释放了。这种方法并不可取。
我们更换一种方法

@interface ViewController ()

@property (nonatomic, weak) UIView *weakView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
//创建一个cacheView指向新创建的view
    UIView *cacheView = [[UIView alloc]initWithFrame:CGRectMake(0, 20, 300, 40)];
//通过一个weak修饰的属性指向cacheView
    self.weakView = cacheView;
    _weakView.backgroundColor = [UIColor redColor];
    [self.view addSubview:_weakView];
}

发现这种可以保证在属性指向过程中不会强引用cacheView,又能保证可以在必要的时候提前释放掉view
验证自动释放池外是否可以通过weak指针正常获取到cacheView

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSLog(@"%@",self.weakView);
}

控制台输出为:
2018-02-01 15:08:29.019353+0800 WeakView[1806:133550] <UIView: 0x7f91a1d09f60; frame = (0 20; 300 40); layer = <CALayer: 0x604000037ca0>>
原理分析:
1.现在的绝大多数开发都是使用ARC来进行开发。因为使用了自动释放池。我们在自动释放池中创建的对象默认都是使用strong修饰的。但是会在自动释放池外autorealease掉。如果直接用weak属性来存储新创建的view。那么会直接使用weak对象来指向。直接被释放掉了。
2.我们先用一个临时指针指向,通过[self.view addSubview:_weakView]这句代码会对weakView进行强引用。然后用weak指针指向。这样weakView既不会被自身强引用。同时也可以通过weak指针来获取对象。

相关文章

  • iOS weak避免强引用objc对象

    如果我们用对象A的属性(strong修饰)去指向一个objc对象B。那么如果对象A没有被释放对象B永远不会被释放。...

  • 0x003 理解iOS weak对象存储原理

    理解iOS weak对象存储原理 1、案例代码 分别声明__weak弱引用对象obj、obj1 2、分析__wea...

  • Weak实现原理

    runtime:版本objc4-756.2 weak初始化objc_initWeak 使用weak修饰对象,通过调...

  • weak的底层实现(学习笔记)

    weak的基本用法 weak是弱引用,用weak描述修饰或者引用对象的计数器不会加一,并且会在引用对象被释放的时候...

  • iOS-底层原理26:weak原理

    1、weak原理概括 weak是弱引用,用weak描述修饰或者所引用对象的计数器不会加一,并且会在引用的对象被释放...

  • Runtime之weak的底层实现

    weak基本用法 weak是弱引用,用weak描述修饰或者所引用对象的计数器不会加一,并且会在引用的对象被释放的时...

  • 问题:weak 底层实现原理

    weak基本用法 weak是弱引用,用weak描述修饰或者所引用对象的计数器不会加一,并且会在引用的对象被释放的时...

  • iOS 中 weak 的实现原理

    开头 本文是看了 iOS 底层解析weak的实现原理(包含weak对象的初始化,引用,释放的分析) 一文后,为了加...

  • weak底层实现原理

    一、weak基本用法 weak是弱引用,用weak来修饰、描述所引用对象的计数器并不会加1,而且weak会在引用对...

  • iOS weak修饰属性的原理

    一、weak基本用法 weak是弱引用,用weak来修饰、描述所引用对象的计数器并不会加1,而且weak会在引用对...

网友评论

      本文标题:iOS weak避免强引用objc对象

      本文链接:https://www.haomeiwen.com/subject/nhpdzxtx.html