OC基础教程6-对象初始化

前言

Cocoa创建对象是使用alloc和init.


目标

学会对象初始化方法,其实是背下来。


内容

1.分配对象

分配(allocation)是一个新对象诞生的过程,从操作系统获得一块内存,并将其指定为存放对象的实例变量的位置。
向某个类发送alloc消息,就能为类分配一块足够大的内存,以存放该类的全部实例变量,同时alloc方法顺便将这块内存全部初始化为0.

所有的BOOL类型变量被初始化为NO
所有的int类型变量被初始化为0
所有的float类型变量被初始化为0.0
所有指针被初始化为nil

2.初始化对象

与分配对应的操作是初始化。
Car *car = [[Car alloc] init];
而不是:
Car *car = [Car alloc];[car init];
这种嵌套调用的技术非常重要,因为初始化方法返回的对象可能与分配的对象不同。

3.指定初始化函数

类中的某个初始化方法被指派为指定初始化函数,该类的所有初始化方法都使用指定初始化函数执行初始化操作,而子类使用其超类的指定初始化函数进行超类的初始化。
通常,接收参数最多的初始化方法是最终的指定初始化函数。

4.自定义初始化

Person.h

//  Person.h  
//  03_InitDemo  

#import <Foundation/Foundation.h>  

@interface Person : NSObject{  
    NSString *_name;  
    NSInteger _age;  
}  

//自定义初始化方法,必须以init开头  
- (id)initWithName:(NSString *)name withAge:(NSInteger)age;  

//打印信息  
- (void)showInfo;  

@end  

这里我们定义了一个初始化方法,对名称和年龄进行初始化赋值操作
注:OC中自定义初始化方法的名称必须是以init开头

Person.m

//  Person.m  
//  03_InitDemo  

#import "Person.h"  

@implementation Person  

- (id)initWithName:(NSString *)name withAge:(NSInteger)age{  
    //固定写法,可以背下来哦~~  

    //调用父类的初始化方法  
    self = [super init];  

    if(self != nil){  
        _name = name;  
        _age = age;  
    }    
    return self;  
}  

- (void)test{  
    NSLog(@"test");  
}  

- (void)showInfo{  
    [self test];//调用自己的方法  
    NSLog(@"name is %@ and age is %d",_name,_age);  
}  

@end  

这里我们看到了,初始化方法返回的类型是id类型,关于OC中的id类型,可以认为和C语言中的void*是相等的,这种类型在OC中经常被用到,还有就是self关键字的使用,这里的self关键字就相当于Java中的this关键字,指代当前类对象,还有super关键字,这个和Java中的super也是一样的,指代父类对象。还有一个是nil,他就相当于Java中的null,空对象的概念,用于判断的。
同时这里还要记住一点:
以后OC中自定义初始化的方法的模板:

//固定写法,可以背下来哦~~  
//调用父类的初始化方法  
self = [super init];  
if(self != nil){  
    _name = name;  
    _age = age;  
}    
return self;  

下面来看一下如何使用初始化方法:
main.m

//  main.m  
//  03_InitDemo  

#import <Foundation/Foundation.h>  

#import "Person.h"  

int main(int argc, const charchar * argv[]) {  
    @autoreleasepool {  
        //初始化方法只能调用一次  
        Person *person = [[Person alloc] initWithName:@"jiangwei" withAge:22];  
        [person showInfo];  

        person = [[Person alloc] init];  
        [person showInfo];  

        //id类型,类似于void*  
        //但是id类型一般不这么使用,一般会作为方法的返回值和传入的参数类型  
        id person1 = [[Person alloc] initWithName:@"huangdaoyang" withAge:23];  
        [person1 showInfo];  
    }  
    return 0;  
}  

我们使用了我们自定义的方法实例化了一个Person对象出来,同时调用他的showInfo方法,打印结果,这里我们也会发现Person的init方法任然可以使用,这个和Java中是有区别的,
这个init方法是NSObject父类的,可以猜想到这个方法的逻辑功能就是初始化,所以我们在自定义初始化方法的时候,都是会用到这个方法的。

运行结果:
这里写图片描述


总结+废话

好了,抄别人家的代码就抄到这。
感觉没什么废话好说滴。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值