一、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变为了对应的类名。