iOS小技能:合成指令@synthesize的应用

2,553 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

前言

  1. 属性合成指令@synthesize,主动指定属性使用的成员变量名称
// 合成指令,主动指定属性使用的成员变量名称
@synthesize image = _image;
  1. 一旦重写了readonly属性的getter方法,_的成员变量就不存在了 ,籍此来保护变量不会被不恰当的访问,所以我们可以使用 synthesize主动指定属性使用的成员变量名称。

I @synthesize的应用

1.1 同时重写getter和setter

objective-c下如果某属性的getter,setter都要重写的话需要声明实例变量。

使用property的时候,单独重写任意一个方法都不会报错,但同时重写set get方法就会报错。主要是因为当你重写了get和set方法之后@property默认生成的合成方法就不会起作用了, 这也就意味着你的类不会自动生成出实例变量了,你就必须要自己声明实例变量。


  • 声明实例变量第一种办法
@synthesize propertyName = _propertyName;
  • 声明实例变量第二种办法
@interface Person ()
{
    NSString *_name; // 
    int _age;
}

1.2 synthesize与readOnly 关键字配合使用

@synthesize iconImage = _iconImage;//与readOnly 关键字配合使用

  • 问题: 使用readonly修饰成员变量的话,将不会生产带下划线的成员变量 undeclared identifier '_image',

  • 解决方法如下:@synthesize 合成指令 --主动指定属性使用的成员变量名称

@synthesize image =_image;//@synthesize 中可以定义 与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问


  • 例子
//@synthesize iconF = _iconF;

/** 
 一旦重写了readonly属性的getter方法,_的成员变量就不存在了 
 
 如果还需要使用_成员变量,则需要使用@synthesize生成对应的成员变量
 */
//- (CGRect)iconF
//{
//    
//}

II 相关基础知识

2.1 正向类声明(前置声明)

场景:头文件@interface声明有时候会在属性中引用外部类或者作为参数类型

通常做法:给每个外部类添加 #import 语句

正向类声明: 在头文件使用@class前置声明,并且在 implementation 中引入个外部类。

正向类声明编译时间更短,循环引用的机会更少;

2.2 .语法的使用

  • 使用前提 : 使用 @property @synthesize 合成 setter 和 getter 方法; 也允许使用.语法访问属性 和 对属性赋值;

  • 本质 : 点语法是一种简单写法, 其本质仍然是 getter 和 setter 方法;

获取属性值 : 只要对象有 getter 方法, 程序可以使用 语法获取属性值;

设置属性值 : 只要对象有setter 方法, 程序可以使用语法获取属性值;

2.3 KVC

Object-C 可以通过 getter setter 方法操作属性, 还可以以字符串形式间接操作属性, 该方式是 Key Value Coding (KVC)。

KVC 使用前提 :

  1. 接口部分使用 @property
  2. 实现类部分使用 @synthesize 合成存取方法
  3. 只定义 "_属性名" 或 "属性名" 成员变量,

see also

iOS基础业务知识: https://blog.csdn.net/z929118967/article/details/123719790