iOS property 屬性相關的總結

2021-09-24 06:58:12 字數 4360 閱讀 8741

讀寫屬性:readwritereadonly

setter語意:assignretain/copy

原子性(多執行緒管理):atomicnonatomic

強弱引用:strongweak

強指標(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

不可變物件和可變物件的copymutablecopy對比

不可變物件copy不可變物件是淺複製,其他都是深複製。(不可變物件指nsarray、nsdictionary、nsstring等)

copy 與 strong

nsmutablearraycopystrong修飾後的變化 把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賦值給zhangsanname屬性,然後去改變str,結果: 用@property (nonatomic, retain) nsstring *name;修飾的name答應結果為zhangsanabcname屬性被修改了; 用@property (nonatomic, copy) nsstring *name;修飾的name答應結果為zhangsanname屬性沒有被修改。

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,所以_namename是兩塊無關的內容,改變name不會影響_name

- (void)setname:(nsstring *)name 

}- (void)dealloc

複製**

在實現檔案中使用@synthesize propertyname,編譯器先會查詢這個屬性名的setter方法和getter方法有沒有被人為實現,如果已經實現,則不再實現,如果沒有,則會幫我們生成乙個屬性命的setter方法和getter方法。

當在實現檔案中使用了@synthesize propertyname,編譯器還會做一件事情,在類成員變數中查詢乙個名為_propertyname的成員變數,如果沒有,再繼續查詢名為propertyname的成員變數,如果這兩個都沒有,編譯器會自動為我們生成乙個私有的名為_propertyname的成員變數。注意,系統自動建立的都是私有的。

當在實現檔案中這樣寫@synthesize propertyname = varname;時,settergetter方法所對應的是乙個名為varname的成員變數,修改和讀取的是varname成員變數的值。

當我們在實現檔案中不寫@synthesize propertyname時,在xcode 4.5之前的版本不會幫我們自動實現settergetter方法,系統當然也不再會為我們生成對應的成員變數。但是在xcode 4.5之後可以不用寫@synthesize了,就跟3、4一樣了。

當我們既定義了@synthesize,又在實現檔案中人為重寫settergetter方法時,那麼@synthesize將不再工作,也就不會為我們建立沒有定義的_propertyname成員變數了,這時候如果在settergetter方法中呼叫_propertyname將會發生編譯錯誤

css字型屬性相關。

出處 css 參考手冊 說明 這個屬性允許對文字設定某種效果,如加下劃線。如果後代元素沒有自己的裝飾,祖先元素上設定的裝飾會 延伸 到後代元素中。不要求使用者 支援 blink。可能的值 描述 none 預設。定義標準的文字。underline 定義文字下的一條線。overline 定義文字上的一條...

css字型屬性相關。

出處 css 參考手冊 說明 這個屬性允許對文字設定某種效果,如加下劃線。如果後代元素沒有自己的裝飾,祖先元素上設定的裝飾會 延伸 到後代元素中。不要求使用者 支援 blink。可能的值 描述 none 預設。定義標準的文字。underline 定義文字下的一條線。overline 定義文字上的一條...

前端 CSS屬性相關

width 屬性可以為標籤設定寬度 height 屬性可以為標籤設定高度 注意 塊級標籤才能設定寬度,行內標籤的寬度由內容決定 文字型別 font family可以選擇文字的型別 比如 微軟雅黑 宋體 楷體 p字型大小 font size 控制字型大小 p字重 粗細 font weight 用來設定...