我们在OC中定义一个类的时候,它的成员变量默认情况下是@protected的。这是因为我们的成员变量一般不允许直接去访问,如果需要修改和访问成员变量我们就要用到成员变量的set方法和get方法。
set方法是用来给成员变量进行赋值的,也可以起到对传入的数据进行过滤的作用。
set方法的命名规范是:以set为开头,后面加上成员变量名,成员变量名的首字母要大写,再后面就是传入的形参的名称。例如成员变量是NSString *_name;这时定义的set方法的形式就是- (void)setName:(NSString *)name; 这里void是方法的返回值类型,由于set方法不需要返回值,这里我们就写入void类型,NSString *是形参的类型。这里我们要注意方法的返回值类型和形参的类型都要用小括号括起来,set方法名跟参数之间要用“:”隔开。
get方法的命名规范是:前面是方法的返回值类型,后面写上成员变量名。例如成员变量是NSString *_name;这时定义的get方法的形式就是- (NSString *)name; 这里NSString *是方法的返回值类型,name是get方法的名称。这里我们要注意方法的返回值类型要用小括号括起来。
上面就是set方法和get方法的命名规范。
下面我们新建一个Person类并学习set方法和get方法的声明和实现。
首先,我们新建一个Person类并 对set和get方法进行声明。下面就是对set和get方法的声明:
@interface Person:NSObject
{
int _age;
NSString *_name;
}
- (void)setAge:(int)age;
- (int)age;
- (void)setName:(NSString *)name;
- (NSString *)name;
@end
上面就是对成员变量_age和_name的声明。那么set和get方法又是怎么实现的呢?我们通过下面的代码来学习成员变量_age和_name的set和get方法的实现。
@implementation Person
// 成员变量_age的set和get方法的实现
- (void)setAge:(int)age
{
_age = age;
}
- (int)age;
{
return _age;
}
// 成员变量_name的set和get方法的实现
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
@end
上面的代码我们省略了set方法中对数据的判断,平常写代码的时候要注意在set方法里写上对传入的数据的判断,以避免传入的数据不合理。
那么怎么用set和get方法对成员变量进行赋值并得到成员变量的值呢?我们在main函数中设置和取出成员变量的值:
int main()
{
// 创建一个Person对象p1
Person *p1 = [Person new];
// 给成员变量_age和_name赋值
[p1 setAge:18];
[p1 setName:@"张三"];
//取出并输出成员变量的值
NSLog(@"_age = %d, _name = %@", [p1 age], [p1 name]);
return 0;
}
输出结果是:
_age = 18, _name =张三
从输出结果可以看出我们的确成功地设置和取出了成员变量的值了。调用对象方法时的形式:[对象名 方法名];
上面就是set方法和get方法的声明和实现,但我们可以发现如果成员变量有很多时,我们在写各个成员变量的set和get方法的时候就会非常繁琐,而且这些代码都是没有实际意义的。在Xcode中,苹果官方给我们提供了一个生成set和get方法的声明和实现的快捷方式:@property和@synthesize。
@property是用来生成成员变量的set和get方法的声明的。下面我们用@property来实现上面例子中的声明:
[objc] view plain copy
@interface Person : NSObject
{
int _age;
NSString *_name;
}
// 用@property来实现set和get方法的声明
@property int age;
@property NSString *name;
@end
就是这么简单,只需要在@property后面加上数据类型和变量名就可以了,注意变量名不要连下划线一块写。
下面我们用@synthesize对set和get方法进行实现:
[objc] view plain copy
@implementation Person
// 利用@synthesize实现成员变量的set和get方法
@synthesize age = _age;
@synthesize name = _name;
@end
这种方式已经对代码量进行了很大的精简了,但是我们还有更加精简的方式:
[objc] view plain copy
@interface Person : NSObject
//{
// int _age;
// NSString *_name;
//}
// 用@property来实现set和get方法的声明
@property int age;
@property NSString *name;
@end
@implementation Person
// 利用@synthesize实现成员变量的set和get方法
//@synthesize age = _age;
//@synthesize name = _name;
@end
上面的代码也实现了对成员变量的声明和实现,但是我们成员变量呢?我们的@synthesize呢?
当省略成员变量的时候,我们的@synthesize会自动在方法的实现中对成员变量进行定义,而且定义的成员变量是@private类型的。当省略@synthesize时我们的@property又会自动生成@synthesize代码,所以我们可以只写@property就可以实现定义变量、声明set和get方法和实现set和get方法。
以上就是set和get方法的简单介绍和简化操作。我们要注意以下几点:
1、为什么使用set和get方法?
这是因为我们的成员变量要进行封装,不能让外部直接对变量进行修改和访问。这提高了安全性的同时也可以让我们不需要去关注实现的细节。
2、掌握set和get方法的声明和实现的具体操作。
3、掌握@property和@synthesize的作用和使用方法。
总结:
1、set方法和get方法是用来对数据进行设置和取值的。
2、在set方法中我们可以对传入的数据进行判断,以防止输入一些不合理的值。
3、我们可以利用@property来实现set和get方法的声明,利用@synthesize对set和get方法进行实现。这样可以简化我们要输入的代码。
4、定义属性的时候最好在前面加上下划线。