实例变量可见度和方法
实例变量的可见度分为以下四个:
// 成员变量及成员变量的可见范围(访问范围)。
@private // 私有的,只有自己可以访问
NSString *_name;
@protected // 受保护的,只有自己和自己的子类可以访问
NSString *_money;
@public // 共有的,都可以访问
NSString *_address;
@package // 在这个项目中都可以访问
NSString *_number;
如果不修饰可见度,默认为@protected.
如果在其他地方引用私有变量,在编译的时候会提示错误:
第一个错误提示为:没有这个属性。没有定义属性。或者只定义了变量,没有使用属性[email protected]
第二个错误提示为:没有这个变量,因为变量我们定义的是私有的,如上面的代码定义。
NSLog() 为Object-C里面的输出函数,可以输出信息到标准输出设备上面,这里指XCode的控制台。
方法:
上面一篇文章有提到过方法,这里在说明一下:
Object-C中有两种方法:类方法(+)和实例方法(-)。
类方法(+):只能类使用。一般多用在工具类里面,比如:封装的网络请求、单利等。例如:+ (instancetype)alloc;
注意:类方法里面不能使用实例变量。
实例方法(-):只能对象使用,例如:-(void)sayHi;
知道了OC中的方法分类,那方法格式呢?如下:
- (void)replaceObjectAtIndex:(NSUInterger)index withObject:(id)anobject
说明:- :方法类型 。+ 或 -
(void): 返回值。可以为空,但是必须写 void.不能为 ()。
replaceObjectAtIndex:withObject: 参数形容词
(NSUInterger)或(id): 参数类型
index 或 anObject : 参数名
知道了方法的格式,哪一个方法的方法名是什么呢,即为参数形容词:
replaceObjectAtIndex:withObject:
知道了方法的格式及方法名,下来介绍一个重要的方法,设置器(setter)和访问器(getter)。
OC里面规定了setter和getter的格式:
声明在.h文件里面
//设置器
- (void)setName:(NSString *)name;
//取值器
- (NSString *)name;
实现在.m文件里面
//设置器
- (void)setName:(NSString *)name{
_name = name;
}
//取值器
- (NSString *)name{
return _name;
}
可以看到声明的时候的格式为:
setter: set+首字母大写的实例变量名(忽略下划线)
getter: 返回类型和声明类型一直,方法名和变量名相同(忽略下划线)
注意一点的是:在setter里面禁止使用 self. 方法获取实例变量,会导致循环引用。后面会提到。self. 在等到左边是setter方法,在等号右边是getter方法。
初始化方法:
- (instancetype)init; 系统的默认初始化方法,这个方法只能给实例变量设置默认值,不灵活。
- (instancetype)intiWithName: 自定义初始化方法,根据需求定义初始化方法。可以传入name变量的值。灵活
例如下面的初始化方法,可以传入姓名和年龄:
.h中声明方法
// 自定义初始化方法:
- (instancetype)initWithName:(NSString *)name age:(int)age;
.m中实现方法
// 自定义初始化方法:
- (instancetype)initWithName:(NSString *)name age:(int)age{
self.name = name;
self.age = age;
return self;
}
#import 导入头文件:
#import "" 导入自定义头文件
#impott <> 导入类库中的头文件。
和 C中的#include 的区别是,#import可以避免重复导入。
注意:容易出现循环导入的问题。
A类中#import "B",B类中#import "A", 这种情况为循环导入,如何解决?
@class ,A或B中直接使用哪个 @class B \@class A, 表示 class 修饰的是一个类,后面的字符串做为类名使用,并未导入类的接口内容。有效的避免了循环导入。