前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS中setter方法 、getter方法、点语法、@property

iOS中setter方法 、getter方法、点语法、@property

作者头像
xy_ss
发布2023-11-22 08:35:55
2240
发布2023-11-22 08:35:55
举报
文章被收录于专栏:浮躁的喧嚣浮躁的喧嚣

属性概念

属性是OC的一项特性,用于封装对象中的数据 OC对象通常会把其所需要的数据保存为各种属性 属性通过存取方法来访问(setter、getter)

例如:在Person类中定义了2个属性

  • 通过@property语法,编译器会自动生成一套存取方法
代码语言:javascript
复制
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property  NSString *firstName;
@property  NSString *lastName;
@end

等同于

代码语言:javascript
复制
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)setFirstName:(NSString *)firstName;
- (NSString *)firstName;
- (void)setLastName:(NSString *)lastName;
- (NSString *)lastName;
@end
  • 访问属性时,可以使用点语法,是一个编译器的特性,编译器会把“点语法”转换为对存取方法的调用,使用点语法和直接调用存取方法的效果一致。点语法在等号左边,那么编译器会自动转换为setter方法,点语法在等号右边或没有等号,那么编译器会自动转化为getter方法
代码语言:javascript
复制
 Person *per = [[Person alloc]init];
 per.firstName = @"Bob";//等同于[per setFirstName:@"Bob"];
NSString *lastName = per.lastName; //等同于NSString *lastName = [per lastName];
  • 在使用属性的过程中,编译器会自动编写访问这些属性所需要的方法,这个过程叫“自动合成”。这个过程是由编译器在编译期执行的。除了生成存取方法之外,编译期还会自动向类中添加适当的类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字
代码语言:javascript
复制
#import "Person.h"
@implementation Person
@synthesize firstName = _firstName;
@synthesize lastName = _lastName;
@end
  • 若不想让编译器自动合成存取方法,需要使用@dynamic,它会通知编译器不要自动创建属性所用的实例变量,也不要为其创建存储方法
代码语言:javascript
复制
#import "Person.h"
@implementation Person
@dynamic firstName;
@dynamic lastName;
@end
代码语言:javascript
复制
//当你在通过点语法或调用方式时程序就会崩溃,因为并没有setter、getter方法
 Person *per = [[Person alloc]init];
 per.firstName = @"Bob";
 NSString *lastName = NSString *lastName = [per lastName]; 

属性特质

属性的特质也会影响编译器所生成的存取方法,分为四类:原子性、读写权限、内存管理关键字、方法名

  • 原子性(atomic、nonatomic)
    • atomic(默认): 假设多个线程访问同一属性,那么所有不同线程上的操作都将依次顺序执行,该属性读取是安全的
    • nonatomic :如有两个线程访问同一个属性,会出现无法预料的结果,一般属性设置都是nonatomic,因为iOS中使用同步锁的开销比较大,会影响性能
  • 读写权限
    • readwrite:属性拥有getter、setter方法
    • readonly: 属性拥有getter方法
  • 内存管理关键字
    • assign:用于修饰数值类型,是简单赋值操作
    • strong:为这种属性设置新值时,设置方法会先保留新值,并释放旧值,然后再把新值设置过去
    • weak:为这种属性设置新值时,设置方法既不会保留新值,也不释放旧值,所修饰的对象销毁时,该属性会被置为nil
    • unsafe_unretained:用于修饰对象类型,所修饰的对象销毁时,该属性不会被置为nil
    • copy:设置方法并不保留新值,而是将其拷贝一份。(当属性类型为NSString时,经常用copy,因为传递给设置方法新值有可能指向一个NSMutableString类的实例,这个类是NSString的子类,若不拷贝字符串,那么设置完属性后,字符串的值就可能会在对象不知情的情况下被人更改,所有要拷贝一份不可变的字符串,确保对象中的字符串的值不会无意间变动)
  • 方法名
    • getter=:指定获取方法的方法名, @property (nonatomic,getter=isOn) BOOL on;
    • setter=:指定设置方法的方法名,这种用发不常见,此处不做太多解释
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 属性概念
  • 属性特质
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档