佔坑 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.