博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3.成员变量标准访问方法的实现(@property和@synthysize)
阅读量:6693 次
发布时间:2019-06-25

本文共 1675 字,大约阅读时间需要 5 分钟。

hot3.png

1、@property和@synthesize的用途:

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

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

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

如:

(1)YtsStudent.h:

#import 
@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都是原子性访问的。多线程同时访问时,保障访问方法同时只能被一个线程访问。

转载于:https://my.oschina.net/niweiliang/blog/188652

你可能感兴趣的文章
vue作用域插槽示例
查看>>
Apache Ignite 学习笔记(四): Ignite缓存冗余备份策略
查看>>
uwsgi service 设置
查看>>
matlab x~=0
查看>>
使用线性渐变写一个歌词播放效果
查看>>
PowerDesigner最基础的使用方法入门学习
查看>>
golang -- 字符串就地取反
查看>>
Leetcode题目:Count and Say
查看>>
Linux 进程管理子系统
查看>>
MyEclipse快捷键大全
查看>>
ethereum/EIPs-1078 Universal login / signup using ENS subdomains
查看>>
android studio偏好设置
查看>>
本周学习小结(18/03 - 24/03)
查看>>
what difference between libfm and libffm
查看>>
NUC1013 阶乘结果末尾有多少零【分析思维】
查看>>
HDU1200 POJ2039 ZOJ2208 UVALive3084 To and Fro【密码】
查看>>
UVALive2389 ZOJ1078 Palindrom Numbers【回文+进制】
查看>>
Qt之二进制兼容
查看>>
[转]GCD介绍
查看>>
转:数据库三大范式
查看>>