设置器(setter)&访问器(getter)
设置器(setter)和访问器(getter)提供了一个外界操作类内部属性的通道,但是在Object-C中,一般成员属性是私有(private)的,需要使用到设置器(setter)和访问器(getter),向外界暴露出接口.
例子:
按照java C++ C#...的写法:
在.h文件里声明
在.m文件里实现
//getter setter
-(void)setAge:(int)age;
-(int)getAge;
-(void)setAge:(int)age
{
_age = age;
}
-(int)getAge
{
return _age;
}
但是Object-C中优化了设置器(setter)和访问器(getter),使用
@property
和@synthesize代替.
例子:
.h 文件
@property int heigh;
-(void)show;
.m 文件
@synthesize heigh = _heigh;//使用_heigh等同于使用heigh
-(void)show
{
NSLog(@"%d",_heigh);
}
main函数调用
student.heigh = 10;//直接使用
NSLog(@"%d",student.heigh);
[student show];
深入探究
@property (nonatomic,strong) NSString* temp;
@property (readonly , copy) NSString *temp;
...
括号里
第一个参数表示设置只读或读写:
readwrite:表示既有getter,也有setter
readonly:表示只有getter,没有setter
nonatomic:非原子性操作,表示不考虑线程安全
atomic:原子性操作
第二个参数表示setter的权限:
strong:指定有很强的(拥有)关系到目标对象。
weak:指定有弱(non-owning)关系到目标对象。如果目的地对象销毁,属性值将自动设置为nil。(弱属性不支持OS X上的v10.6和iOS 4,使用指定取而代之)。
copy:调用原始对象的copy()方法,创建一个原始对象的副本,用于分配给新的引用。原始的对象在调用release方法。当然这个属性只用于实现了NSCopying协议的对象类型。
assign:指定使用简单的赋值的setter。这个属性是违约。 使用这个属性对于标量的类型(如NSInteger和CGRect等);
retain: 指定retain应该调用对象上的。原始的对象在调用release。在OS X v10.6和之后,您可以使用这个关键字用于内存管理方面
例子:
//属性声明
//引用型使用retain,基本数据类型使用:assign
//nonatomic 非原子性操作(引起线程安全问题);atomic 原子性操作
@property(retain,nonatomic)NSString *name;
@property(assign,nonatomic)NSInteger age;
@property(retain,nonatomic)NSString *school;
//使用属性定义,自动生成getter和setter
@synthesize name = _name;
@synthesize age = _age;
@synthesize school = _school;
注意:
使用retain修饰符在系统内部生成的如下:
//
// People.h
// Memory
//
// Created by 5016 on 13-12-4.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface People : NSObject
{
NSString* _address;
}
-(void)toString;
-(NSString*)getAddress;
@end
// // People.m // Memory // // Created by 5016 on 13-12-4. // Copyright (c) 2013年 dradon. All rights reserved. // #import "People.h" @implementation People //@property(retain,nonatomic)NSString* address //retain系统自动生成的使引用计数只加1 -(void)setAddress:(NSString*) address { if (_address != address) { [_address release]; _address = [address retain]; } } -(NSString*)getAddress { return _address; } @end
(2)使用@property 和 @synthesize 代替setter 和 getter用对象直接调用
(3)方法参数书写要注意