iOS 對(duì)象屬性詳細(xì)介紹
iOS 對(duì)象屬性
oc對(duì)象的一些屬性:
retain,strong, copy,weak,assign,readonly, readwrite, unsafe_unretained
下面來分別講講各自的作用和區(qū)別:
retain,計(jì)數(shù)器加1, (增加一個(gè)指向內(nèi)存的指針) 對(duì)應(yīng)release(計(jì)數(shù)器-1) setter 方法對(duì)參數(shù)進(jìn)行 release 舊值再 retain 新值,所有實(shí)現(xiàn)都是這個(gè)順序
- (void)setBackView:(UIView *)backView { if (_backView != backView) { [_backView release]; _backView = [backView retain]; } return _backView; }
copy, 拷貝,新開地址,內(nèi)容拷貝, setter 方法進(jìn)行 Copy 操作,與 retain 處理流程一樣,先舊值 release ,再 Copy 出新的對(duì)象, retainCount 為 1 。這是為了減少對(duì)上下文的依賴而引入的機(jī)制。
(提一點(diǎn)深拷貝shallow copy,淺拷貝deep copy)
這篇文章比較直觀(http://blog.csdn.net/omegayy/article/details/7311839)
官方文檔(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Collections/Articles/Copying.html)
copy和mutableCopy調(diào)用后表現(xiàn)的行為到底是什么樣完成取決于類本身NSCopying和NSMutableCopying協(xié)議是如何實(shí)現(xiàn)的。
strong, 強(qiáng)引用,計(jì)數(shù)器加1,和retain一樣(對(duì)應(yīng)retain和copy)
weak,弱引用
strong 用來修飾強(qiáng)引用的屬性; @property (strong) SomeClass * aObject; 對(duì)應(yīng)原來的 @property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject; weak 用來修飾弱引用的屬性; @property (weak) SomeClass * aObject; 對(duì)應(yīng)原來的 @property (assign) SomeClass * aObject;
__weak, __strong 用來修飾變量,此外還有 __unsafe_unretained, __autoreleasing 都是用來修飾變量的。
__strong 是缺省的關(guān)鍵詞。
__weak 聲明了一個(gè)可以自動(dòng) nil 化的弱引用。
__unsafe_unretained 聲明一個(gè)弱應(yīng)用,但是不會(huì)自動(dòng)nil化,也就是說,如果所指向的內(nèi)存區(qū)域被釋放了,這個(gè)指針就是一個(gè)野指針了。
__autoreleasing 用來修飾一個(gè)函數(shù)的參數(shù),這個(gè)參數(shù)會(huì)在函數(shù)返回的時(shí)候被自動(dòng)釋放。
strong和weak的區(qū)別
(weak和strong)不同的是 當(dāng)一個(gè)對(duì)象不再有strong類型的指針指向它的時(shí)候 它會(huì)被釋放 ,即使還有weak型指針指向它。
一旦最后一個(gè)strong型指針離去 ,這個(gè)對(duì)象將被釋放,所有剩余的weak型指針都將被清除。
可能有個(gè)例子形容是妥當(dāng)?shù)摹?/p>
想象我們的對(duì)象是一條狗,狗想要跑掉(被釋放)。
strong型指針就像是栓住的狗。只要你用牽繩掛住狗,狗就不會(huì)跑掉。如果有5個(gè)人牽著一條狗(5個(gè)strong型指針指向1個(gè)對(duì)象),除非5個(gè)牽繩都脫落 ,否著狗是不會(huì)跑掉的。
weak型指針就像是一個(gè)小孩指著狗喊到:“看!一只狗在那” 只要狗一直被栓著,小孩就能看到狗,(weak指針)會(huì)一直指向它。只要狗的牽繩脫落,狗就會(huì)跑掉,不管有多少小孩在看著它。
只要最后一個(gè)strong型指針不再指向?qū)ο螅敲磳?duì)象就會(huì)被釋放,同時(shí)所有的weak型指針都將會(huì)被清除。
assign,用于簡(jiǎn)單類型,計(jì)數(shù)器不加,直接賦值,一個(gè)指針,一塊地址, setter 方法直接賦值,不進(jìn)行任何 retain 操作,為了解決原類型與環(huán)循引用問題
readonly,只讀,只生成get方法,沒有set方法
readwrite,默認(rèn),可讀寫,set,get方法都會(huì)生成
unsafe_unretained,類似weak,所謂的unSafe就是指會(huì)容易出現(xiàn)也指針的情況,慎用
setter = xxxx,聲明對(duì)象的set方法
getter = xxxx, 聲明對(duì)象的get方法
nonatomic,非原子操作,系統(tǒng)不添加代碼,運(yùn)行速度相對(duì)快,但數(shù)據(jù)操作在多線程情況下相對(duì)不安全
atomic,原子操作,編譯時(shí)會(huì)增加很多加鎖解鎖代碼,數(shù)據(jù)操作在多線程情況下相對(duì)安全
* 使用assign: 對(duì)基礎(chǔ)數(shù)據(jù)類型 (NSInteger)和C數(shù)據(jù)類型(int, float, double, char,等)
* 使用copy: 對(duì)NSString
* 使用retain: 對(duì)其他NSObject和其子類
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
簡(jiǎn)單談?wù)刢/c++中#import、#include和@class的區(qū)別
對(duì)于#import,我想做過iOS開發(fā)的人應(yīng)該都不陌生。在開發(fā)過程中,當(dāng)我們需要聲明某一個(gè)類時(shí),都需要去引用。而#imclude的話,在我們學(xué)習(xí)C時(shí)就已經(jīng)知道了,他的作用也是引用聲明的意思。在表面上他們的作用似乎都是一樣的。但是在具體功能實(shí)現(xiàn)方式上,還是有著很大的區(qū)別。2018-01-01iOS11 下載之?dāng)帱c(diǎn)續(xù)傳的bug的解決方法
本篇文章主要介紹了iOS11 下載之?dāng)帱c(diǎn)續(xù)傳的bug的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11iOS App開發(fā)中導(dǎo)航欄的創(chuàng)建及基本屬性設(shè)置教程
這篇文章主要介紹了iOS App開發(fā)中導(dǎo)航欄的創(chuàng)建及基本屬性設(shè)置教程,即用UINavigationController來編寫navigation,示例代碼為Objective-C語言,需要的朋友可以參考下2016-02-02講解iOS開發(fā)中對(duì)音效和音樂播放的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了iOS開發(fā)中對(duì)音效和音樂播放的簡(jiǎn)單實(shí)現(xiàn),代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-11-11