您的位置:首页 > 编程语言 > C语言/C++

黑马程序员 - OC语言 - 重写构造方法

2015-12-18 15:28 393 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

有两个方法:

+alloc : (类方法)给对象分配空间的方法 -init:(对象方法)初始化对象的方法,<真正的构造方法>

有什么用?

在对象初始化的适合,就给属性赋值!

(如:当需要创建此类很多对象时,可以避免多行代码

Person *per1 = [Person new];

per1.age =10;

per1.name =@”huh”;



//构造方法只要一行代码 

Person *per1 = [[Person alloc]init]

)

场景1:在对象创建的一瞬间,就给对象赋值!

场景2: 在创建对象的时候,我想要动态的给对象赋值!

场景3: 让子类能够给自己的属性,初始化的时候能够赋值!

怎么用?

重写构造方法-(id) init

自定义构造方法-(id)initXXX

自定义子类的构造方法 -(id)initXXXX

Person *per3 = [[Person alloc] init];

用的时候注意什么?

1.NSObject的init方法必须调用

2.在没有特殊要求的情况下,子类和父类的赋值都应该在各自的类里面,各司其职,

 这样才能隔离父类的变化!

//  Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
//子类重写父类,声明不声明都可以
//-(id)init;
@property int age;
@end
//
//  Person.m
//
#import "Person.h"
@implementation Person
/*
场景1:在对象创建的一瞬间,就给对象赋值!(对象创建的时候,必须调用init方法)
子类重写父类的init方法,(init是真正的构造方法),
在init方法里面,给属性赋值,就能实现初始化时,就给属性赋值的需求!
-(id)init{
_age = 10; //这还不够!
}
父类的init方法里面有很多的操作,我不知道!(如:我并不知道父类的init,是如何进行实力化得)
因为子类重写父类的方法后,就不会在执行父类里面的操作,只会执行子类的方法了!
可我想要的是,执行父类里面的操作 -- 创建对象!创建对象的同时,给属性赋值?
【super init】 调用父类的init方法,self = 【super init】 用本身对象去接收!

严谨:
如果初始化失败,该怎么办?初始化失败会返回nil,就不需要对属性赋值! nil ==0;
if (self != nil) {}

注意:重写父类的方法,不需要声明也可以!
*/
-(id)init{
if (self = [super init]) {//原理,非0则为真!
_age =13;
}

return self;
}
@end
//
//  Cat.h
//
#import <Foundation/Foundation.h>
@interface Cat : NSObject
@property NSString *name;
@property int age;
-(id)initCat:(NSString*) name Age:(int)age;
@end
//
//  Cat.m
//
/*
场景2:在创建对象的时候,我想要动态的给对象赋值!
直接对重写父类的-(id)init方法,进行传参 ----不对,因为父类并没有带参数init方法!
自定义带参数的init方法里面调用父类的init方法!

注意:方法一定要声明,因为调用的是自己的方法,而不是父类的方法!
*/
#import "Cat.h"
@implementation Cat
-(id)initCat:(NSString*) name Age:(int)age{
if(self = [super init]){
_age = age;
_name = name;
}

return self;
}
@end
//
//  BSCat.h
//
#import <Foundation/Foundation.h>
#import "Cat.h"
@interface BSCat : Cat
@property NSString *color;//颜色
-(id)initBSCat:(NSString *)name Age:(int)age Color:(NSString *)color;
@end
//
//  BSCat.m
//
#import "BSCat.h"
@implementation BSCat
/*
场景3:让子类能够给自己的属性,初始化的时候就赋值!且继承父类的属性也能够动态赋值?
分析:   首先它是个自定义的动态初始化
-(id)initBSCat:(NSString *)name Age:(int)age Color:(NSString *)color
可是,因为父类给属性,定义的是@property
(@property自动生成的属性的默认是@private权限,只能在本类使用,不能在子类使用)
所以,两种解决方案
1) 手动更改父类的get和set方法!(缺陷,可扩展性差.如:父类要改个名字,子类也要跟着改)
调用NSObject 的init方法
if(self=[super init]){
_name = name;//_name2 = name;
_age =age;
_color = color;
}

4000
2) 调用父类Cat的initCat方法!(父类的修改,对子类没有影响.)

*/
-(id)initBSCat:(NSString *)name Age:(int)age Color:(NSString *)color{

if(self =[super initCat:name Age:age]){//调用父类的方法
_color = color;//添加自己的操作

}
return self;
}
@end
/*
main.m
构造方法
是一个对象在初始化的时候执行的方法.
init才是真的构造方法
构造方法的操作有两种:
1.重写.
优点:实现简单. 不足:不能够根据不同对象赋不同的值,属性的值是固定的.
2.自定义构造
优点:使用灵活,可以根据不同的对象给属性设定不同的值. 不足:写法比较麻烦一些.
3.子类继承父类自定义构造的写法.
在子类里自定义构造时,要调用父类的自定义构造,而不是NSObject的init.这样才能隔离父类的变化.
而且,父类的属性可以保持私有化private.
*/
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Cat.h"
#import "BSCat.h"
int main(int argc, const char * argv[]) {
/*
new 方法其实是封装了两个方法
+alloc:给对象分配一块内存(类方法)
-init:初始化这个对象(对象方法)
*/
//    Person *per = [Person new];

//    可以不初始化对象,直接赋值,但是不推荐,有时会出不可预知的错误
//    Person *per1 = [Person alloc];
//    per1.age =10;
//    NSLog(@"age1 =%d",per1.age);

//    标准方式
//    Person *per3 = [[Person alloc] init];
//    Person *per1 = [Person alloc];
//    Person *per2 = [per1 init];
//    per2.age =20;
//    NSLog(@"age2 =%d",per2.age);
//    简洁方式
Person *per3 = [[Person alloc] init];
per3.age =30;
NSLog(@"age3 =%d",per3.age);
//    场景1:在对象创建的一瞬间,就给对象赋值!(对象创建的时候,必须调用init方法)
Person *per4 = [[Person alloc]init];
NSLog(@"age4 = %d",per4.age);

//    场景2:   在创建对象的时候,我想要动态的给对象赋值!
Cat *ct = [[Cat alloc]initCat:@"boshimao" Age:3];
NSLog(@"name = %@ ,age = %d",ct.name,ct.age);

//    场景3:让子类能够给自己的属性,初始化的时候就赋值!且继承父类的属性也能够动态赋值?
//    以下两个输出的结果是一样得,因为在BSCat实现里面,调用的就是父类的init方法!
//    Cat *ca =[[BSCat alloc] initBSCat:@"boSiMao" Age:2 Color:@"hua"];
//    NSLog(@"name=%@ ,age =%d, color%@",ca.name,ca.age,((BSCat *)ca).color);

BSCat *bs =[[BSCat alloc] initBSCat:@"boSiMao" Age:2 Color:@"hua"];
NSLog(@"name = %@ ,age =%d, color = %@",bs.name,bs.age,bs.color);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序员 ios