iOS合成指令@synthesize的应用

ReyZhang
移动开发领域新星创作者
2023-05-12 15:02:24

前言

1、属性合成指令@synthesize,主动指定属性使用的成员变量名称

// 合成指令,主动指定属性使用的成员变量名称
@synthesize image = _image;

2、如果使用了readonly修饰了某个属性,再重写这个属性的getter方法时会报错

//readonly修饰的属性
@property (nonatomic, strong, readonly) YMChatManager *chatManager;

//.m 实现文件中重定getter方法
- (YMChatManager *)chatManager {
    if (!_chatManager) {
        _chatManager = [[YMChatManager alloc] init];
    }
    return _chatManager;
}

在这里插入图片描述
3、一旦重写了readonly属性的getter方法,编译器默认提供的_的成员变量就不存在了 ,籍此来保护变量不会被不恰当的访问,所以我们可以使用 synthesize主动指定属性使用的成员变量名称。

@synthesize chatManager = _chatManager;

这样解决了如上报错的问题

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修饰成员变量的话,重写getter方法后将不会生产带下划线的成员变量 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 合成存取方法
  • 只定义 "_属性名" 或 "属性名" 成员变量,

 

...全文
成就一亿技术人!
拼手气红包 5.00元
957 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-05-12
精选
  • 打赏
  • 举报
回复
您的问题已经帮您同步至问答, 链接: https://ask.csdn.net/questions/7943232, 请您保持关注, 如果回答有帮助解决此问题, 麻烦您动动小手给相关的回答点赞, Ada会在评论区为您更新结题状态

420

社区成员

发帖
与我相关
我的任务
社区描述
专注移动ios平台的软件开发,多年的一线研发经验,实战经验丰富,只为你呈现有价值的信息。
iosflutterandroid 技术论坛(原bbs) 山东省·青岛市
社区管理员
  • ReyZhang
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧