Objecteive-C 屬性修飾符


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,內容相同,新的對象retain1,舊有對象沒有變化

retain到另外一個NSString之后,地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的retain+1

也就是說,retain是指針拷貝,copy是內容拷貝。

 

ObjectiveC中的copyc++的一樣分深拷貝和淺拷貝,怎樣區分這兩個對象呢?我的理解是:

   (1)深拷貝,就是新拷貝一塊內存交給對象使用。

   (2)淺拷貝,就是覺得拷貝內存太浪費,直接給你我的地址吧,相當於retain

 

3)怎么區分這兩種對象呢?

    ObjectiveC里面只有一種情況是淺拷貝,那就是不可變對象的copy,其它的都是深拷貝(包括不可變對象mutableCopy、可變對象的的copymutableCopy)。

 

以下轉載自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 的作用一樣 

  1. - (void)setName:(NSString *)newName {  
  2.     if (name != newName) {  
  3.        [name release];  
  4.        name = [newName retain];  
  5.        // name’s retain count has been bumped up by 1  
  6.     }  
  7. }  

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

retain和copy的區別

原來簡單解釋過屬性定義(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新值,如下代碼:

  1. -(void) setObj:(ClassX*) value  
  2. {  
  3.          if (obj != value)  
  4.          {  
  5.                    [obj release];  
  6.                    obj = [value retain];  
  7.          }  

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和其子類

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM