Objective-C的幾個重要的屬性修飾符
1.getter=<name>,setter=<name>:指定該屬性所使用的存取器函數的名稱
2.readwrite或者readonly:指定屬性是否可讀寫,默認是讀寫
3.assign、retain、copy:決定為該屬性生成的賦值函數的類型。assign生成的賦值函數只是簡單地為變量進行賦值。retain生成的賦值函數在賦值到變量的時候會保留傳入到參數。copy生成的存取函數會復制傳入的參數到成員變量。默認值是assign。
4.nonatomic和atomic:是否是原子性的,默認是atomic的。
5.@synthesize和@dynamic:@dynamic 就是要來告訴編譯器,代碼中用@dynamic修飾的屬性,其getter和setter方法會在程序運行的時候或者用其他方式動態綁定,以便讓編譯器通過編譯。其主要的作用就是用在NSManageObject對象的屬性聲明上,由於此類對象的屬性一般是從Core Data的屬性中生成的,Core Data框架會在程序運行的時候為此類屬性生成getter和Setter方法。
以下轉載自http://blog.csdn.net/pjk1129/article/details/6457048#comments
在iphone程序中,屬性合成中的retain/copy/assign有什么區別?
1)assign就不用說了,因為基本上是為簡單數據類型准備的,原子類類型,例如CGPoint、CGFloat等,而不是NS對象們;
2)retain VS copy
- copy: 建立一個索引計數為1的對象,然后釋放舊對象
- retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1
Copy其實是建立了一個相同的對象,而retain不是:
比如一個NSString對象,地址為0×1111,內容為@”STR”
Copy到另外一個NSString之后,地址為0×2222,內容相同,新的對象retain為1,舊有對象沒有變化
retain到另外一個NSString之后,地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的retain值+1
也就是說,retain是指針拷貝,copy是內容拷貝。
Objective-C中的copy和c++的一樣分深拷貝和淺拷貝,怎樣區分這兩個對象呢?我的理解是:
(1)深拷貝,就是新拷貝一塊內存交給對象使用。
(2)淺拷貝,就是覺得拷貝內存太浪費,直接給你我的地址吧,相當於retain。
3)怎么區分這兩種對象呢?
在Objective-C里面只有一種情況是淺拷貝,那就是不可變對象的copy,其它的都是深拷貝(包括不可變對象mutableCopy、可變對象的的copy和mutableCopy)。
以下轉載自http://hi.baidu.com/yangjunfeng22/item/7507d71a93e79005e65c3693
nonatimic,retain,assign,copy,readonly,readwrite,這些屬性主要事完成getter setter 的操作 (這個很重要的哦 !!!很多初學者都在這里迷惑哦~~~) ------------------------------------------------assign: 簡單的賦值 不會更改索引計數(Reference counting)主要是對基本數據類型使用 eg:(NSInteger,CGFloat 和C語言的 int double float char ...)如果使用對象類型的參數,需要開啟garbage collector[現在的版本叫引用計數器 不同的版本不同的叫法 在mac編程和在iphone編程中的叫法也不同 諒解 諒解 ] retain: 釋放舊的對象 將舊對象的值賦予輸入對象 並將輸入對象的索引計數+1 ,主要應用與NSObject與其子類中,如果啟用了garbage collector 和assign 的作用一樣
- - (void)setName:(NSString *)newName {
- if (name != newName) {
- [name release];
- name = [newName retain];
- // name’s retain count has been bumped up by 1
- }
- }
copy: 創建一個索引計數為1的對象 釋放掉原來的對象 readonly: 表示只讀屬性 只會生成getter方法 不會生成setter方法 readwrite:設置可供訪問的級別 nonatimic:非原子訪問,不加同步 ,多線程並發訪問提高性能 (對多線程的保護,防止在未寫完,被另一個線程讀取,造成數據錯誤)。對copy 和retain的 解釋 上面的語言太抽象了 那么請允許我在這里對 copy 和 retain 的區別 作詳細的介紹
比如一個NSString 對象,地址為0×1111 ,內容為@”STR”
Copy 到另外一個NSString 之后,地址為0×2222 ,內容相同,新的對象retain為1 ,舊有對象沒有變化
retain 到另外一個NSString 之后,地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的retain值+1
retain 是指針拷貝,copy 是內容拷貝
下面分享一個網友的總結
一直以來個人覺得如果一個類是的property是readonly的那么再指定其他的如assign/retain/copy這樣的屬性就實在是沒有什么意義了。確實你想想既然都readonly了,肯定是沒有setter的,既然沒有setter那么談assign/retain/copy又有什么意義呢?所以一直以來我從來不對readonly的property加retain/copy屬性申明,默認assign就足夠了,simple is beautiful!
但是我現在發現我錯了,其實一直都有一種這種感覺,只是沒有找到100%的充分理由為readonly加上retain/copy。但是假如你要在你的subclass改寫property,而加入你要改寫的是一個NSString,你像把這個屬性設置為readwrite和copy,往往杯具就發生了,編譯時候可惡的warning 產生了,因為copy和之前默認的assign明顯不相同啊!
終上,不論什么時候,都要為你的readonly的對象屬性加上合適的retain/copy申明。你現在不用,但不說明你將來就不會用,出來混遲早都要還的!
@property (nonatomic,retain)中的nonatom和retain的意思2011年05月15日 星期日 下午 10:12
http://baike.baidu.com/view/5028218.htm
原來簡單解釋過屬性定義(Property) ,並且提起了簡單的retain,copy,assign的區別。那究竟是有什么區別呢?
assign就不用說了,因為基本上是為簡單數據類型准備的,而不是NS對象們。
Retain vs. Copy!!
- copy : 建立一個索引計數為1的對象,然后釋放舊對象
- retain :釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1
那上面的是什么該死的意思呢?
Copy其實是建立了一個相同的對象,而retain不是:
比如一個NSString 對象,地址為0×1111 ,內容為@”STR”
Copy 到另外一個NSString 之后,地址為0×2222 ,內容相同,新的對象retain為1 ,舊有對象沒有變化
retain 到另外一個NSString 之后,地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的retain值+1
也就是說,retain 是指針拷貝,copy 是內容拷貝。哇,比想象的簡單多了…
------------------------------------------------------------------------------------------------------
上面這篇文章來自:http://c.gzl.name/archives/339
自己研究了一下,,上面文章的說法是對的,,但是遺漏了一點東西.
他說 copy是內容的拷貝 ,對於像NSString,的確是這樣.
但是,如果是copy的是一個NSArray呢?比如,
NSArray *array = [NSArray arrayWithObjects:@"hello",@"world",@"baby"];
NSArray *array2 = [array copy];
這個時候,,系統的確是為array2開辟了一塊內存空間,但是我們要認識到的是,array2中的每個元素,,只是copy了指向array中相對應元素的指針.這便是所謂的"淺復制".了解到這一點非常重要....
常在聲明一些成員變量時會看到如下聲明方式:
@property (參數1,參數2) 類型 名字;
這里我們主要分析在括號中放入的參數,主要有以下三種:
setter/getter方法(assign/retain/copy)
讀寫屬性(readwrite/readonly)
atomicity(nonatomic)
其中各參數說明如下:
assign
默認類型,setter方法直接賦值,而不進行retain操作
retain
setter方法對參數進行release舊值,再retain新值,如下代碼:
- -(void) setObj:(ClassX*) value
- {
- if (obj != value)
- {
- [obj release];
- obj = [value retain];
- }
- }
copy
setter方法進行Copy操作,與retain一樣
nonatomic
@property (nonatomic,retain)中的nonatom和retain是什么意思
@property是一個屬性訪問聲明,擴號內支持以下幾個屬性:
1,getter=getterName,setter=setterName,設置setter與getter的方法名
2,readwrite,readonly,設置可供訪問級別
2,assign,setter方法直接賦值,不進行任何retain操作,為了解決原類型與環循引用問題
3,retain,setter方法對參數進行release舊值再retain新值,所有實現都是這個順序(CC上有相關資料)
4,copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴而引入的機制。
5,nonatomic,非原子性訪問,不加同步,多線程並發訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都為原子型事務訪問。鎖被加到所屬對象實例級。
@synthesize xxx; 為這個心屬性自動生成讀寫函數;
如果你不懂怎么使用他們,那么就這樣 ->
- 使用assign: 對基礎數據類型 (NSInteger,CGFloat)和C數據類型(int, float, double, char, 等等)
- 使用copy: 對NSString
- 使用retain: 對其他NSObject和其子類