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.

相关文章
相关标签/搜索