標籤:物理層 執行 ati ini 操作 學習 ima nsurl tom
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的應用情境