【IOS开发学习—OC篇】
一、instancetype和id关键字的区别
1)instancetype表示方法的返回类型和调用方法的对象类型相同。
2)在Object-C引入instancetype之前,初始化方法的返回类型都是id,id的定义是【指向任意对象的指针(相当于C语言中的void*)】
它们的区别是:instancetype只能用来表示方法返回类型,但是id还可以用来表示变量和方法参数的类型。
二、在头文件中的方法声明顺序
1)这算是一个约定,按照先后顺序是:实例变量、类方法(静态方法)、初始化方法、其他方法。
三、生成随机数的方法—arc4random()
1)使用方法
通过arc4random() 获取0到x-1之间的整数: int value = arc4random() % x;
获取1到x之间的整数的代码如下:int value = (arc4random() % x) + 1;
四、[NBRItem count]: unrecognized selector sent to instance 0x100309120'下
这个是常见的错误,碰到这种错误,从字面意思上看是向对象发送了一个不能识别的selector,因此要检查NBRItem对象是否有count这个方法。
五、弱引用和强引用
1)指针变量指向了某个对象,那么相应的对象就会多一个拥有者,并且不会被程序释放,这种指针特性被成为强引用。
2)程序也可以选择让指针变量不影响其指向的对象的拥有者个数,这种不会改变对象拥有者个数的指针特性被成为弱引用。常用来解决强引用循环的问题,可以先分析出父子关系,然后将父对象保留强引用的特性,然后子对象搞成弱引用特性(__weak),具有弱引用特性的指针指向的对象被释放后,指针会自动设置为nil。
六、属性的特性
任何属性都可以有一组特性,用于描述相应存取方法的行为,比如:
@property(nonatomic, readwrite, strong) NSString *itemName
任何属性都有三个特性
1)多线程特性
nonautomic 和 atomic ,大多数情况下,我们都设置属性为nonautomar,因为默认是atomic,所以我们要指定为nonautomar。
2)读写特性
readwrite和readonly,从字面意思就可以知道,编译器会为readwrite的属性生成set和get方法,但是readonly的属性只有get方法。
3)内存管理特性
strong、weak、copy、unsafe_unretained。这些类型决定相应的实例变量将如何引用对象。
- 对于不知向任何对象的属性(int等)不需要内存管理,定义为unsafe_unretained,它使非对象属性的默认值,所以可以不用写,在引入ARC之前曾经使用assign表示。
- 对于指向OC对象的属性,四中类型都有可能。默认是strong类型。
- 对于某个属性指向其他对象的指针,而且该对象的类有可修改的子类(比如:NString/NSMutableString、NsArray/NSMutableArray),应该将属性设置为copy。对于mutableCopy和copy的区别,见文章【浅copy和深copy】
未完待续。。。