歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Objective-C屬性詳解

Objective-C屬性詳解

日期:2017/3/1 9:54:07   编辑:Linux編程

Objective-C屬性簡介

@property 和@synthesize 可以自動生成某個類成員變量的存取方法,

語法 @property(參數) 類型 名字

這裡的參數分為三大類:

讀寫屬性:(readwrite/readonly) readwrite:這個屬性是默認的,readonly:只生成getter 不會有setter

原子性(nonatomic)atomic ;是為了保證程序能夠並發,避免同步問題

內存管理:(assign/retain/copy)
assign:這個屬性用來處理基礎類型,比如int,float,如果你聲明的類型就是基礎類型,該屬性可以不加

對於assign而言,set函數和get函數如下所示:

@property(nonatomic,assign)int val;

-(int)val

{

return val;

}

(void)setVal:(int)newVal

{

val=newVal;

}

copy:自動生成該對象的克隆

retain:會自動retain對象,實現

代碼如下:

@property (nonatomic,assign) NSString *title;

-(NSString*)title
{
return title;
}
-(void)settitle:(NSString*)newtitile

{

//首先判斷是否與舊對象一致,如果不一致進行賦值。

//因為如果是一個對象的話,進行if內的代碼會造成一個極端的情況:當此name的retain為1時,使此次的set操作讓實例name提前釋放,而達不到賦值目的。

if(newTitle!=title)

{

[title release];
title=[newtitile retain];

}

}

在對屬性進行賦值時,會調用屬性的set方法,使引用計數加一從而保證內存的正確引用。

自定義的類是不能用COPY的,因為自定義的類沒有實現<NSCopy>協議,該協議裡面有各種copy方法,所以,copy別亂用,盡量只在設置字符串時使用。

assign,retain 和 copy的區別

copy: 建立一個索引計數為1的對象,然後釋放舊對象
retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1
assign:直接復制,並未創建新的對象
比如一個NSString對象,NSString *str=【NSString alloc】initwithString:@"hello";

在內存分配的過程如下:

首先,在堆上創建一塊內存,內容初始化為“hello”,地址為0X1111

其次,在棧上創建一內存,地址為0X2222,內容為1111,

assign : NSString *newStr=[str assign];

則newStr是str的別名,地址為0X2222,內容為1111,retaincount值不變,對newStr執行刪除操作,則str也會被刪除

copy:NSString *newStr=[str copy];


newStr地址為0×3333,內容為3333,在棧上分配空間,地址為0X3333,內容為“hello”,新的對象retainCount為1,str對象沒有變化,對newStr執行刪除操作只會涉及其本身,與str無關
retain:NSString *newStr=[str retain];

newStr地址為0X4444,內容為1111,str的retaincount++,

assign就是直接賦值,刪除時可能引起問題,當數據為int, float等原生類型時,可以使用assign。retain使用了引用計數,retain引起引用計數加1, release引起引用計數減1,當引用計數為0時,dealloc函數被調用,內存被回收。copy是在你不希望a和b共享一塊內存時會使用到。a和b各自有自己的內存。

Copyright © Linux教程網 All Rights Reserved