OC之@property和@synthesize

Wesley13
• 阅读 671

在OC中经常使用get和set方法,但是当成员变量太多的时候,就要敲很多行get和set方法。在xcode4.4之前,为了简洁代码,可以使用@property声明get和set方法:

@property int age;

就相当于:

- (void)setAge:(int)age;

-(int)age;

后面代码可以就当作正常写了get和set方法一样去调用- (void)setAge:intage;和-(int)age;。

假设_age为成员变量,当然也可以使用@synthesize去代替写出get和set方法的实现:

@synthesize age = _age;

就相当于:

-(void)setAge : (int)age

{

_age = age;

};

- (int)age

{

retrun _age;

}

【备注】也可以同时声明与实现多个get和set方法,格式为:

@property int age1,age2,age3;

@synthesize age1 = _age1,age2 =_age2;

当上述代码中的成员变量_age1和_age2不存在时,系统可自动生成@private类型的_age1和_age2成员变量,代码仍可正常运行。

对于实现时只写@synthesize age,但类中同时存在成员变量age和_age,则默认情况下会访问与age名字一样的成员变量,即访问age而不是_age。

在xcode4.4之后,@property的功能更加强大,它同时具有了@synthesize的功能,比如@property int age;具有如下三个功能:

(1) 生成_age成员变量的get和set方法的声明

(2) 生成_age成员变量的get和set方法的实现

(3) 生成一个名为_age的成员变量

@property的参数:

(1) set方法内存管理相关的参数

(a)  retain:release旧值,retain新值(适用于OC对象类型)

(b) assign:直接赋值(默认,适用于非OC对象类型),常用在BOOL、int等基本数据类型。

(c)  copy:release旧值,copy新值,常用在NSString对象

(2) 是否要生成set方法

(a)  readwriter:同时生成set和get方法的声明和实现

(b) readonly:只生成get的声明和实现

(3) 多线程管理

(a)  nonatomic:性能高(一般都是使用这个)

(b) atomic:性能低(默认)

(4) set和get方法的名称

(a)  setter:决定了set方法的名称,一定要加个冒号“:“

(b) getter:决定了get方法的名称,不要加冒号

(5) strong和weak

(a) strong:用于一般对象

(b) weak:用于UI控件

版权声明:本文为博主原创文章,未经博主允许不得转载。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
CMake命令之set_property和get_property
set\_property:在指定域中设置一个命名属性set\_property(<GLOBAL                           |               DIRECTORY\dir\                  |               TARGET   \target1\targ
Stella981 Stella981
3年前
Lua基础(对象)
:和.区别.   stu{id100,name"Tom",age21}成员变量   function stu.toString()成员函数    return stu.id .. stu.name .. stu.age   endprint(stu
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
OC语言@property @synthesize和id
OC语言@property @synthesize(http://my.oschina.net/u/2618113)和id一、@property @synthesize(http://my.oschina.net/u/2618113)关键字注意:这两个关键字是编译器特性,让xcode可以自动生成getter和setter的
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
3年前
Hibernate中get()和load()的区别
Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load(),来看一下这两种方式的区别。1\.get()使用get()来根据ID进行单条查询:Userusersession.get(User.class,"1");当get()方法被调用的时候就会立即发出SQL语句:Hiberna
Wesley13 Wesley13
3年前
38条技巧优化PHP代码,来复习总结下吧
1、如果一个方法能被静态,那就声明它为静态的,速度可提高1/4;2、echo的效率高于print,因为echo没有返回值,print返回一个整型;3、在循环之前设置循环的最大次数,而非在在循环中;4、销毁变量去释放内存,特别是大的数组;5、避免使用像\_\_get,\_\_set,\_\_autoload等魔术方法