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

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

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

2019-11-09 17:00:46
字體:
來源:轉載
供稿:網(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)不同的是 當一個對象不再有strong類型的指針指向它的時候 它會被釋放  ,即使還有weak型指針指向它。

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

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

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

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

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

只要最后一個strong型指針不再指向對象,那么對象就會被釋放,同時所有的weak型指針都將會被清除。

 

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

使用copy: 對NSString 

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

nonatomic關鍵字: 

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

代理時 為什么用weak 不用 strong

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

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

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

可能你還不太理解,沒關系,下面先舉例,看結果,再分析!

舉例

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

結果

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

運行->打印

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

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

分析

使用strong

person對dog強引用

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

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

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

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

使用weak

person對dog強引用

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

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

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

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

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

總結: weak 會被 ARC 釋放 strong 不會被自動釋放 

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

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 都江堰市| 绵阳市| 山东| 江油市| 屏边| 内丘县| 四会市| 哈尔滨市| 大理市| 孝义市| 海安县| 曲松县| 邢台市| 新疆| 塔河县| 尉犁县| 龙井市| 齐齐哈尔市| 江山市| 翁牛特旗| 北辰区| 松滋市| 灌南县| 庐江县| 林口县| 南江县| 房产| 濉溪县| 平泉县| 正宁县| 顺义区| 石门县| 拜城县| 喜德县| 林州市| 莫力| 夏津县| 东源县| 陆川县| 云龙县| 沛县|