属性,Property,点语法

属性是OC2.0之后出来的新的语法, 用来替代setter和getter方法, 使用属性可以快速创建setter和getter方法的声明, setter和getter的实现, 另外还添加了对实例变量操作的安全处理
@property (nonatomic, retain) NSString *name;//暂时为retain
@property (nonatomic, retain) NSString *genter;//暂时为retain
@property (nonatomic) NSInteger age;
@property (nonatomic) CGFloat height;
@property (nonatomic) CGFloat weight;
@property用来定义属性, NSString *属性的类型(和实例类型名相同)name属性名(和实例变量名相同)
切记:@property只是自动声明setter以及getter方法声明
属性的特性:
1 读写特性:
 1)readonly:告诉编译器, 属性在自动生成方法时只会生成getter方法, 不会生成setter方法
 2)readwrite:告诉编译器, 属性在自动生成方法时即会生成getter方法, 也会生成setter方法,系统默认的读写特性
 3)setter = aa 告诉编译器, 属性在自动生成setter方法时,setter方法的方法名为指定的aa, 不采用默认的
 4)gettter = bb 告诉编译器, 属性在自动生成getter方法时,getter方法的方法名为指定的bb, 不采用默认的
2 原子性特性:
 1)nonatomic:非原子性, 不保证线程安全
 因为对于setter以及getter方法的使用, 比较繁琐, 在一段时间内可能多次访问, 所以使用atomic会非常消耗系统的资源, 降低程序的执行效率, 使用nonatomic虽然不保证线程安全, 但是使用一般情况下都是安全的, 所以对于原子特性, 使用nonatomic
 2)atomic:原子特性, 保证线程安全, 内部做了安全处理(加锁与解锁)
3 语义特性
 1)assign:直接赋值, 使用针对于基本数据类型, 也可针对于对象类型, 系统默认的语义特性
 2)copy:针对于对象类型, 并且要服从NSCopying协议的对象才可以, 会复制出一个新的对象, 拥有新的对象所有权, (引用计数+1)(先暂时这么理解)
 3)retain:针对于对象类型, 会造成对象的引用计数+1;
setter 方法的作用:为单一的实例变量赋值;
setter 方法规范写法:-号方法, 无返回值, 名字以set开头 + 要设置的变量的实例变量名(首字母大写) :(setter方法有且只有一个参数) + 参数的类型(和实例变量类型相同) + 参数名(和实例变量名相同)
getter 方法的作用:获取单一的实例变量的值;
getter 方法规范写法:-号方法, 有返回值(返回值类型和实例变量类型相同) 方法名直接和实例变量名相同 无参数
@synthesize属性的实现部分, 实现属性自动生成的setter和getter方法
 name属性名, 指定要实现哪一个属性生成的setter和getter方法
 _name, 指定setter和getter方法内部所要操作的实例变量
若指定的实例变量没有定义, 系统会自动生成指定的实例变量, 但是生成的实例变量是私有的, 子类不能直接访问
 若实例变量想让子类访问, 先在.h文件必须定义实例变量
 若未指定setter和getter内部所要访问的实例变量时, 系统自动生成一个和属性名一样的实例变量
 若对于setter和getter方法, 若我们实现了, 则系统就不会再自动生成
 若在.m文件中, 未通过@snythesize对属性进行合成, 系统回自动合成, 只不过此时系统默认的setter和getter方法内部所操作的实例变量时_属性名
 若将@snythesize省略, 并且我们自己实现setter和getter方法时, 系统既不会生成对应的setter和getter, 还有实例变量
1 当把语义特性声明为assign时, setter和getter方法内部实现
 - (void)setName:(NSString *)name {
    _name = name;
 }
 - (NSString *)name {
    return _name;
 }
 2 当把语义特性声明为retain时, setter和getter方法内部实现
 - (void)setName:(NSString *)name {
 if (_name != name) {
    [_name release];
 _name = [name retain];
 }
 }
 - (NSString *)name {
    return [[_name retain] autorelease];
 }
 3 当把语义特性声明为copy时, setter和getter方法内部实现
 - (void)setName:(NSString *)name {
 if (_name != name) {
 [_name release];
 _name = [name copy];
 }
 }
 - (NSString *)name {
 return [[_name retain] autorelease];
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值