国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

iOS中assign,copy,retain之間的區(qū)別以及weak和strong的區(qū)別 代理為啥要用weak修飾

2019-11-09 18:00:19
字體:
供稿:網(wǎng)友

weak strong 都是 修飾屬性的

@PRoperty(weak) UIButton *button;

只要有任何strong 指向某個對象A,ARC就不會摧毀它(A)。而weak所指向的對象B,只要沒有其他strong指向該對象(B),ARC會摧毀它(B)。

什么是assign,copy,retain之間的區(qū)別? 

assign: 簡單賦值,不更改索引計數(shù)(Reference Counting)。 

copy: 建立一個索引計數(shù)為1的對象,然后釋放舊對象 

retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數(shù)為1 

weak 和strong的區(qū)別:

(weak和strong)不同的是 當(dāng)一個對象不再有strong類型的指針指向它的時候 它會被釋放  ,即使還有weak型指針指向它。

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

可能有個例子形容是妥當(dāng)?shù)摹?/p>

想象我們的對象是一條狗,狗想要跑掉(被釋放)。

strong型指針就像是栓住的狗。只要你用牽繩掛住狗,狗就不會跑掉。如果有5個人牽著一條狗(5個strong型指針指向1個對象),除非5個牽繩都脫落 ,否著狗是不會跑掉的。

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

只要最后一個strong型指針不再指向?qū)ο螅敲磳ο缶蜁会尫牛瑫r所有的weak型指針都將會被清除。

 

使用assign: 對基礎(chǔ)數(shù)據(jù)類型 (NSInteger,CGFloat)和C數(shù)據(jù)類型(int, float, double, char, 等等) 

使用copy: 對NSString 

使用retain: 對其他NSObject和其子類 

nonatomic關(guān)鍵字: 

atomic是Objc使用的一種線程保護技術(shù),基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數(shù)據(jù)錯誤。而這種機制是耗費系統(tǒng)資源的,所以在iphone這種小型設(shè)備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇。 

代理時 為什么用weak 不用 strong

在開發(fā)中我們經(jīng)常使用代理,或自己寫個代理,而代理屬性都用weak(assign)修飾,看過有些開發(fā)者用strong(retain),但并沒發(fā)現(xiàn)有何不妥,也不清楚weak(assign)與strong(retain)修飾有何區(qū)別

功能實現(xiàn)就行了,考慮這么多干嘛~~~我只能哈哈哈

weak:指明該對象并不負(fù)責(zé)保持delegate這個對象,delegate這個對象的銷毀由外部控制@property (nonatomic, weak) id<HSDogDelegate>delegate;strong該對象強引用delegate,外界不能銷毀delegate對象,會導(dǎo)致循環(huán)引用(Retain Cycles)@property (nonatomic, strong) id<HSDogDelegate>delegate;

可能你還不太理解,沒關(guān)系,下面先舉例,看結(jié)果,再分析!

舉例

HSDog類

HSDog.h:

@protocol HSDogDelegate <NSObject>@end@interface HSDog : NSObject@property (nonatomic, weak) id<HSDogDelegate>delegate;@end

HSPerson.m:

#import "HSDog.h"@implementation HSDog- (void)dealloc{ NSLog(@"HSDog----銷毀");}@endHSPerson類

HSPerson.h:

@interface HSPerson : NSObject@end

HSPerson.m:

#import "HSPerson.h"#import "HSDog.h"@interface HSPerson()<HSDogDelegate>/** 強引用dog*/@property (nonatomic, strong) HSDog *dog;@end@implementation HSPerson- (instancetype)init{ self = [super init]; if (self) { // 實例化dog self.dog = [[HSDog alloc] init]; // dog的delegate引用self,self的retainCount,取決于delegate修飾,weak:retainCount不變,strong:retainCount + 1 self.dog.delegate = self; } return self;}- (void)dealloc{ NSLog(@"HSPerson----銷毀");}@end在ViewController實現(xiàn):#import "ViewController.h"#import "HSPerson.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // 實例化person, self對person弱引用,person的retainCount不變 HSPerson *person = [[HSPerson alloc] init];}@end

結(jié)果

weak修飾代理@property (nonatomic, weak) id<HSDogDelegate>delegate;

運行->打印

HSPerson----銷毀HSDog----銷毀strong修飾代理@property (nonatomic, strong) id<HSDogDelegate>delegate;

運行->打印....并未打印,說明HSPerson、HSDog對象沒調(diào)用dealloc方法,兩個對象未銷毀這也是我們經(jīng)常說的內(nèi)存泄露,該釋放的內(nèi)存并未釋放!

分析

使用strong

person對dog強引用

@property (nonatomic, strong) HSDog *dog; person

self.dog.delegate又對person強引用,使person的retainCount + 1

@property (nonatomic, strong) id<HSDogDelegate>delegate;

當(dāng)viewController不對person引用后,dog.delegate對person還強引用著,person的retainCount為1,所以person不會釋放,dog固然也不會釋放,這就是造成循環(huán)引用的導(dǎo)致內(nèi)存泄露的原因!

使用weak

person對dog強引用

@property (nonatomic, strong) HSDog *dog; person

self.dog.delegate只對person弱引用,并未使person的retainCount + 1

@property (nonatomic, weak) id<HSDogDelegate>delegate;

所以當(dāng)viewController不對person引用后,person的retainCount為0,即person會被釋放,那么dog也被釋放

鏈接文章: http://www.jianshu.com/p/398472616435

總結(jié): weak 會被 ARC 釋放 strong 不會被自動釋放 

 strong   vc.delegate=self 引用計數(shù)加1 

 weak   引用計數(shù)不加1


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 家居| 武山县| 饶河县| 黑河市| 蒙山县| 五莲县| 咸阳市| 大邑县| 平遥县| 漳平市| 乐平市| 云龙县| 常山县| 定襄县| 白玉县| 郸城县| 天长市| 嘉兴市| 井陉县| 剑河县| 万源市| 安仁县| 苗栗市| 炎陵县| 德令哈市| 荃湾区| 综艺| 边坝县| 尼玛县| 双桥区| 凤城市| 湖州市| 鄯善县| 渝北区| 泰顺县| 北川| 和龙市| 威信县| 威远县| 惠东县| 乡城县|