iOS小技能(開發規範): weak和strong修飾符的規範使用

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第36天,點選檢視活動詳情

引言

在oc 中,如果物件沒有被強引用,會被立即釋放。

__weak 表示弱引用 : Assigning retained object to weak variable; object will be released after assignment

I weak &strong

1.1 使用場景:

控制元件的使用 : 1. 如果介面的搭建,是採用storyBoard進行連線,控制元件屬性用weak。 2. 如果是採用純程式碼搭建介面,控制元件可以使用strong進行修飾;因為此時控制元件的物件的兩個強引用(ViewController的noLable,以及view的subview)都會隨著控制器ViewController的銷燬而被釋放。

objectivec [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物件已經有擁有者,不會被放--再新增過程都是操作UILabel物件的地址

   oc中釋放物件的過程:

釋放物件的過程: 1. 程式先對控制器進行釋放,如果沒有物件對View進行強引用,程式將對view進行釋放。 2. 記憶體中如果沒有存在對subviews 物件進行強引用,就釋subviews。 此時如果UILabel物件沒有被強引用,UILabel物件將被釋放 。

1.2 屬性的修飾

  1. 建立的自定義物件,都用strong。

    因為這些物件不會有UIViewController的控制,來進行強引用。

  2. NSString 使用copy;NSString應該使用copy而不是strong的屬性特性。

    即使你宣告一個NSString的屬性,有人可能傳入一個NSMutableString的例項,然後在你沒有注意的情況下修改它。

  3. 數字型的,比如int ,就是使用assign。

1.3 weak和strong的不同

當一個物件不再有strong型別的指標指向它的時候 它會被釋放 ,即使還有weak型指標指向它。一旦最後一個strong型指標離去 ,這個物件將被釋放,所有剩餘的weak型指標都將被清除。

例子: 

  1. 想象我們的物件是一條狗,狗想要跑掉(被釋放)。  strong型指標就像是栓住的狗。只要你用牽繩掛住狗,狗就不會跑掉。如果有5個人牽著一條狗(5個strong型指標指向1個物件),除非5個牽繩都脫落 ,否著狗是不會跑掉的。  

  2. weak型指標就像是一個小孩指著狗喊到:“看!一隻狗在那” 只要狗一直被栓著,小孩就能看到狗,(weak指標)會一直指向它。只要狗的牽繩脫落,狗就會跑掉,不管有多少小孩在看著它。

II tom 基本實現(序列幀動畫)

  1. UIImageView 幀動畫的使用
  2. UIImage的兩種載入方式 :

    有快取方式的載入方法

    無快取方式將圖片載入至記憶體

  3. 重複程式碼的封裝抽取:等優化完畢之後,在刪除被優化的舊程式碼;

    常見的優化點有: 資料獨立性的處理(plist、網路)、魔法數字的問題解決(巨集,列舉enum)、屬性的懶載入(重寫getter方法)

程式碼示例 ```objectivec /**

序列幀動畫:順序播放一組圖片

1.提示、如果放置於Assets.xcassets目錄中的圖片不能使用imageWithContentsOfFile:path進行載入,只能使用imageName進行載入,即記憶體由系統負責了;Assets.xcassets 存放一些經常使用的小圖片素材

2。Supporting Files 目錄通常存放,大、不經常使用的圖片;

*/

  • (void) frameAnimation : (UIButton ) button{ //如果正在動畫播放直接退出,來保證保證一個動畫播放完成 if ([self.imageList isAnimating]) {//考慮使用者的重複點選進行頻繁的展示幀動畫問題 return; } //順序的改變UIImageView 的image,此時需要的引數有:需要播放的序列幀圖片陣列animationImages(UIImage物件)、幀動畫的持續時間animationDuration、幀動畫的執行次數animationRepeatCount--可自行檢視UIImageView的屬性和方法 //動畫圖片的陣列--可修改的陣列NSMutableArray(manage a modifiable array of objects) NSMutableArray arrayImage = [NSMutableArray array];//Creates and returns an empty array. //新增幀動畫播放的圖片 //設定圖片的陣列的 for (int i = 0; i< self.animationImages[button.tag].count ; i++) { //獲取圖片名稱 NSString *pictureNamePrefix = self.animationImages[button.tag][i];//獲取檔名+副檔名

    //方式一:有快取載入圖片
    // 新增Image的物件到幀圖片陣列
    

    // [arrayImage addObject: [UIImage imageNamed:pictureNamePrefix]];//引數為圖片名稱,png 格式的可以不加副檔名

    //方式二:無快取方式載入圖片-指定副檔名
    

    // NSArray arrayPicture = [pictureNamePrefix componentsSeparatedByString:@"."];//從字元中分隔成2個元素的陣列(圖片名+副檔名) // 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]; //設定幀動畫的持續時間 [self.imageList setAnimationDuration: self.imageList.animationImages.count * 0.1]; //設定幀動畫的執行次數 [self.imageList setAnimationRepeatCount:1];

    //開始動畫

    [self.imageList startAnimating];

    //釋放資源:動畫結束之後清除幀動畫陣列

    //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解決壓縮之後圖片模糊的問題

https://blog.csdn.net/z929118967/article/details/105414506

🍅 聯絡作者: iOS逆向(公號:iosrev)


🍅 作者簡介:CSDN 部落格專家認證🏆丨全站 Top 50、華為云云享專家認證🏆、iOS逆向公號號主


🍅 簡歷模板、技術互助。關注我,都給你。