持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
前言
- 属性合成指令
@synthesize
,主动指定属性使用的成员变量名称
// 合成指令,主动指定属性使用的成员变量名称
@synthesize image = _image;
复制代码
- 一旦重写了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 使用前提 :
- 接口部分使用 @property
- 实现类部分使用 @synthesize 合成存取方法
- 只定义 "_属性名" 或 "属性名" 成员变量,
see also
iOS基础业务知识: https://blog.csdn.net/z929118967/article/details/123719790