日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

iOS開發技能weak和strong修飾符的規范使用詳解_IOS

作者:公眾號iOS逆向 ? 更新時間: 2022-09-18 編程語言

正文

在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對象已經有擁有者,不會被放--再添加過程都是操作UILabel對象的地址

釋放對象的過程:

  • 程序先對控制器進行釋放,如果沒有對象對View進行強引用,程序將對view進行釋放。
  • 內存中如果沒有存在對subviews 對象進行強引用,就釋subviews。
  • 此時如果UILabel對象沒有被強引用,UILabel對象將被釋放 。

1.2 屬性的修飾

  • 創建的自定義對象,都用strong。

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

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

即使你聲明一個NSString的屬性,有人可能傳入一個NSMutableString的實例,然后在你沒有注意的情況下修改它。

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

1.3 weak和strong的不同

當一個對象不再有strong類型的指針指向它的時候 它會被釋放 ,即使還有weak型指針指向它。

一旦最后一個strong型指針離去 ,這個對象將被釋放,所有剩余的weak型指針都將被清除。

例子: 

  • 想象我們的對象是一條狗,狗想要跑掉(被釋放)。  
  • strong型指針就像是栓住的狗。只要你用牽繩掛住狗,狗就不會跑掉。
  • 如果有5個人牽著一條狗(5個strong型指針指向1個對象),除非5個牽繩都脫落 ,否著狗是不會跑掉的。  
  • weak型指針就像是一個小孩指著狗喊到:“看!一只狗在那” 只要狗一直被栓著,小孩就能看到狗,(weak指針)會一直指向它。
  • 只要狗的牽繩脫落,狗就會跑掉,不管有多少小孩在看著它。

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

  • UIImageView 幀動畫的使用
  • UIImage的兩種加載方式 :

有緩存方式的加載方法

無緩存方式將圖片加載至內存

  • 重復代碼的封裝抽取:等優化完畢之后,在刪除被優化的舊代碼;

常見的優化點有: 數據獨立性的處理(plist、網絡)、魔法數字的問題解決(宏,枚舉enum)、屬性的懶加載(重寫getter方法)?

代碼示例

/**
  序列幀動畫:順序播放一組圖片
 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://www.jb51.net/article/256792.htm

原文鏈接:https://juejin.cn/post/7114465261951909895

欄目分類
最近更新