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:网络数据都是二进制——网络数据传输到物理层,而网线使用电流进行传输,电流的高低电频就表示了二进制。