这篇是与第六篇衔接的,只有OC的核心语法的部分
1.id类型、id类型和instancetype类型的比较
id在OC中可以理解为是一个万能指针,它能够相当于任何数据类型的指针变量,也就是说在任何情况下,使用指针类型变量时实际上就相当于在使用一个id类型,OC语言中并没有像下面这样定义id类型,但是可以帮助我们理解:
#define id NSObject*
或者是这样:
typedef NSObject* id;
在实际开发中就可以把id当做 能操作任何 oc 对象的 万能指针类来使用了。如:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
Person *p = [Person new];
//id== NSObject *可以这样认为
// 万能指针,能操作任何oc对象
id d = [Person new];
[d setAge:10];
NSLog(@"%d", [d age]);
return 0;
}
instanctype:
instanctype只能作为方法返回值,不能修饰变量.而当作为方法返回值时,它与id的主要区别是什么呢?
举个简单例子:
NSString *str = [Person person];
NSLog(@"%lu", str.length);
[Person person]返回值为id类型,则在编辑代码时xcode不会报错或者警告,运行时则会崩溃(因为OC是动态检测对象的真实类型);
反之,当其返回值为instanceType时,xcode则会报出警告.
所以,建议写类的方法时,对于返回值,如果是id类型的话,尽量使用instanceType.
根据Cocoa的命名规则,满足下述规则的方法:
1、类方法中,以alloc或new开头
2、实例方法中,以autorelease,init,retain或self开头
会返回一个方法所在类类型的对象,这些方法就被称为是关联返回类型的方法,当使用这些类方法时,官方建议最好使用instancetype作为函数的返回值类型。
2.构造方法
在之前的学习中,创建一个类的方式是调用new这个类方法,如
[Person new];
其创建之后会返回一个Person类的实例,也就是一个Person对象,通常我们再使用一个Person类的指针接收它,以便之后的各种操作,如:
Person *p = [Person new];
new方法的实质是这样的:
new方法内部执行的过程
完整地创建一个可用的对象
1.分配存储空间 +alloc
2.初始化 -init
new方法实际上调用了+alloc和-init两个方法返回类的对象。因此上面的代码
Person *p = [Person new];
实际上就相当于
Person *p = [[Person alloc] init];
分配空间+alloc这一步骤在相同类型的对象的创建过程是相同的,而初始化-init是不同的,因为不同的对象的属性值可能是不同的,现在我们就是通过使用不同的-init函数来进行对不同对象的构造,因而以后创建对象时要坚持使 用这种写法