/*
1> 创建一个对象,那么就调用这个类的new方法.
2> new方法是一个类方法,new方法做的事情:
1>在堆区开辟空间存储对象,这个对象中会声明它对应的类中定义的所有属性(注意是属性,没有方法),还有一个isa指针,指向对应的在代码区中的类
2>初始化这个对象内部属性的值
1,基本数据类型初始化为:0
2,OC的指针初始化为:nil 即:(0X0)不指向任何地址
3,如果是C指针初始化为:NULL (0X0)
3>返回这个对象在堆区的地址
3> new方法的底层:
new方法的底层是调用了alloc方法和init方法.
alloc方法是一个类方法,这个方法做的事情是:创建对象.
init方法是一个对象方法,这个方法做的事情是:初始化这个对象.(初始化就是为对象的属性赋默认值.)
4> 所以创建对象YYPerson *xiaoming = [YYPerson new];等价于YYPerson *xiaoming = [[YYPerson alloc]init];
因为new方法内部就是先调用类方法alloc,再调用对象方法init.
5> init方法,我们叫做构造方法.
init方法做的事情是:初始化对象,为对象的属性赋默认值(基本数据类型初始化为0/oc指针初始化为nil/c指针初始化为NULL).创建对象必须使用init方法初始化以后才可以使用,否则就有可能会产生各种各样的问题.
6> 重写init方法.
如果我们希望对象创建出来以后,对象的属性的值不是默认值0/nil/NULL,而是我们期望的值,那么我们就可以重写init方法.
1, 先调用父类的init方法.
2, init方法有返回值,返回值是当前对象,调用init方法有可能会执行失败,执行失败返回值就是nil.调用父类的init方法,将这个方法的返回值赋值给self.
3, 判断父类的init方法是否执行成功,如果成功,再去按照自己期望的方式初始化自己的属性.
4, 返回当前对象,self.
7> 需要重写init方法的情况.
1, 当对象创建出来的时候,希望对象的属性的值是我们指定的值,而不是0/nil/NULL.
2, 如果有一段代码,希望在对象创建的同时执行,那么我们就可以将这段代码写在init方法中.
8> 重写init方法的规范.
必须先调用父类的init方法,并复制给self,并判断是否成功执行.
- (instancetype)init
{
if(self = [super init])//说明父类的init方法执行成功
{
初始化子类自己的属性;
}
return self;
}
*/
#import <Foundation/Foundation.h>
//人类的声明
@interface YYPerson : NSObject
@property NSString *name;
@property int age;
- (void)sayHi;
@end
//人类的实现
@implementation YYPerson
- (void)sayHi
{
NSLog(@"大家好,我叫%@,今年%d岁了!", _name, _age);
}
- (instancetype)init//重写init方法
{
if(self = [super init])
{
self.name = @"小明";
self.age = 18;
}
return self;
}
@end
int main(int argc, const char * argv[]) {
//创建对象
YYPerson *xiaoming = [[YYPerson alloc]init];//此处调用了重写之后的init方法,为对象的属性赋值了期望的值.
//调用方法
[xiaoming sayHi];
return 0;
}