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