Objective C的那点小语法

本文详细探讨了Objective-C中的多继承、多态特性,以及变量访问范围的不同级别。同时介绍了深拷贝与浅拷贝的概念,特别强调了NSString对象的行为特点。最后对一些关键概念进行了总结。

占坑

1,多继承

(新到一个公司,老同事们都使唤你干活,你什么活都干,过了一段时间)

你发现你既可以做android,你也可以做ios,这就是多继承的表现

Objective C的多继承特性通过 Category来实现

2,多态

(公司有钱了,你收了两个徒弟)

同样的客户端,一个做ios,一个做android,(跟领导说这都是你做的),这就是多态

Objective C的多态特性通过Selector来实现

3, 变量访问范围前缀,有四种

@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.



转载于:https://my.oschina.net/openlab/blog/128851

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值