網站首頁 編程語言 正文
正文
在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
相關推薦
- 2022-12-26 使用python如何對圖片進行壓縮_python
- 2022-09-01 詳解C語言中for循環與while循環的用法_C 語言
- 2022-03-25 .NET微服務架構CI/CD鏡像自動分發_實用技巧
- 2023-01-26 Python上下文管理器深入講解_python
- 2022-04-22 Golang執行流程詳解,兩種執行流程方式有什么不同
- 2022-11-14 C++設計與聲明超詳細講解_C 語言
- 2022-05-25 org.springframework.data.redis.RedisSystemExceptio
- 2022-03-12 C++實現堆排序實例介紹_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支