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各自有自己的內存。