实例变量可见度和方法
1.实例变量可见度
- public 对外公开,子类可以继承
- protected 对外不公开,子类可以继承
- private对外不公开,子类不可继承
// 声明实例变量
// 公有的
@public
NSString *_address; //地址
NSString *_hobby; //兴趣
// 受保护的,默认的
@protected
NSString *_name; //姓名
int _age; //年龄
// 私有的
@private
NSString *_sex; //性别
被public修饰的实例变量可以用 ->直接访问,进行赋值取值操作:
Person *p = [[Person alloc] init];
p->_address = @"北京";
p->_hobby = @"hello";
如何在其他文件访问被protected修饰的实例变量?可以通过方法传入参数,在类的内部实现实例变量的赋值取值操作:
方法声明如下:
// 给name添加设置值的方法
- (void)setName:(NSString *)name;
// 给_name添加取值的方法
- (NSString *)getName;
方法实现:
// 实现设置值的方法
-(void)setName:(NSString *)name
{
_name = name;
}
// 实现取值的方法
-(NSString *)getName
{
return _name;
}
2.方法
OC中方法分为两类:
- "-"方法(实例方法):只能对象使用,eg: -(void)sayHi
- "+"方法(类方法):只能类使用,类方法中不能使用实例变量,eg: +(id)alloc
方法声明:
- (void)sayHiWithName : (NSString *)name withAge : (int)age;
这个方法有两个参数name和age,(NSString *)、 (int)分别是参数的数据类型。
sayHiWithName,withAge是参数形容词
方法名是参数形容词和“:”,所以该方法的方法名是sayHiWithName :withAge :
冒号“:”不能省略,冒号的个数与参数个数一致
3.复合
- oc中,实例变量由其他类型(对象类型)组成,称作复合。
例如:创建四个类,分为为Father类,Mother类,Child类,Family类
Family类的实例变量声明如下:
// 声明三个实例变量
Father *_father; // 爸爸
Mother *_mother; // 妈妈
Child *_child; // 孩纸
这三个实例变量不是普通数据类型,而是已经创建的三个类。
import
当一个文件中需要用到其他类,需要导入其类名:
#import <Foundation/Foundation.h>
#import "Father.h"
#import "Mother.h"
#import "Child.h"
交叉导入问题:A B两个类,A类中导入了B的头文件,如果B类中也导入了A的头文件,这就叫交叉导入
要避免交叉导入的问题,可以使用@class(前置声明),前置声明的作用是告诉编译器@class后的字符串是一个类,但其实并未导入类的接口内容。