前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS - 代码Review (三)

iOS - 代码Review (三)

原创
作者头像
Wilbur-L
修改2021-10-29 17:03:16
4490
修改2021-10-29 17:03:16
举报
文章被收录于专栏:iOS底层原理

一·实例变量的属性Setter&Getter

对象内部访问属性

代码语言:javascript
复制
@interface Test : NSObject
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
@end


@implementation Test
- (NSString *)fullName {
    return [NSString stringWithFormat:@"%@ %@",self.firstName,self.latsName];
}

- (void)setFullName {
    NSArray *components = [fullName componentsSeparatedByString:@" "];
    self.firstName = [components objectAtIndex:0];
    self.lastName = [components objectAtIndex:1];
}    

@end

重写fullName的getter 和 setter 直接访问实例变量

代码语言:javascript
复制
- (NSString *)fullName {
    return [NSStringWithFormat:@"%@ %@",_firstName,_lastName];
}

- (void)setFullName {
        NSArray *components = [fullName componentsSeparatedByString:@" "];
    _firstName = [components objectAtIndex:0];
    _lastName = [components objectAtIndex:1];
}

二·区别

·由于不经过OC的方法派发,所以直接访问实例变量的速度比较快,在这种情况下,编译器所产生的代码会直接访问保存对象实例变量的那块内存

·直接访问实例变量,不会调用其setter方法,这就绕过了为相关属性所定义的内存管理语意nonatomic,copy。如果在ARC下直接访问一个声明为copy的属性,那么不会拷贝该属性,只会保留新值并且释放旧值。

·如果直接访问实例变量,不会触发KVO这样会不会出现问题,取决于这个对象的具体行为,KVO不会监听_lastName这样的变量改变

·通过属性来访问有助于排查与之相关的错误,因为可以给setter 和 getter 设断点

·在内部读取数据,应该直接通过实例变量来读取,而写入数据时,则应该通过属性来写 NSString *name = _firstName; self.lastName = @"XXX";

·在初始化方法以及dealloc中,应该直接通过实例变量来读写数据 既_firstName = nil

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一·实例变量的属性Setter&Getter
  • 二·区别
    • ·由于不经过OC的方法派发,所以直接访问实例变量的速度比较快,在这种情况下,编译器所产生的代码会直接访问保存对象实例变量的那块内存
      • ·直接访问实例变量,不会调用其setter方法,这就绕过了为相关属性所定义的内存管理语意nonatomic,copy。如果在ARC下直接访问一个声明为copy的属性,那么不会拷贝该属性,只会保留新值并且释放旧值。
        • ·如果直接访问实例变量,不会触发KVO这样会不会出现问题,取决于这个对象的具体行为,KVO不会监听_lastName这样的变量改变
          • ·通过属性来访问有助于排查与之相关的错误,因为可以给setter 和 getter 设断点
            • ·在内部读取数据,应该直接通过实例变量来读取,而写入数据时,则应该通过属性来写 NSString *name = _firstName; self.lastName = @"XXX";
              • ·在初始化方法以及dealloc中,应该直接通过实例变量来读写数据 既_firstName = nil
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档