讀寫屬性:readwrite
、readonly
setter語意:assign
、retain
/copy
原子性(多執行緒管理):atomic
、nonatomic
強弱引用:strong
、weak
強指標(strong)、弱指標(weak)
arc管理記憶體是用assign
還是用weak
?
assign
: 如果由於某些原因**物件被釋放了,**指標就變成了野指標。
weak
: 如果由於某些原因**物件被釋放了,**指標就變成了空指標,更安全(weak
不能修飾基本資料型別,只能修飾物件)。
深複製與淺複製
淺複製
複製與計數器
// 深複製:產生了新物件,新物件(副本物件)的計數器是1, 源物件的計數器不變
// str : 1
nsstring *str = [nsstring stringwithformat:@"tom"];
// str2 : 1
nsmutablestring *str2 = [str mutablecopy];
nslog(@"str=%zd, str2=%zd", [str retaincount], [str2 retaincount]);
[str2 release];
複製**
// 淺複製:沒有產出新物件, 源物件(副本物件)的計數器會+1
nsstring *str = [nsstring stringwithformat:@"jack"];
nsstring *str2 = [str copy];
[str2 release];
nslog(@"%zd", [str retaincount]);
複製**
copy 與 mutablecopy
copy
產生不可變副本,mutablecopy
產生可變副本
理論上講oc中的任何乙個物件都可以複製(copy
和
不可變物件和可變物件的copy
、mutablecopy
對比
不可變物件copy
成不可變物件是淺複製,其他都是深複製。(不可變物件指nsarray、nsdictionary、nsstring等)
copy 與 strong
nsmutablearray
被copy
、strong
修飾後的變化 把nsmutablearray用copy修飾有時就會crash,因為對這個陣列進行了增刪改操作,而copy後的陣列變成了不可變陣列nsarray,沒有響應的增刪改方法,所以對其進行增刪改操作就會報錯。 舉例如下:
nsmutablearray *b = [nsmutablearray array];
a = b;
複製**
nsmutablearray *b = [nsmutablearray array];
// a被copy後就成了nsarray了。
a = [b copy];
複製**
文章推薦
ios 深拷貝淺拷貝與@property 引用計數關鍵字strong,copy,weak,assign
ios **:深.淺拷貝與copy.strong
陣列的屬性修飾符到底用strong還是copy?
ios中copy和mutablecopy的詳細分析
我們通過實際操作來說明,我們把str賦值給zhangsan
的name
屬性,然後去改變str
,結果: 用@property (nonatomic, retain) nsstring *name;
修飾的name答應結果為zhangsanabc
,name
屬性被修改了; 用@property (nonatomic, copy) nsstring *name;
修飾的name
答應結果為zhangsan
,name
屬性沒有被修改。
nsmutablestring *str = [nsmutablestring string];
str.string = @"zhangsan";
person *zhangsan = [[[person alloc] init] autorelease];
zhangsan.name = str;
nslog(@"%@ %@", str, zhangsan.name);
複製**
下面我們來看**set方法的內部實現: 當.h用@property (nonatomic, retain) nsstring *name;
時,_name = [name retain];
相當於[name retain]
和_name = name;
,而這兩句話相當於是先把原來的作引用計數+1,再把指標付給_name
,實際上指向的是一塊記憶體,這樣會導致原來的內容改變,_name
也會改變,而實際中我們一般不希望_name
改變,所以我們不用retain。
- (void)setname:(nsstring *)name
}- (void)dealloc
複製**
當.h用@property (nonatomic, copy) nsstring *name;
時,當傳入的值為可變物件時,呼叫_name = [name copy];
copy
會建立乙個新的物件賦值給_name
,所以_name
和name
是兩塊無關的內容,改變name
不會影響_name
- (void)setname:(nsstring *)name
}- (void)dealloc
複製**
在實現檔案中使用@synthesize propertyname
,編譯器先會查詢這個屬性名的setter方法和getter方法有沒有被人為實現,如果已經實現,則不再實現,如果沒有,則會幫我們生成乙個屬性命的setter方法和getter方法。
當在實現檔案中使用了@synthesize propertyname
,編譯器還會做一件事情,在類成員變數中查詢乙個名為_propertyname
的成員變數,如果沒有,再繼續查詢名為propertyname
的成員變數,如果這兩個都沒有,編譯器會自動為我們生成乙個私有的名為_propertyname
的成員變數。注意,系統自動建立的都是私有的。
當在實現檔案中這樣寫@synthesize propertyname = varname
;時,setter
和getter
方法所對應的是乙個名為varname
的成員變數,修改和讀取的是varname
成員變數的值。
當我們在實現檔案中不寫@synthesize propertyname
時,在xcode 4.5之前的版本不會幫我們自動實現setter
和getter
方法,系統當然也不再會為我們生成對應的成員變數。但是在xcode 4.5之後可以不用寫@synthesize了,就跟3、4一樣了。
當我們既定義了@synthesize
,又在實現檔案中人為重寫setter
和getter
方法時,那麼@synthesize
將不再工作,也就不會為我們建立沒有定義的_propertyname
成員變數了,這時候如果在setter
和getter
方法中呼叫_propertyname
將會發生編譯錯誤
css字型屬性相關。
出處 css 參考手冊 說明 這個屬性允許對文字設定某種效果,如加下劃線。如果後代元素沒有自己的裝飾,祖先元素上設定的裝飾會 延伸 到後代元素中。不要求使用者 支援 blink。可能的值 描述 none 預設。定義標準的文字。underline 定義文字下的一條線。overline 定義文字上的一條...
css字型屬性相關。
出處 css 參考手冊 說明 這個屬性允許對文字設定某種效果,如加下劃線。如果後代元素沒有自己的裝飾,祖先元素上設定的裝飾會 延伸 到後代元素中。不要求使用者 支援 blink。可能的值 描述 none 預設。定義標準的文字。underline 定義文字下的一條線。overline 定義文字上的一條...
前端 CSS屬性相關
width 屬性可以為標籤設定寬度 height 屬性可以為標籤設定高度 注意 塊級標籤才能設定寬度,行內標籤的寬度由內容決定 文字型別 font family可以選擇文字的型別 比如 微軟雅黑 宋體 楷體 p字型大小 font size 控制字型大小 p字重 粗細 font weight 用來設定...