构造方法
    构造方法:用来初始化对象的方法,是一个对象方法, -开头
    重写构造方法的目的,为了让对象创建出来,成员变量就会有一些固定的值
    
    完整的new出一个对象,分三步
    (1) 使用alloc方法类分配存储空间,(返回分配的对象)
    (2) 使用init方法来对对象进行初始化
    (3) 返回对象的首地址
    
    Person *p1 = [Person alloc];       //分配内存空间
    Person *p2 = [p1 init];            //对该空间进行初始化
    以上两步合并成下面一句
    Person *p = [[Person alloc] init]; //分配内存空间并且初始化
    
    [Person new]  就等于  [[Person alloc] init];

    OC中,给对象初始化的方法就是init  该方法就是一个对象方法
    
    学习构造方法的目的,就是重写构造方法
    
    实例代码:

<span style="font-size:14px;">//我们要写构造方法
//选中init,右上角有一个问号,点击进去看方法的基本格式
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
@property int age;
@end
@implementation Person
//该方法是重写父类的init方法
//注意:新版中是instancetype类型,老版的是id类型
-(instancetype)init{
//如果重写父类的方法时,最好先调用一下父类的方法,父类要做什么,他先做,然后子类在继续
//[super init];的作用
//1.面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化
//2.为了防止父类的初始化方法release掉self指向的空间,而重新alloc一个块空间,这样的话,[super init]可能alloc失败,这时就不在执行if中语句了
//3.super作为消息接接收者的实质
self = [super init];
//判断父类是否初始化成功
if(self){
//Initialize code
//age初始化都为10
age = 10;
}
return self;//这个self指的是当前方法的调用者
}
@end

//以下是动态类型检测
int main(int argc,const char * argv[]){
Person *p = [Person new];
Person *p1 = [[Person alloc] init];

//此时输出age
NSLog(@"p->age",p.age);//输出10
NSLog(@"p1->age",p.age);//输出10

return 0;
}</span>