简书链接:第五篇objectcproperty的理解 文章字数:980,阅读全文大约需要3分钟
官方的age
get方法 的age,和set方法的setAge 实现后就可以直接调用 obj.age=11
或者int avlue=obj.age
分别进行设置和取值. 这是开发工具的语法糖之一. 在这了解的基础上才进一步了解@property
语法糖就比较容易了 具体代码1 2 3 -(void)setAge:(int) age; -(int)age;//getAge();
@property int age
实现了get, set代码 代码看不到,但是代码依然可以用,访问属性依然是私有的.只不过实现了get
, set
方法
@property int age
实现的内部代码大概是这样的 set方法-(void)setAge:(int )agearg
和-(int) age;
get方法
@property
原先是需要在声明文件里面再写上synthesize age;
的
@property int age
等于 @property int age
+synthesize age;
@property int age;
如果属性不存在则自动创建 所以也等于 一个 age的字段的定义以及get和set的声明,以后的xcode版本还携带了实现.原来是加上synthesize
才算实现的,现在全可有可无,变成了语法糖.
可以给_age
字段自动绑定setAge
而非set_age
写法是先在声明文件定义_age
以及在声明文件 括号外面写@property int age
然后在实现写成synthesize age=_age
也就是左边代表方法右边代表真实的字段.
可以同时给多个字段赋值,如 @property int age,no,sex;
如果声明文件没有写@synthesize xxx
那么如age
会创建出一个_age的成员属性.而不是age,也就是只能self.age
调用方法,而直接_age
是访问字段.
不存在的字段也可以通过synthesize age=
创建,奇葩了 个人感觉语法糖会让人迷惑,成为面试官变态的手段.
撸代码 声明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 / 第一个oc程序 // // Created by aaa on 2018/10/6. // Copyright © 2018年 cn.qssq666. All rights reserved. // #import <Foundation/Foundation.h> @interface MyPropertie : NSObject { int _value5; } @property int value1;//没有定义synthesize 也能访问 @property int value2;//没有定义synthesize 也能访问 @property int value3;//没有定义synthesize 也能访问 @property int value4; @property int value5; -(void)test; @end
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 // // MyPropertie.m // 第一个oc程序 // // Created by aaa on 2018/10/6. // Copyright © 2018年 cn.qssq666. All rights reserved. // #import "MyPropertie.h" @implementation MyPropertie @synthesize value2; //@synthesize _valuexxx=myvalue3;//声明中没有 _valuexxx @synthesize value4=valuexxx;//不存在的字段 @synthesize value3; @synthesize value5=_value5; //@synthesize noexist;//必须有定义property 才能使用 //@synthesize myvalue3=_value3;//右边代表新的值 -(void)test{ int valueany=valuexxx; int value3= [self value3]; int value4=[self value4]; NSLog(@"value 1 %d value 2 %d value3 %d value 4 %d value 5 %d getvalue5 %d, value any %d ",self.value1,self.value2,self.value3,self.value4,_value5,self.value5,valuexxx); // value3 } @end // // MyPropertie.m // 第一个oc程序 // // Created by aaa on 2018/10/6. // Copyright © 2018年 cn.qssq666. All rights reserved. // #import "MyPropertie.h" @implementation MyPropertie @synthesize value2; //@synthesize _valuexxx=myvalue3;//声明中没有 _valuexxx @synthesize value4=valuexxx;//不存在的字段 @synthesize value3; @synthesize value5=_value5; //@synthesize noexist;//必须有定义property 才能使用 //@synthesize myvalue3=_value3;//右边代表新的值 -(void)test{ int valueany=valuexxx; int value3= [self value3]; int value4=[self value4]; NSLog(@"value 1 %d value 2 %d value3 %d value 4 %d value 5 %d getvalue5 %d, value any %d ",self.value1,self.value2,self.value3,self.value4,_value5,self.value5,valuexxx); // value3 } @end
测试代码
1 2 3 4 5 6 7 8 MyPropertie *properties= [[MyPropertie alloc] init]; properties.value1=1111; properties.value2=2222; properties.value3=33333; properties.value5=555555; properties.value4=444; [ properties test];
从结果可以得出结论,不存在的对象,也能创建出来,并进行访问.也能看出来可以给方法起别名.
思考
property
不过是语法糖而已,采取的方式和别的语言不同,java中其实get ,set都可以通过快捷键生成,另外也没必要写声明,直接写实现就ok,
c# 的语法 set; get;
也可以实现,也不需要几份代码
我觉得把对象的访问的[]
的通过工具创造语法糖,用.
或者箭头实现对象访问, 也就是改成传统语言的,然后把开发工具优化一下也许会更好.刚开始被这种语法吓到了,感觉无法理解,虽然现在也理解了,但是有点吓人的.高级用法 @property(nonatomic,weak)
https://blog.csdn.net/aa19920630/article/details/43562043