oc-28-构造函数

简介:
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
注意
一个刚刚分配的对象并不能立即使用
需要先初始化该对象,然后才能使用它
但由于未进行初始化, 随后可能出现一些不可预测的行为
*/
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5314417.html,如需转载请自行联系原作者

相关文章
|
缓存 Java iOS开发
OC中动态方法解析
OC中动态方法解析
51 1
OC泛型的使用
在声明类的时候,不确定某种属性或方法类型,在使用这个类的时候才确定,就可以采用泛型 如果没有自定义泛型,默认就是id类型
329 0
|
C# Java iOS开发