Objective C的那點小語法

佔坑 android

1,多繼承 ios

(新到一個公司,老同事們都使喚你幹活,你什麼活都幹,過了一段時間) spa

你發現你既能夠作android,你也能夠作ios,這就是多繼承的表現 指針

Objective C的多繼承特性經過 Category來實現 orm

2,多態 對象

(公司有錢了,你收了兩個徒弟) 繼承

一樣的客戶端,一個作ios,一個作android,(跟領導說這都是你作的),這就是多態 內存

Objective C的多態特性經過Selector來實現 字符串

3, 變量訪問範圍前綴,有四種 string

@private 實例的.m代碼裏能訪問到

@protected  實例的.m代碼裏和實例的子類的.m代碼裏能訪問到它

@package  你本身的代碼裏,非靜態庫的應用就應該能訪問到它,不過要用myobject->packageVar這種方式來訪問。

@public  no limits.處處都能看到它。

因此我說:

@private是小孩的玩具,本身玩兒

@protected是爸媽的東東,本身和孩子都讓用

@package是祖業,叔伯嬸嬸以及員工都有訪問權。

@public是公共設施,誰都能用

4,深拷貝與淺拷貝

淺拷貝--指針引用,retainCount+1哦。深拷貝--retainCount不變,另外開闢內存空間,新起爐竈。

非容器類對象的深淺規律----趨於深,遇到mutable就變深,無論先後

(1)不可變對象的copy是淺拷貝
(2)不可變對象的mutableCopy是深拷貝
(3)可變對象的copy和mutableCopy是深拷貝
判斷依據是copy後內存地址是否還同樣

容器類對象的深淺規律---除了從新開闢 或者 NSKeyedUnarchiver來搞一下,都是淺,趨於淺。

(1)NSArray的copy和mutableCopy都是淺拷貝

NSArray *copyArray=[[NSArray alloc] initWithArray: array copyItems: YES];//是淺拷貝

NSArray *copyArray = [NSArray arrayWithArray:array];//也是是淺拷貝

NSMutableArray *copyArray = (NSMutableArray*)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (CFPropertyListRef)array, kCFPropertyListMutableContainers);//也是是淺拷貝

即,array裏面元素都是指針引用。當心

(2)只有這個是深拷貝,NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
                                [NSKeyedArchiver archivedDataWithRootObject: array]];

ps:NSArray的mutableCopy只能說Array是能夠變的,能夠addObject什麼的,可是array裏的元素極可能都仍是immutable的


5,NSString這貨

NSString這貨有些地方很矯情。

好比:

只要代碼裏面出現了@"string1"這樣的常量,無論是啥變量啥指針引用它,其實都特麼指向同一個內存空間,並且不能釋放它。

NSString *str1 = @"string1";

NSString *str2 = @"string1";

上面的str1,str2都指向同塊靜態內存,別期望你本身能[str1 dealloc],[str2 dealloc],很節省空間的感受吧。

NSString *str3 = [NSString initWithString:@"string1" ];

[str3 dealloc];也百分百爆異常.

可是下面這個:

NSString *str4 =[NSString initWithFormat:@"string1"];

initWithFormat是可讓你dealloc的,[str4 dealloc] no exception

因此可見,常量御姐@"string1"遇到initWithFormat就格式化成軟妹子了.

[NSString initWithFormat:@"string1"];

是在靜態空間裏分配了一塊@"string1",另外在堆裏又分配了一塊拷貝了@"string1"

dealloc的是堆上的那塊。

[NSString initWithFormat:@"string1"];

因此,

[NSString initWithFormat:@"string1"];

佔的空間更多了,並不推薦用,用

[NSString initWithString:@"string1"];來替代好些的。

在這裏,只要是@"string1"搞出來的對象,他們的retainCount都爲-1或者Int_MAX,由於是不可以讓你dealloc的了,這樣也容易理解。

因此上面羅裏吧嗦這麼多,講了三個特徵

(1)@"string1"這種常量放在靜態空間,不能dealloc,只要字符串值相同,全程序有且只有一份它的空間。

(2)initWithString :@"string1" 和  [initWithString:str1]在靜態空間的,這樣初始化對象的不能dealloc

    initWithString:str2,str2在堆上,這樣初始化的對象能夠dealloc.

(3)initWithFormat初始化出來的能夠dealloc.

相關文章
相關標籤/搜索