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