1.@property說明
@property聲明屬性的語法狸吞,可以生成變量存儲器勉耀。
存儲器:指用于設(shè)置變量和獲取變量的方法,setter用于設(shè)置變量存儲器蹋偏,getter用于獲取變量存儲器
@property有兩個對應(yīng)的詞便斥,@synthesize和@dynamic,如果@synthesize和@dynamic都沒有寫威始,則默認的為@synthesize ?var =_var;
@synthesize的語義是枢纠,如果你沒有實現(xiàn)setter和getter方法,那么編譯器會自動加上黎棠,
@dynamic的語義是晋渺,告訴編譯器不要實現(xiàn)setter和getter方法。
2.權(quán)限說明:
在.h中聲明脓斩,默認為權(quán)限為protected
在.m中聲明木西,默認為權(quán)限為private
3.@synthesize和@dynamic
@property等同于在.h中聲明實例變量的get/set方法,
@synthesize
@synthesize等同于在.m中實現(xiàn)了實例變量的get/set方法俭厚。
如果我們希望使用默認的實例變量命名方式户魏,則不需要再.m中聲明@synthesize,
如果我們希望使用自己的實例變量命名方式挪挤,則在.m中聲明@synthesize叼丑。
例如:
@synthesize name = myName;//后續(xù)中使用myName;
NSString *strTMp = myName;//使用myName;
@synthesize appID;//隱式生成getter和setter方法,
@property (retain,getter = getAppID) NSString *appID;//改變getter訪問名稱
@property(setter = setMyValue: ,getter= getMyValue) NSString *value; //改變屬性的setter和getter訪問名稱
[firstVC mySetValue:123];//使用setMyValue設(shè)置value扛门;
[firstVC myGeValue];//使用getMyValue獲取value;
@dynamic
@dynamic告訴編譯器鸠信,setter和getter方法用戶自己實現(xiàn)(如果是readonly,則是getter方法)论寨,假如聲明為@dynamic strDynamic;然后沒有提供setter方法和getter方法星立,那么以下情況都會在運行時崩潰
firstVC.strDynamic = @"123";//[FirstModeViewController setStrDynamic:]: unrecognized selector sent to instance 0x7fd1b3f06cd0'
[firstVC setStrDynamic:@"123"];//[FirstModeViewController setStrDynamic:]: unrecognized selector sent to instance 0x7fca5bf16520'
NSString *str = firstVC.strDynamic;//[FirstModeViewController strDynamic]: unrecognized selector sent to instance
編譯沒有問題爽茴,但運行時才執(zhí)行相應(yīng)的方法,叫做動態(tài)綁定
4.@property后面有哪些修飾符绰垂?
線程安全的:
nonatomic室奏,atomic;//默認為nonatomic
nonatomic不保證線程安全,禁止多線程劲装,變量保護胧沫,提高性能。
atomic是線程保護技術(shù)占业,防止在寫未完成的時候被另外一個線程訪問绒怨,造成數(shù)據(jù)錯誤,編譯器會自動加上互斥鎖代碼谦疾,避免變量讀寫不同步問題南蹂。
atomic示例代碼:
{lock}
? ? ?if(property ?!= newValue){
? ? ? ?[property release];
? ? ? ?property = [newValue retain];
? ? ? }
{unlock}
訪問權(quán)限:
readonly ;//只讀屬性,只會生成getter方法念恍,不希望屬性在類外改變
readwrite六剥;//可讀可寫屬性,會生成getter和setter方法峰伙,默認屬性
內(nèi)存管理(ARC)
assgin仗考,weak,strong词爬,copy
assgin是賦值特性秃嗜,setter方法將傳入?yún)?shù)賦值給變量,引用計數(shù)不變顿膨,對基礎(chǔ)數(shù)據(jù)類锅锨,
weak,在setter方法中恋沃,不進行引用計數(shù)加1操作必搞,對傳入的對象沒有所有權(quán),當(dāng)引用計數(shù)為0 時囊咏,對象釋放后恕洲,weak聲明的變量指向nil。作用和assgin相似梅割,不過當(dāng)引用計數(shù)為0 時霜第,自動置為nil。
delegate和Outlet一般用weak聲明户辞。
strong:iOS在ARC中引入的泌类,表示實例變量對傳入的變量要有所有權(quán)關(guān)系,即強引用底燎,
copy 建立一個索引為1的對象刃榨,釋放舊對象弹砚,NSString,與strong類似,實例變量傳入的是副本擁有所有權(quán)枢希,而非對象本身蝌诡,copy 其實是建立了一個相同的對象疟游,而 retain 不是
內(nèi)存管理(MRC)
assgin斋配,retain厨钻,copy
assign就是直接賦值
retain: 在setter方法中憔儿,需要對傳入的對象進行引用計數(shù)加1的操作畏邢,setter 方法對參數(shù)進行 release 舊值再 retain 新值分预,例如申請了一塊內(nèi)存地址為a趴梢,然后把這塊內(nèi)存共享給了b敬察,當(dāng)a不在使用這塊內(nèi)存地址時秀睛,它只需要計數(shù)減一,如果b不在使用這塊內(nèi)存地址時莲祸,計數(shù)減1蹂安,如果計數(shù)為0 ,則釋放這塊內(nèi)存
retain是指針copy锐帜,指向同一地址田盈,計數(shù)加1,而copy是把內(nèi)容復(fù)制過來
-(void)setName:(NSString*)_name{
//首先判斷是否與舊對象一致缴阎,如果不一致進行賦值允瞧。
//因為如果是一個對象的話,進行if內(nèi)的代碼會造成一個極端的情況:當(dāng)此name的retain為1時蛮拔,使此次的set操作讓實例name提前釋放述暂,而達不到賦值目的。
if( name != _name){
[name release];
name = [_name retain];
}
}
weak和strong的區(qū)別:weak和strong不同的是 當(dāng)一個對象不再有strong類型的指針指向它的時候 它會被釋放? 建炫,即使還有weak型指針指向它畦韭。一旦最后一個strong型指針離去 ,這個對象將被釋放肛跌,所有剩余的weak型指針都將被清除艺配。
copy與retain:
copy其實是建立了一個相同的對象,而retain不是.
copy是內(nèi)容拷貝衍慎,retain是指針拷貝.
copy是內(nèi)容的拷貝 ,對于像NSString,的確是這樣转唉,如果拷貝的是NSArray這時只是copy了指向array中相對應(yīng)元素的指針.這便是所謂的"淺復(fù)制".
block的屬性一般使用copy
指定方法名稱
setter=
getter=