Objective-C 基础知识之 (十四):属性 Property 点语法
2015-09-25 19:58
645 查看
属性
@property@synthesize
可以通过声明属性完成对某个实例变量setter、getter方法的默认声明。
如果需要在类的外部使用实例变量,则声明对应的属性。
属性声明:
@property 属性类型 属性名字
属性的类型:
1、必须跟操作的实例变量的类型相同。
2、属性的类型决定了setteer方法的参数类型,getter方法的返回值类型。
属性的名字:
1、实例变量去掉下划线
2、决定了setter方法的名字及参数名,getter方法的名字。
例:声明实例变量和属性
NSString * _name; 实例变量
@property NSString *name; 属性
声明属性等价于声明了setter、getter方法。
-(void)setName:(NSString *)name; setter方法
- (NSString*)name; getter方法
属性不是实例变量。
属性对应的setter、getter方法中操作了某个实例变量。
一般称为:属性操作某个实例变量、属性关联某个实例变量。
属性实现:
@synthesize 属性名 = 实例变量名
等号右侧:决定了编译器在实现setter、getter方法时,方法内部使用的实例变量名。
系统默认功能:
1、属性的实现可以省略。
2、如果声明属性,编译器默认声明对应的实例变量。
属性的特性设置:
1、读写特性
readwrite 默认的,可读可写。编译器默认声明了setter,getter方法。
readonly 只读。编译器只声明了getter方法。不能进行设置。
setter 设置编译器声明的setter方法的名字。轻易不要用。
getter 设置编译器声明的getter方法的名字。一般用在BOOL类型的属性。
2、原子属性
atomic 原子性,默认的,提供线程安全保护。默认属性。
nonatomic 非原子属性,不保证安全,绝大多数情况下使用
3、语义特性 语义:表示setter方法的内部实现。
assign 理论上:所有数据类型都支持。 实际上:供基本数据类型,delegate使用。
retain 所有对象类型的数据都支持,包括系统提供的类,自定义的类。
copy 所有遵守NSCopying协议的对象都支持。
属性实现的时候,编译器默认实现了setter、getter方法。但是也可以在类的内部,自己实现setter、getter方法,不再执行编译器实现的方法。
声明name的属性:@property (nonatomic, retain) NSString * name;
实现name的setter、getter方法
-(void)setName:(NSString *)name
{
// 如果_name操作的对象 与 传入的对象 不相同
if (_name != name) {
// 将_name操作的对象的引用计数减1
[_name release];
// 将传入的对象的引用计数加1,并赋值给_name
_name = [name retain];
}
}
- (NSString *)name
{
// return [[_name retain] autorelease]; 保证安全的方法。
return _name;
}
声明gender的属性:@property(nonatomic, copy) NSString * gender;
-(void)setGender:(NSString *)gender
{
if (_gender != gender) {
[_gender release];
_gender = [gender copy];
}
}
- (NSString *)gender
{
return _gender;
}
声明number的属性:@property (nonatomic, assign) NSInteger number;
-(void)setNumber:(NSInteger)number
{
_number = number;
}
- (NSInteger)number
{
return _number;
}
点语法:
点语法的简单使用:
点语法跟属性本身没有关系,只要方法的语法符合setter、getter书写格式方法的语法,都可以使用点语法。
t.name =@"zhangsan";//赋值
在赋值运算符左侧使用.语法的本质是调用对应的setter方法。
NSLog(@"%@",[t name]);//读值
NSLog(@"%@",t.name);
在赋值运算符右侧或NSLog中使用.语法的本质是调用对应的getter方法。
@property@synthesize
可以通过声明属性完成对某个实例变量setter、getter方法的默认声明。
如果需要在类的外部使用实例变量,则声明对应的属性。
属性声明:
@property 属性类型 属性名字
属性的类型:
1、必须跟操作的实例变量的类型相同。
2、属性的类型决定了setteer方法的参数类型,getter方法的返回值类型。
属性的名字:
1、实例变量去掉下划线
2、决定了setter方法的名字及参数名,getter方法的名字。
例:声明实例变量和属性
NSString * _name; 实例变量
@property NSString *name; 属性
声明属性等价于声明了setter、getter方法。
-(void)setName:(NSString *)name; setter方法
- (NSString*)name; getter方法
属性不是实例变量。
属性对应的setter、getter方法中操作了某个实例变量。
一般称为:属性操作某个实例变量、属性关联某个实例变量。
属性实现:
@synthesize 属性名 = 实例变量名
等号右侧:决定了编译器在实现setter、getter方法时,方法内部使用的实例变量名。
系统默认功能:
1、属性的实现可以省略。
2、如果声明属性,编译器默认声明对应的实例变量。
属性的特性设置:
1、读写特性
readwrite 默认的,可读可写。编译器默认声明了setter,getter方法。
readonly 只读。编译器只声明了getter方法。不能进行设置。
setter 设置编译器声明的setter方法的名字。轻易不要用。
getter 设置编译器声明的getter方法的名字。一般用在BOOL类型的属性。
2、原子属性
atomic 原子性,默认的,提供线程安全保护。默认属性。
nonatomic 非原子属性,不保证安全,绝大多数情况下使用
3、语义特性 语义:表示setter方法的内部实现。
assign 理论上:所有数据类型都支持。 实际上:供基本数据类型,delegate使用。
retain 所有对象类型的数据都支持,包括系统提供的类,自定义的类。
copy 所有遵守NSCopying协议的对象都支持。
属性实现的时候,编译器默认实现了setter、getter方法。但是也可以在类的内部,自己实现setter、getter方法,不再执行编译器实现的方法。
声明name的属性:@property (nonatomic, retain) NSString * name;
实现name的setter、getter方法
-(void)setName:(NSString *)name
{
// 如果_name操作的对象 与 传入的对象 不相同
if (_name != name) {
// 将_name操作的对象的引用计数减1
[_name release];
// 将传入的对象的引用计数加1,并赋值给_name
_name = [name retain];
}
}
- (NSString *)name
{
// return [[_name retain] autorelease]; 保证安全的方法。
return _name;
}
声明gender的属性:@property(nonatomic, copy) NSString * gender;
-(void)setGender:(NSString *)gender
{
if (_gender != gender) {
[_gender release];
_gender = [gender copy];
}
}
- (NSString *)gender
{
return _gender;
}
声明number的属性:@property (nonatomic, assign) NSInteger number;
-(void)setNumber:(NSInteger)number
{
_number = number;
}
- (NSInteger)number
{
return _number;
}
点语法:
点语法的简单使用:
点语法跟属性本身没有关系,只要方法的语法符合setter、getter书写格式方法的语法,都可以使用点语法。
t.name =@"zhangsan";//赋值
在赋值运算符左侧使用.语法的本质是调用对应的setter方法。
NSLog(@"%@",[t name]);//读值
NSLog(@"%@",t.name);
在赋值运算符右侧或NSLog中使用.语法的本质是调用对应的getter方法。
相关文章推荐
- Objective-C 基础知识之(十三):类目、延展、协议、代理等的基本概念
- Objective-C 基础知识之(十二):NSDate
- Objective-C 基础知识之(十一):Block
- iOS经典讲解之Objective-C内存管理基础知识及内存管理黄金原则
- JDK源码阅读之Object类
- 《Objective-C入门 》 第一篇 - 合成存取器
- core foundation与objective-c之间有什么关系和区别
- Objective-C:为何使用ivar成员变量?Why would you use an ivar?[zz]
- Swift - AnyObject与Any的区别
- Swift调用Objective-C编写的代码(颜色选择器KKColorListPicker调用)
- Objective-C和JS交互
- C++ 11 - STL - 函数对象(Function Object) (中)
- Objective-C---3---NSString的常用方法
- 设计模式之工厂方法模式(代码用Objective-C展示)
- Java学习笔记【Object】
- 【投稿】打造Objective-C安全的Collection类型
- Object-C 对象初始化
- Object-C 数组(一)(NSArray)
- Object-C 字符串对象
- object-c 字符串(NSString)