实例变量可⻅度
可见度 | 特点 |
---|---|
public(公有的) | 实例变量可以在类的外部和内部操作 |
protected(受保护的,默认的) | 实例变量只能在该类和其⼦类内操作 |
private(私有的) | 实例对象只能在该类内访问 |
注:所谓的内部,指的是相应类的@implementation 和@end之间
// .h文件中
@interface Person : NSObject
{
@public
NSString *_hobby; //兴趣
@protected
NSString *_name; //姓名
int _age; //年龄
@private
NSString *_sex; //性别
}
// main函数文件中
//@public
Person * p = [[Person alloc] init];
p -> _hobby = @“听⾳乐、看电影”;
NSLog(@"⼈的兴趣:%@",p -> _hobby);
//@protected
//@private
注意事项:
- 为什么不使⽤@public?
- 使⽤@public关键字,暴露了类内部的细节
- 不符合⾯向对象语⾔的三⼤特性之⼀——封装
- 如何在其他⽂件中访问对象@protected修饰的实例变量?
- 提⽰:添加两个⽅法
- 赋值:通过⽅法传⼊参数,在类的内部实现实例变量赋值
- 取值:通过⽅法获取实例变量的值
⽅法
无参方法声明实现及调用
对象方法
- 对象方法以-开头如 -(void)xx;
- 对象方法只能由对象来调用
- 对象方法中可以访问当前对象的成员变量
- 调用格式 [对象名 对象方法名];
类方法
- 类方法以+开头 如+(void)put;
- 类方法只能由类来调用
- 类方法中不能访问实例(成员)变量,因为类方法由类来调用,并没有创建存储空间来存储类中的成员变量
- 调用格式:[类名 类方法名];
- 类方法的好处和适用场合:
- 不依赖于对象,执行效率更高;
- 能用类方法解决的问题,尽量使用类方法;
- 场合:当方法内部不需要使用到成员变量时,可以改为类方法。
声明
//方法类型 返回值类型 方法名
- (double) pi;
调用
使用对象调用方法就是OC中的消息机制
oc语言中采用特定的语言调用类或者实例(对象)的方法称为发送消息或方法调用。
//格式:[类名或者对象名 方法名];
Person * p = [[Person alloc] init];
[p eat];
有参有返回值
方法名
删除:类型标识,返回类型,参数类型,参数名,空格。例如:
replaceObjectAtIndex:withObject:
类中不能出现同名⽅法。
- “ : ” 标识参数,不能省略。有冒号必须有参数。
初始化、赋值、取值⽅法(init、setter、getter)
初始化
//.h 文件
//声明属性
@interface AoDiCar : NSObject
{
NSString *_color;
int _lunzi;
NSString *_pinpai;
}
//init
-(id)initWithColor:(NSString *)color
lunzi:(int)lunzi
pinpai:(NSString *)pinpai;
//.m 文件
//init
-(id)initWithColor:(NSString *)color
lunzi:(int)lunzi
pinpai:(NSString *)pinpai{
_color = color;
_lunzi = lunzi;
_pinpai = pinpai;
return self;
}
单个参数
//.h 文件
//赋值
- (void)setName:(NSString *)name;
//取值
- (NSString *)getName;
//.m 文件
//赋值
- (void)setName:(NSString *)name{
_name = name;
}
//取值
- (NSString *)getName{
return _name;
}
多个参数
//.h 文件
//setter
-(void)setColor:(NSString *)color
lunzi:(int)lunzi//注意,这里没有分号
pinpai:(NSString *)pinpai;//这里才有分号
//getter
-(NSString *)color;
-(int)lunzi;
-(NSString *)pinpai;
//.m 文件
//setter
-(void)setColor:(NSString *)color
lunzi:(int)lunzi
pinpai:(NSString *)pinpai{
_color = color;
_lunzi = lunzi;
_pinpai = pinpai;
}
//getter
-(NSString *)color{
return _color;
}
-(int)lunzi{
return _lunzi;
}
-(NSString *)pinpai{
return _pinpai;
}
调用
//main函数
AoDiCar *car1 = [[AoDiCar alloc] initWithColor:@"黑色" lunzi:4 pinpai:@"不造"];//初始化
NSLog(@"%@奥迪有%d个轮子,品牌%@",[car1 color],[car1 lunzi],[car1 pinpai]);//输出初始化的数据
[car1 setColor:@"红色" lunzi:4 pinpai:@"不造"];//用setter赋值
NSLog(@"%@奥迪有%d个轮子,品牌%@",[car1 color],[car1 lunzi],[car1 pinpai]);//用getter取值
@class
用于引入类,但并不引入类的属性
IOS基础:深入理解Objective-c中@class的含义
objective-c中,当一个类使用到另一个类时,并且在类的头文件中需要创建被引用的指针时,有两种办法:
一种是通过#import方式引入;另一种是通过@class引入;
#import "B.h"//引入类,同时引入类属性
@class B;//仅引入类
@interface A : NSObject {
//A类是引用类,B类是被引用类
B *b;
}
@end
### instancetype和id的区别
- instancetype在类型表示上,跟id一样,可以表示任何对象类型;
- instancetype只能用在返回值类型上,不能像id一样用在参数类型上;
- instancetype比id多一个好处:编译器会检测instancetype的真实类型;