OC面向对象五构造方法

id:万能指针,已经带*

typedef struct objc object{

Class isa;

} *id;


Person *p = [Person new];
NSObject * = [Person new];//id==NSObject *
id d=[Person new];//能操作任何OC对象
[d setAge:10];

@property id obj;//说明obj是任意类型
[d setObj:@"asdfa"];

  

构造方法:用来初始化对象的方法,是对象方法 -开头

重写构造方法目的:为了让对象创建出来,成员变量就会有一些固定的值

/*注意点:

先调用父类的构造方法([super init])

再进行子类内部成员变量的初始化

*/

Person *p = [Person new];//+ (id)new;

//先分配存储空间+alloc,再初始化-init,初始值是0

Person *p2=[[Person alloc] init];//以后开发都这么写


若想改变init初始化为自定义的值,就要重写- init方法

- (id)init
{
	//1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
	self = [super init];  //返回当前对象,由于涉及到运行时,所以需要再次确定
	if (self !=nil)
	{//2.初始化成功
		_age=10;
	}
	return self;//3.返回一个已经初始化完毕的对象
}


 精简:

- (id)init
{
	if(self = [super init])
	{
		_age=10;
	}
	return self;
}

自定义构造方法的规范

1.一定是对象方法,一定以  -   开头

2.返回值一般是id类型

3.方法名一般以init开头

- (id)initWithName:(NSString *)name andAge:(int)age;
- (id)initWithName:(NSString *)name andAge:(int)age
{
	if(self=[super init])
	{
		_name=name;
		_age=age;
	}
	return self;
}
Person *p = [[Person alloc] initWithName:@"Rose" andAge:20];

父类属性(成员变量)交给父类去处理,子类属性交给子类自己处理

Student 继承Person 自定义构造方法

- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
{
//由于子类无法改变父类的成员变量,无法使用_name=name;可以用self.name=name;或[self setName:name];代替之。
//另一个好处就是,父类的name值改了,不需要子类再去改。
   if(self = [super initWithName:name andAge:age])//一般通过super父类的方法实现我们自定义构造方法初始化指定的值
    {
     _no=no;
     }
   return self;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章