3.成员变量标准访问方法的实现(@property和@synthysize)

Deadly 提交于 2019-12-07 00:42:41

1、@property和@synthesize的用途:

@property、@synthesize用于自动生成类成员变量的存取方法(setter方法和getter方法)。

@property用在头文件里边,而@synthesize用于源文件里边。( xcode4.5以及以后的版本,@synthesize可以省略)

在默认情况下,当源文件里边没有实现setter和getter方法时,通过synthysize可以自动生成标准的setter和getter方法。注意:通过synthysize实现的setter和getter都是原子性访问的。多线程同时访问时,保障访问方法同时只能被一个线程访问。

如:

(1)YtsStudent.h:

#import <Foundation/Foundation.h>
@interface Student : NSObject
{
	int _age;
	int _no;
}
@property int age;
@property int no;
@end

 

(2)YtsStudent:m

#import "Student.h"
@implementation Student
@synthesize age=_age, no=_no,name;	//因为代码中没有定义成员变量name,所以系统将自动生成一个成员变量name。
@end


2、@property的声明列表主要包括:

1.声明属性的访问方法:

getter=getterName

setter=setterName

声明访问属性的设置与获取方法名。


2.声明属性的写操作权限

readwrite   -- 声明属性为读写属性,即可访问setter方法,也可以访问getter方法,与readonly互斥。

readonly    -- 声明属性为只读属性,只能访问getter方法(即只自动生成getter方法),与readwrite互斥。


3.声明写方法的实现

assign  -- 声明在setter方法中,采取直接赋值来实现设置操作。

效果如:

-(void)setName:(NSString *)_name{
    name =_name;
}


retain  -- 声明在setter方法中,需要对设置的值进行retain加1操作。

效果如:

-(void)setName:(NSString *)_name{
    if(name!=_name){
        [name release];
        name = [_name retain]
    }
}


copy    -- 指定应该使用对象的副本(深度拷贝),对原值发送一条release消息,然后再copy。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。

效果如:

-(void)setName:(NSString *)_name{
    if(name!=_name){
        [name release];
        name = [_name copy]
    }
}


注意:

(1)assign、retain、copy在使用上的区别:

如果将一个对象赋给某成员变量,那么使用retain时,当外面的对象改变,则成员变量的值也会改变;

如果使用copy,因为是拷贝产生了新的对象,所以name不会改变。

建议:

(1)使用assign : 基础数据类型(NSInteger,CGFloat)和C数据类型(int, float, double, char等等)。

(2)使用copy   : NSString。

(3)使用retain : 其他NSObject和其子类。


4. 声明方法的原子性

nonatomic   -- 设置属性的访问为非原子性访问。

在默认情况下,通过synthysize实现的setter和getter都是原子性访问的。多线程同时访问时,保障访问方法同时只能被一个线程访问。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!