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;
}
继承的本质:
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;
}
相关文章推荐
- objective-C 的OOP(上)--类定义、继承及方法调用
- 备忘,override,new,抽象方法,继承多态等
- 【Objective-C】13-类和方法的本质
- Objective-C学习笔记(二十五)——属性与方法的继承学习
- Objective-C 类的继承、方法的重写和重载
- Learn Objective‐C,学习笔记03 类别(实现多重继承的方法)
- Objective-c 类的继承 方法重写 方法重载
- 黑马程序员——OC学习之类的本质和常用的继承自NSObject的方法
- [Objective-C] 03.OC中的继承和初始化方法
- Objective-C 【继承、变量修饰符(私有变量/方法)、description方法】
- Objective-C学习笔记---类别(实现多重继承的方法)
- Objective-C 类别Categroy (实现多重继承的方法)
- 类继承接口, 通过接口对象new继承类的类(包含派生类),调用对象方法,其实其第一个接口继承的
- Objective-C( 继承,初始化方法)
- c# 继承,多态,new /overrid 区别, 引用父类的方法
- objective-C 的OOP(上)--类定义、继承及方法调用
- Objective-C学习笔记---类别(实现多重继承的方法)
- objective-c 学习笔记- 继承、重写、虚方法
- 【Objective-C学习笔记】核心语法——类的本质、description方法
- swift继承自Objective-C基类时重载方法报错的问题