本文首发于我的个人博客:『不羁阁』 https://bujige.net 文章链接:https://bujige.net/blog/iOS-Member-variable.html
我们把Objective-C中写在类声明的大括号中的变量称之为成员变量(也称为属性,实例变量)。
@interface Iphone : NSObject
{
// 成员变量声明
int _cpu; // cup 0
int _size; // 尺寸 0
int _color; // 颜色 0
// 其中_cpu、_size、_color 就是 Iphone 类的成员变量
}
我们无法从外界(比如其他类和文件中)直接访问定义在类中的成员变量。为了能够从外界操作成员变量,我们需要为调用者提供相应的方法来对成员变量进行访问、赋值等操作。而定义这些方法都需要有一个有意义的名字,所以就有了getter-setter方法。
getter-setter方法格式和写法是固定的,这也是程序员之间的一种规范,只要有人想要访问成员变量或给成员变量赋值,就会立刻想到getter-setter方法,这样就降低了程序员之间的沟通成本。
如:如果成员变量为int _size 那么与之对应seter方法声明为
-(void) setSize: (int) size;
- (void)setSize:(int)size;
{
//成员变量以下划线开头的好处,就是可以区分局部变量和成员变量
_size = size;
}
如:如果成员变量为int _size 那么与之对应getter方法为
- (int) size;
- (int)size
{
return _size;
}
如果给成员变量提供了getter和setter方法,就可以通过点语法
来访问成员变量
.语法
自动转换为setter和getter方法=
号左边,那么编译器会自动转换为setter方法=
号右边,或者没有等号,那么编译器就会自动转换为getter方法- (void) setAge:(int)age {
// 下面的代码会引发死循环
self.age = age;
//编译器展开后 [self setAge:age]
}
- (int) age {
// 下面的代码会引发死循环
return self.age;
// 编译器展开后 [self age]
}
@interface Iphone : NSObject
{
@public
int _cpu;
@private
int _size;
@protected
int _color;
@package
double _weight;
}
@end
修饰符 | 类别 | 能否继承 | 在子类中的访问 |
---|---|---|---|
@private | 私有成员 | 能被继承 | 不能被外部方法访问 |
@public | 共有成员 | 能被继承 | 不能被外部方法访问 |
@protected | 保护成员 | 能被继承 | 不能被外部方法访问 |
比如用@property int size;就可以代替下面的两行声明
- (int)size; // getter
- (void)setSize:(int)size; // setter
_
,所以@property后的属性也不需要_
。并且@property和属性名称之间要用空格隔开用@synthesize size; 就可以代替
- (int)size{
}
- (void)setSize:(int)size{
}
//注意:@synthesize size; 并没有告诉setter和getter 把size赋值给谁,返回谁
而用@synthesize size= _size;就可以代替
- (int)size{
return _size;
}
- (void)setSize:(int)size{
_size = size;
}
@synthesize age = _age, number = _number, name = _name;
用@property int size;就可以替代下面两行声明
- (int)size; // getter
- (void)setSize:(int)size; // setter
以及下面两行实现
- (int)size{
return _size;
}
- (void)setSize:(int)size{
_size = size;
}
@property int size;
// 帮我们生成了一个_size的成员变量,而该成员变量_size是私有成员变量
@property (nonatomic, readonly) int size;
@property (nonatomic, readwrite) int color;
@property (nonatomic, getter=isMarried) BOOL married;
// 说明,通常BOOL类型的属性的getter方法要以is开头
@property(nonatomic, assign) int size;
@property (nonatomic, retain) NSNumber *count;
// 编译器为其生成的setter/getter方法
-(NSNumber *)count { // getter方法
return _count;
}
-(void)setCount:(NSNumber *)count { // setter
// 1.判断传入的对象和当前对象是否一样
if (_count != count) {
// 2.release以前的对象
[_count release];
// 3.retain传入的对象
_count = [count retain];
}
}
@property (nonatomic, copy) NSString *string;
@property (nonatomic, strong) UIButton *btn;
@property (nonatomic, weak) UIButton *btn;