Objective-C基础知识之(四):实例变量的可变度、初始化方法的声明、self和super的具体应用

一、OC实例变量的可见度

1、三种类型的可见度

@public

用@public修饰的实例变量,在类的内部和外部都可以使用,不推荐(禁止)使用。

@protected  

用@protected修饰的实例变量,在该类的外部不能使用,只能在该类的内部和其子类中使用。

实例变量的默认可见度就是@protected,可以省略不写。

@private

用@private修饰的实例变量,只能类的内部使用。

可见度所谓的类的内部指的是类的实现部分,即 类.m 文件中;类的外部指的是在main.m文件中使用。

2、禁止使用@public

面向对象语言的三大特性:封装,继承,多态,使用@public修饰,违反了封装特性。

封装的含义和作用:对外提供声明,隐藏内部实现。

3、如何在main.m文件中使用@protected修饰的实例变量

main.m文件中属于声明类的外部,只能使用public修饰的实例变量。要想在在main.m中使用@protected修饰的实例变量需要使用到方法。

另:

私有方法:只实现,不声明

在OC中没有私有的概念,只是实现了类似的现象。


 二、方法的声明

1、初始化方法

-(instancetype)init

{

//    初始化的核心思想:每个类在自己的初始化方法中,实现对自己定义的实例变量进行赋值。

//    使用supr调用父类中某个初始化方法的实现,目的:实现对继承的实例变量的赋值。

//    任何类都继承自NSObject,NSObject只提供了init方法,在这个初始化方法中,实现了对isa变量进行赋值。

self = [super init]; 

//    当初始化成功时,会返回对象;当初始化失败时,会返回nil。

//    当对继承的实例变量进行初始化失败时,不再对本类中的实例变量进行初始化设置

    if (self != nil) {      

//     对本类的实例变量进行初始化设置   

}

//    当继承的和本类的实例变量初始化完成后,返回初始化后的对象

    return self;

}

2、self super 详解

(1)、self

在类方法中,self表示调用这个方法的类。

在实例方法中,self表示调用这个方法的对象。

self的作用:在类的内部调用自己的方法,即调用类中的实例方法。

备注:当self表示类时,只能用来调用类方法。当self表示对象时,只能用来调用实例方法。

(2)、super

super是编译器指令,并非对象。

子类中,可以通过Super获取父类中的实现,再单独写其他的实现。

super不是父类对象。

super的作用:从父类中逐级查找某个方法的实现,子类使用查找到的实现代码。

实际上并不需要逐级查找,因为父类以经继承了从根类到父类的父类的方法。

2、便利构造器

#import<Foundation/Foundation.h>

@interfacePerson : NSObject

{

    NSString * _name;

    NSString * _gender;

    NSInteger _age;

}

+(instancetype)personWithName:(NSString *)name;

 

+(instancetype)personWithName:(NSString *)name gender:(NSString *)genderage:(NSInteger)age;

@end

 

#import"Person.h"

@implementation Person

//便利构造器的实现

+(instancetype)personWithName:(NSString *)name

{

//    创建对象

    Person * p = [[Person alloc]initWithName:name];   

//    返回对象

    return p;

}

+(instancetype)personWithName:(NSString *)name gender:(NSString *)genderage:(NSInteger)age

{

    Person * p = [[Person alloc]initWithName:name gender:gender age:age]; 

    return p;

}

@end

 

便利构造器的作用和使用:

在某个类的方法中实现对象的创建,在main.m中直接对创建好的对象进行初始化赋值操作。

 

便利构造器的声明必须和自定义的init的名称一致:

(1)、继承的父类如果是NSObject,则只能使用init的方法,便利构造器的声明则是+ (instancetype)类名init;。

(2)、继承的是NSObject的子类或以下作为分类的,便利构造器的名称要和声明的自定义的init的名称一致。

(3)、如果各本类中声明了init的自定义方法,也可以使用本类自身的init方法进行便利构造器的声明和设置。

(4)、名称中唯一不同的是:init变为了对应的类名。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值