一,区别属性和实例变量
实例变量就是声明在接口大括号里面的变量.@public类型的实例变量直接使用->访问,
property 属性是一组设置器和访问器,属性是方法不是变量.
与类相似,属性需要声明和实现,声明在.h文件里,
@property int age;相当于:
-(void)setAge:(int)age;
-(int)age;
属性的实现:
@synthesize age=_age;//=后面给出要赋值或取值的实例变量
相当于实现了两个方法:
-(void)setAge:(int)age
{_age=age;}
-(int)age
{
return _age;
}
属性也可以设置特性,主要包括三个方面:
1,读写特性:readwrite读写属性,默认 readonly 只读属性相当于设置了getter方法,没有setter.
getter=name,setter=name设置方法名,制定getter和setter名.
2,原子性特性:atomic nonatomic 原子性和非原子性.
3,语义特性:语义属性可以通过以下关键字设置:
assign 直接赋值 适用于基本数据类型(不带*的成员变量或属性)
retain 赋值时做内存优化 适用于对象类型(带*的变量)
copy 复制一个副本 适用于特殊的对象类型(实现NSCoping协议的才能写copy);进入NSString里面会发现@interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>,这里的NSString实现了NSCopying.
点语法
一旦我们有了实例变量的设置器和访问器,就可以使用oc点语法
比如:p.age=20;等价于[p setAge:20]; 对象.属性名
如果是int a=p.age就是调用了getter方法,等价于int a=[p age];
小结
属性是一组方法,实例变量是变量.两者不同.
定义属性@property 和@synthesize. @synthesize age;等价于@synthesize age=age;
基本数据类型使用assign,对象类型使用retain,实现了NSCopying协议的对象使用copy.
- (void)setName:(NSString *)name//基本数据类型
{
_name = name;
}
- (void)setName:(NSString *)name//实现了NSCopying协议的对象使用copy 也可以使用retain,一般都使用retain
{
if (_name != name) {
[_name release];
_name = [name copy];
}
}
- (void)setName:(NSString *)name//对象类型使用retain
{
if (_name != name) {
[_name release];
_name = [name retain];
}
}
点语法和[receiver message]是等价的.
@property(retain)NSString *name;等价于
- (void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
_name = [name retain];
}
}
如果对象还是原来的对象就不做处理,如果setter里给的值不是原来有的值,就把原来的release掉,然后 在retain一下赋给_name
封装
封装:隐藏内部实现,提供接口调用. (就是把对象的状态和行为绑到一起的机制,使对象成为独立整体,并隐藏内部细节)
属性封装了实例变量
方法封装了具体实现代码
类封装了属性和方法