Dog.h #import <Foundation/Foundation.h> @interface Dog : NSObject { NSString *_name; int _age; char *cc; } @end Dog.m #import "Dog.h" @implementation Dog // 谁调用Self所在的方法,self就指向谁,self就是谁. - (instancetype)init { /** * 重写init方法是有条件的 */ // self是谁?DogSon if (self = [super init]) {//初始化父类的 // 子类的初始化等等其他操作,在这个花括号里面做 _age = 1; NSLog(@"Dog---%@",self); } return self; } @end DogSon.h #import "Dog.h" @interface DogSon : Dog // 自定义构造方法 // 命名的时候:init后边接的单词,首字母必须大写. - (instancetype)initWithName:(NSString *)name andAge:(int)age; @end /* 1.自定义构造方法 1.自定义构造方法的规范 (1)一定是对象方法,以减号开头 (2)返回值一般是id(instancetype)类型 (3)方法名一定以initWith开头 3.自定义构造方法的使用注意 (1)自己做自己的事情 (2)父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性 */ DogSon.m #import "DogSon.h" @implementation DogSon - (instancetype)initWithName:(NSString *)name andAge:(int)age { // 必须调回父类的构造方法 if (self = [super init]) { _name = name; _age = age; } return self; } //- (instancetype)init //{ // if (self = [super init]) // { // _age = 10; // } // return self; //} @end main.m //05-12 /** new一下,就能有一个对象. 1.分配内存空间 + alloc 2.初始化. - init 构造方法:指的就是初始化方法. 需求1:创建10只狗,让这些狗在创建时,所有的年龄都是1岁. 修改构造函数可以考虑重写init方法. 初始化成员变量 OC对象初始化为nil C语言指针初始化为:NULL 基本数据类型初始化:0 需求2:创建10只小狗,让这些狗在创建时,可以手动进行成员变量的赋值. */ #import <Foundation/Foundation.h> #import "DogSon.h" int main(int argc, const char * argv[]) { @autoreleasepool { DogSon *s = [[DogSon alloc] initWithName:@"旺财" andAge:1]; } return 0; } /** 1.构造方法 1.构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; new方法的内部会分别调用两个方法来完成3件事情: (1)使用alloc方法来分配存储空间(返回分配的对象); (2)使用init方法来对对象进行初始化。 (3)返回对象的首地址. 可以把new方法拆开如下: (1).调用类方法+alloc分配存储空间,返回未经初始化的对象 Person *p1=[Person alloc]; (2).调用对象方法-init进行初始化,返回对象本身Person *p2=[p1 init]; (3).以上两个过程整合为一句:Person *p=[[Person alloc] init]; 说明: (1)init方法就是构造方法,是用来初始化对象的方法,注意这是一个对象方法,以减号开头。默认初始化完毕后,所有成员变量的值都为0。 (2) alloc 向某个类发送alloc消息的结果 为该类分配内存,以存放该类的全部实例变量 还将这块内存区域全部初始化为0 注意 一个刚刚分配的对象并不能立即使用 需要先初始化该对象,然后才能使用它 但由于未进行初始化, 随后可能出现一些不可预测的行为 */