iOS開發(fā)技能weak和strong修飾符的規(guī)范使用詳解
正文
在oc 中,如果對象沒有被強引用,會被立即釋放。
__weak 表示弱引用 :
Assigning retained object to weak variable; object will be released after assignment
I weak &strong
1.1 使用場景:
控件的使用 :
- 如果界面的搭建,是采用storyBoard進行連接,控件屬性用weak。
- 如果是采用純代碼搭建界面,控件可以使用strong進行修飾;
- 因為此時控件的對象的兩個強引用(ViewController的noLable,以及view的subview)都會隨著控制器ViewController的銷毀而被釋放。
[self.view addSubview:_noLabel];
//將弱引用參照的_noLabel添加到視圖UIView;
UIViewController.h-》@property(null_resettable, nonatomic,strong) UIView *view;
-》UIView.h :@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *subviews;
-》強引用UILabel對象,所以這個UILabel對象已經(jīng)有擁有者,不會被放--再添加過程都是操作UILabel對象的地址
釋放對象的過程:
- 程序先對控制器進行釋放,如果沒有對象對View進行強引用,程序將對view進行釋放。
- 內存中如果沒有存在對subviews 對象進行強引用,就釋subviews。
- 此時如果UILabel對象沒有被強引用,UILabel對象將被釋放 。
1.2 屬性的修飾
- 創(chuàng)建的自定義對象,都用strong。
因為這些對象不會有UIViewController的控制,來進行強引用。
- NSString 使用copy;NSString應該使用copy而不是strong的屬性特性。
即使你聲明一個NSString的屬性,有人可能傳入一個NSMutableString的實例,然后在你沒有注意的情況下修改它。
- 數(shù)字型的,比如int ,就是使用assign。
1.3 weak和strong的不同
當一個對象不再有strong類型的指針指向它的時候 它會被釋放 ,即使還有weak型指針指向它。
一旦最后一個strong型指針離去 ,這個對象將被釋放,所有剩余的weak型指針都將被清除。
例子:
- 想象我們的對象是一條狗,狗想要跑掉(被釋放)。
- strong型指針就像是栓住的狗。只要你用牽繩掛住狗,狗就不會跑掉。
- 如果有5個人牽著一條狗(5個strong型指針指向1個對象),除非5個牽繩都脫落 ,否著狗是不會跑掉的?! ?/li>
- weak型指針就像是一個小孩指著狗喊到:“看!一只狗在那” 只要狗一直被栓著,小孩就能看到狗,(weak指針)會一直指向它。
- 只要狗的牽繩脫落,狗就會跑掉,不管有多少小孩在看著它。
II tom 基本實現(xiàn)(序列幀動畫)
- UIImageView 幀動畫的使用
- UIImage的兩種加載方式 :
有緩存方式的加載方法
無緩存方式將圖片加載至內存
- 重復代碼的封裝抽?。旱葍?yōu)化完畢之后,在刪除被優(yōu)化的舊代碼;
常見的優(yōu)化點有: 數(shù)據(jù)獨立性的處理(plist、網(wǎng)絡)、魔法數(shù)字的問題解決(宏,枚舉enum)、屬性的懶加載(重寫getter方法)
代碼示例
/** 序列幀動畫:順序播放一組圖片 1.提示、如果放置于Assets.xcassets目錄中的圖片不能使用imageWithContentsOfFile:path進行加載,只能使用imageName進行加載,即內存由系統(tǒng)負責了;Assets.xcassets 存放一些經(jīng)常使用的小圖片素材 2。Supporting Files 目錄通常存放,大、不經(jīng)常使用的圖片; */ - (void) frameAnimation : (UIButton *) button{ //如果正在動畫播放直接退出,來保證保證一個動畫播放完成 if ([self.imageList isAnimating]) {//考慮用戶的重復點擊進行頻繁的展示幀動畫問題 return; } //順序的改變UIImageView 的image,此時需要的參數(shù)有:需要播放的序列幀圖片數(shù)組animationImages(UIImage對象)、幀動畫的持續(xù)時間animationDuration、幀動畫的執(zhí)行次數(shù)animationRepeatCount--可自行查看UIImageView的屬性和方法 //動畫圖片的數(shù)組--可修改的數(shù)組NSMutableArray(manage a modifiable array of objects) NSMutableArray *arrayImage = [NSMutableArray array];//Creates and returns an empty array. //添加幀動畫播放的圖片 //設置圖片的數(shù)組的 for (int i = 0; i< self.animationImages[button.tag].count ; i++) { //獲取圖片名稱 NSString *pictureNamePrefix = self.animationImages[button.tag][i];//獲取文件名+擴展名 //方式一:有緩存加載圖片 // 添加Image的對象到幀圖片數(shù)組 // [arrayImage addObject: [UIImage imageNamed:pictureNamePrefix]];//參數(shù)為圖片名稱,png 格式的可以不加擴展名 //方式二:無緩存方式加載圖片-指定擴展名 // NSArray *arrayPicture = [pictureNamePrefix componentsSeparatedByString:@"."];//從字符中分隔成2個元素的數(shù)組(圖片名+擴展名) // NSString *path = [[NSBundle mainBundle] pathForResource:arrayPicture[0] ofType: arrayPicture[1]];//獲取圖片的全路徑 //方式二:無緩存方式加載圖片-不指定擴展名 NSString *path = [[NSBundle mainBundle] pathForResource:pictureNamePrefix ofType:nil]; [arrayImage addObject:[ UIImage imageWithContentsOfFile:path]]; } [self.imageList setAnimationImages:arrayImage]; //設置幀動畫的持續(xù)時間 [self.imageList setAnimationDuration: self.imageList.animationImages.count * 0.1]; //設置幀動畫的執(zhí)行次數(shù) [self.imageList setAnimationRepeatCount:1]; //開始動畫 [self.imageList startAnimating]; //釋放資源:動畫結束之后清除幀動畫數(shù)組 //nvokes a method of the receiver on the current thread using the default mode after a delay. // [self performSelector:@selector(cleanUpAnimationsArray) withObject:nil afterDelay:self.imageList.animationDuration];//定義在NSObject的分類中@interface NSObject (NSDelayedPerforming) //清除內存的代碼簡化--可以避免定義cleanUpAnimationsArray方法 [self.imageList performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.imageList.animationDuration]; }
see also
iOS解決壓縮之后圖片模糊的問題
http://chabaoo.cn/article/256792.htm
以上就是iOS開發(fā)技能weak和strong修飾符的規(guī)范使用詳解的詳細內容,更多關于iOS開發(fā)weak strong修飾符的資料請關注腳本之家其它相關文章!
相關文章
iOS NSURLSessionDownloadTask實現(xiàn)文件斷點下載的方法
本篇文章主要介紹了iOS NSURLSessionDownloadTask實現(xiàn)文件斷點下載的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01IOS 播放系統(tǒng)提示音使用總結(AudioToolbox)
這篇文章主要介紹了IOS 播放系統(tǒng)提示音使用總結(AudioToolbox)的相關資料,需要的朋友可以參考下2017-05-05iOS開發(fā)中Subview的事件響應以及獲取subview的方法
這篇文章主要介紹了iOS開發(fā)中Subview的事件響應以及獲取subview的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-09-09ios利用RunLoop原理實現(xiàn)去監(jiān)控卡頓實例詳解
這篇文章主要為大家介紹了ios利用RunLoop原理實現(xiàn)去監(jiān)控卡頓實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09iOS中使用NSURLConnection處理HTTP同步與異步請求
NSURLConnection的作用現(xiàn)在已經(jīng)基本被NSURLSession所取代,所以我們簡單了解下iOS中使用NSURLConnection處理HTTP同步與異步請求的方法即可:2016-07-07