iOS学习——weak的应用场景

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS学习——weak的应用场景相关的知识,希望对你有一定的参考价值。

  OC采用ARC机制,因此strong等属性也有了应用场景。当使用alloc为一个对象在堆中分配内存空间,然后让栈区使用一个强指针指向该内存地址,就能在指针被自动释放签前,保证堆内数据不被释放。那么如果不是用强指针,而是用弱指针执行该堆内存地址,那么在分配内存空间后就会自动释放。

  那么,针对这种运用场景就有一个不同的指针属性。

@property (nonatomic, strong) UIScrollView *scrollView;
@property (nonatomic, weak) UIImageView *imgView;
@end

@implementation ViewController
- (void)loadView {
    self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    self.view = self.scrollView;
    //网络数据都是二进制
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://mpic.tiankong.com/bf0/7f9/bf07f9842b76981cc2cae5d8850bbeaf/640.jpg"]];
    UIImage *image = [UIImage imageWithData:data];
    UIImageView *imgView = [[UIImageView alloc] initWithImage:image];
    self.imgView = imgView;
    [self.scrollView addSubview:self.imgView];
    [self.imgView sizeToFit];
}

 


  在这里我做了几件事,一是在使用loadView将self的view改为scrollView,loadView调用的时候,系统将不再读取SB/Xib文件,所以即便你在xib上做了什么,只要使用loadView就能完全覆盖。二是创建了一个弱指针_imgView。在这里,如果将scrollView的strong改成weak,那么你将在执行[self.view addSubview:imgView];的时候代码崩溃,崩溃的原因显而易见,self.view等于nil,因为self.scrollview是弱指针,[[UIScrollView alloc] initWithFrame:self.view.bounds]创建完后就被释放掉了。但是imgView声明为弱指针却完全没有问题,那是因为在将imgView赋值给self.imgView前,做了[self.view addSubview:imgView],imgView添加到了self.view.subViews这个数组中,查看源码可以发现,subViews也是一个强指针,它指向了imgView这块内存,所以再次使用self.imgView这个弱指针指向该内存时,内存也不会被释放了。用弱指针指向imgVie更带来了一个好处,如果执行删除操作,一般采用removeFromSuperView,即将imgView从subViews中移除,如果self.imgView是强指针,虽然界面上看不到了,但是imgView分配在堆中的内存依然没有被释放,而弱指针指向,在执行remove后就立刻清理掉了这块堆内存。
  ps:网络数据都是二进制——网络数据传输到物理层,而网线使用电流进行传输,电流的高低电频就表示了二进制。
 

 


以上是关于iOS学习——weak的应用场景的主要内容,如果未能解决你的问题,请参考以下文章

iOS之深入解析weak关键字的底层原理

Xcode 快速开发 代码块

Xcode 快速开发 代码块 快捷键

iOS 知识点

IOS开发-OC学习-常用功能代码片段整理

iOS学习03