黑马程序员----OC学习之成员变量的get,set方法多种实现
2015-02-06 19:51
543 查看
本文主要纪录oc类对象中成员变量的get set方法的多种实现,涉及到一般的getset编写,@property @synthesize以及缺省部分代码时的各种特性。
下面是最基本的get set写法,以Person类为例。
Person.h文件:
[objc] view
plaincopy
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
@private
NSString * _name;
int _age;
}
//get方法
- (NSString *) name;
- (int) age;
//set方法
- (void) setName:(NSString *)name;
- (void) setAge:(int)age;
@end
Person.m文件:
[objc] view
plaincopy
#import "Person.h"
@implementation Person
//get方法实现
- (NSString *)name{
return _name;
}
- (int)age{
return _age;
}
//set方法实现
- (void)setName:(NSString *)name{
_name = name;
}
- (void)setAge:(int)age{
_age = age;
}
@end
main.m文件中:
[objc] view
plaincopy
#import <Foundation/Foundation.h>
#import "Person.h"
int main() {
Person *p1 = [[Person alloc] init];
[p1 setName:@"小红"];
[p1 setAge:13];
NSLog(@"name=%@,age=%d",[p1 name],[p1 age]);
return 0;
}
最后输出结果为:
2014-12-17 12:02:37.674ocblog4[472:14456] name=小红,age=13
如上是最基本的对类成员变量的get set方法编写。
对于set方法:
1. 用来设置变量的值,也可以起到过滤不合法数据的作用。
2. 方法以set开头,后面跟上首字母大写的成员变量名,而且注意形参名不要和成员变量名相同。
对于get方法:
1. 作用就是返回成员变量的值。
2. 一般在oc中,get方法名就和成员变量名一样,比如变量 int _age;的get方法名可以写为 –(void) age;
oc中为了好区分成员变量和一般变量,一般规定在成员变量名前加上”_”,如”_age”以示区别。
如上是最基本的get set方法的编写,但是却非常麻烦,oc于是推出了一个新的编译器特性,加入了@property和 @synthesize来让get set方法变简单。
加入@property @synthesize后的写法如下:
Person2.h文件
[objc] view
plaincopy
#import <Foundation/Foundation.h>
@interface Person2 : NSObject
{
@private
NSString *_name;
int _age;
}
@property NSString *name ;
@property int age;
@end
Person2.m文件中:
[objc] view
plaincopy
#import "Person2.h"
@implementation Person2
@synthesize name = _name;
@synthesize age = _age;
@end
可以看到@property取代了get set方法的声明,@synthesize取代了get set方法的实现,节省了代码。但这还不是最简,如上代码还可以写成如下,以Person3为例。
Person3.h文件:
[objc] view
plaincopy
#import <Foundation/Foundation.h>
@interface Person3 : NSObject
@property NSString *name;
@property int age;
@end
Person3.m文件:
[objc] view
plaincopy
#import "Person3.h"
@implementation Person3
//这里没有@synthesize也可以,@property在xcode4.x的某个版本后也可以生成get set方法的实现了。
@end
这样就完成了一个类 Person3 的编写,同时声明了@private作用域的成员变量_name 和 _age。
可以总结出@property @synthesize的作用如下:
@property
1. 形式如@property NSString *name; 必须写在@implementation和@end之间。
2. 作为编译器特性取代了传统的get set 方法的声明。
3. 当缺省了显示的成员变量定义和@synthesize语句时甚至可以自动声明成员变量和成员变量的get set方法的声明和实现,这种情况下声明的变量作用域是@private,变量名是自动加了下划线”_”的形式。
@synthesize
1. 形式如@synthesize name = _name;其中name是@property声明的变量,_name是真正的成员变量。
2. 作为编译器的特性取代了传统的get set方法的实现。
3. 如果写成@synthesize name;那么默认生成的变量名就是name了,一般不这么写。
@property和@synthesize让代码变得更为简洁了,同时@property还有其他功能,可以加入nonatomic retain readonly…等特性,不过这写是在学了内存管理后才涉及的范围。
下面是最基本的get set写法,以Person类为例。
Person.h文件:
[objc] view
plaincopy
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
@private
NSString * _name;
int _age;
}
//get方法
- (NSString *) name;
- (int) age;
//set方法
- (void) setName:(NSString *)name;
- (void) setAge:(int)age;
@end
Person.m文件:
[objc] view
plaincopy
#import "Person.h"
@implementation Person
//get方法实现
- (NSString *)name{
return _name;
}
- (int)age{
return _age;
}
//set方法实现
- (void)setName:(NSString *)name{
_name = name;
}
- (void)setAge:(int)age{
_age = age;
}
@end
main.m文件中:
[objc] view
plaincopy
#import <Foundation/Foundation.h>
#import "Person.h"
int main() {
Person *p1 = [[Person alloc] init];
[p1 setName:@"小红"];
[p1 setAge:13];
NSLog(@"name=%@,age=%d",[p1 name],[p1 age]);
return 0;
}
最后输出结果为:
2014-12-17 12:02:37.674ocblog4[472:14456] name=小红,age=13
如上是最基本的对类成员变量的get set方法编写。
对于set方法:
1. 用来设置变量的值,也可以起到过滤不合法数据的作用。
2. 方法以set开头,后面跟上首字母大写的成员变量名,而且注意形参名不要和成员变量名相同。
对于get方法:
1. 作用就是返回成员变量的值。
2. 一般在oc中,get方法名就和成员变量名一样,比如变量 int _age;的get方法名可以写为 –(void) age;
oc中为了好区分成员变量和一般变量,一般规定在成员变量名前加上”_”,如”_age”以示区别。
如上是最基本的get set方法的编写,但是却非常麻烦,oc于是推出了一个新的编译器特性,加入了@property和 @synthesize来让get set方法变简单。
加入@property @synthesize后的写法如下:
Person2.h文件
[objc] view
plaincopy
#import <Foundation/Foundation.h>
@interface Person2 : NSObject
{
@private
NSString *_name;
int _age;
}
@property NSString *name ;
@property int age;
@end
Person2.m文件中:
[objc] view
plaincopy
#import "Person2.h"
@implementation Person2
@synthesize name = _name;
@synthesize age = _age;
@end
可以看到@property取代了get set方法的声明,@synthesize取代了get set方法的实现,节省了代码。但这还不是最简,如上代码还可以写成如下,以Person3为例。
Person3.h文件:
[objc] view
plaincopy
#import <Foundation/Foundation.h>
@interface Person3 : NSObject
@property NSString *name;
@property int age;
@end
Person3.m文件:
[objc] view
plaincopy
#import "Person3.h"
@implementation Person3
//这里没有@synthesize也可以,@property在xcode4.x的某个版本后也可以生成get set方法的实现了。
@end
这样就完成了一个类 Person3 的编写,同时声明了@private作用域的成员变量_name 和 _age。
可以总结出@property @synthesize的作用如下:
@property
1. 形式如@property NSString *name; 必须写在@implementation和@end之间。
2. 作为编译器特性取代了传统的get set 方法的声明。
3. 当缺省了显示的成员变量定义和@synthesize语句时甚至可以自动声明成员变量和成员变量的get set方法的声明和实现,这种情况下声明的变量作用域是@private,变量名是自动加了下划线”_”的形式。
@synthesize
1. 形式如@synthesize name = _name;其中name是@property声明的变量,_name是真正的成员变量。
2. 作为编译器的特性取代了传统的get set方法的实现。
3. 如果写成@synthesize name;那么默认生成的变量名就是name了,一般不这么写。
@property和@synthesize让代码变得更为简洁了,同时@property还有其他功能,可以加入nonatomic retain readonly…等特性,不过这写是在学了内存管理后才涉及的范围。
相关文章推荐
- 黑马程序员——OC学习之成员变量的get,set方法多种实现
- 黑马程序员——OC学习小结------成员变量以及对应的set、get方法
- 黑马程序员-我的第七篇学习日记:OC成员变量名的命名规范,set方法和get方法
- 黑马程序员-OC学习笔记-点方法、成员变量作用域以及set方法和get方法@property的综合题
- OC语言学习 (三) 成员变量get/set方法和“.”语法,@proterty和@synthesize关键字
- OC语言学习 (三) 成员变量get/set方法和“.”语法,@proterty和@synthesize关键字
- 【Objective-C】04-OC对象成员变量的封装规范:get方法和set方法
- oc中成员变量的set/get方法 以及 属性点语法的使用
- JavaScript巧用Object的get和set方法实现js变量的动态监听
- Android studio 成员变量的前缀带有m,get和set方法希望不带m
- 黑马程序员——OC语言学习——Xcode开发初始化、点语法、成员变量作用域、关键字@property和@synthesize
- 黑马程序员——Objective-C学习之set方法和get方法
- 类中使用get和set方法来控制成员变量,而不将成员变量的权限设为public的原因?
- OC 10 苹果内部如何实现set和get方法 copy 多态
- c++宏实现成员变量的定义和Get,Set
- 黑马程序员_OC中的set方法和get方法
- 黑马程序员——【Java反射学习】方法的反射/成员变量的反射/构造函数的反射
- 黑马程序员---Objective-C基础学习---点方法使用和成员变量的作用域
- Android如何生成公共属性的get,set方法时,去除 成员变量的m前缀
- 黑马程序员---Objective-C基础学习---get和set方法