您的位置:首页 > 移动开发 > Objective-C

Objective-c - 继承的本质, new方法

2016-12-28 19:15 369 查看
/*

 继承的本质:

 

    1> 每一个类的内部都有一个属性 - isa指针,指向这个类的父类;

 

    2> 类创建对象,第一次访问类的时候会进行类加载,子类创建对象的时候,会将子类和其所有的父类一起加载到代码段.如果类里面有其他的类的对象做属性,那么其他的类也会加载到代码段.

 

    3> 在堆区开辟空间,创建对象,这个子类创建的对象拥有这个类的所有父类的所有属性,注意是属性,没有方法.

 

    4>如果是为对象设置属性,直接在堆区修改对应的属性即可.

 

    5> 如果要调用对象方法,则要通过对象内部的isa指针,找到代码区中的类,到类中寻找方法,如果没有找到,就到这个类的父类中区寻找,以此类类推,如果一直没有找到,就会报错.

 

 new方法做的事情:

 

    1>在堆区开辟空间存储对象,这个对象中会声明它对应的类中定义的所有属性(注意是属性,没有方法),还有一个isa指针,指向对应的在代码区中的类

 

    2>初始化这个对象内部属性的值

        1,基本数据类型初始化为:0

        2,OC的指针初始化为:nil
即:(0X0)不指向任何地址

        3,如果是C指针初始化为:NULL (0X0)

 

    3>返回这个对象在堆区的地址

 

 如下代码:

 

 */

#import <Foundation/Foundation.h>

#pragma mark -

#pragma mark 人类的创建

//声明

@interface YYPerson :
NSObject

{

    NSString *_name;

    int _age;

}

- (void)setName:(NSString *)name;

- (NSString *)name;

- (void)setAge:(int)age;

- (int)age;

- (void)sayHi;

@end

//实现

@implementation YYPerson

- (void)setName:(NSString *)name

{

    _name = name;

}

- (NSString *)name

{

    return _name;

}

- (void)setAge:(int)age

{

    _age = age;

}

- (int)age

{

    return _age;

}

- (void)sayHi

{

    NSLog(@"哈喽!大家好!");

}

//重写description方法

- (NSString *)description

{

    NSString *description = [NSString
stringWithFormat:@"姓名:%@
年龄:%d",
_name, _age];

    return description;

}

@end

#pragma mark -

#pragma mark 警察类的创建

//声明

@interface YYPolice :
YYPerson

{

    NSString *_polNum;

}

- (void)setPolNum:(NSString *)polNum;

- (NSString *)polNum;

//巡逻的方法

- (void)patrol;

@end

//实现

@implementation YYPolice

- (void)setPolNum:(NSString *)polNum;

{

    _polNum = polNum;

}

- (NSString *)polNum

{

    return
_polNum;

}

//巡逻的方法

- (void)patrol

{

    NSLog(@"我叫%@,%@!天气干燥,防火防盗!",
_name,
_polNum);

}

@end

#pragma mark -

#pragma mark main函数

int main(int argc,
const char * argv[]) {

    

    //创建警察对象

    YYPolice *POLICE = [YYPolice
new];

    /*

     

     这句代码的执行过程:

        1>在堆区开辟空间存储对象,这个对象中会声明它对应的类中定义的所有属性(注意是属性,没有方法),还有一个isa指针,指向对应的在代码区中的类

     

        2>初始化这个对象内部属性的值

            1,基本数据类型初始化为:0

            2,OC的指针初始化为:nil
即:(0X0)不指向任何地址

            3,如果是C指针初始化为:NULL (0X0)

     

        3>返回这个对象在堆区的地址

     

     */

    

    //赋值属性

    [POLICE setName:@"展昭"];

    [POLICE setAge:30];

    [POLICE setPolNum:@"警员2004"];

    /*

     赋值属性:

        修改对象的属性,直接在堆区进行

     */

    

    //调用方法

    [POLICE patrol];//自己的方法直接调用即可

   
//调用从父类继承的方法

    NSString *description = [POLICE
description];

    NSLog(@"%@", description);

    /*

     调用从父类继承的方法:

        调用方法则通过对象内部的isa指针,找到代码区中的类,如果该类当中没有,就到该类的父类当中去寻找,依此类推,如果没有找到就会报错

     */

    

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: