420
社区成员




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;
这样解决了如上报错的问题
objective-c下如果某属性的getter,setter
都要重写的话需要声明实例变量。
使用property的时候,单独重写任意一个方法都不会报错,但同时重写set get方法就会报错。
主要是因为:当你重写了get和set方法之后
@property默认生成的合成方法就不会起作用了
, 这也就意味着你的类不会自动生成出实例变量了,你就必须要自己声明实例变量。
@synthesize propertyName = _propertyName;
@interface Person ()
{
NSString *_name; //
int _age;
}
@synthesize iconImage = _iconImage;//与readOnly 关键字配合使用
问题: 使用readonly
修饰成员变量的话,重写getter
方法后将不会生产带下划线的成员变量
undeclared identifier '_image'
解决方法如下:@synthesize
合成指令 --主动指定属性使用的成员变量名称
@synthesize image =_image;//@synthesize 中可以定义 与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问
//@synthesize iconF = _iconF;
/**
一旦重写了readonly属性的getter方法,_的成员变量就不存在了
如果还需要使用_成员变量,则需要使用@synthesize生成对应的成员变量
*/
//- (CGRect)iconF
//{
//
//}
场景:头文件@interface
声明有时候会在属性中引用外部类或者作为参数类型
通常做法:给每个外部类添加 #import
语句
正向类声明: 在头文件使用@class
前置声明,并且在 implementation 中引入个外部类。
正向类声明编译时间更短,循环引用的机会更少;
.
语法的使用使用前提 : 使用 @property @synthesize
合成 setter 和 getter 方法; 也允许使用.语法访问属性 和 对属性赋值;
本质 : 点语法是一种简单写法, 其本质仍然是 getter 和 setter 方法;
获取属性值 : 只要对象有 getter 方法, 程序可以使用 点语法获取属性值;
设置属性值 : 只要对象有setter 方法, 程序可以使用点语法获取属性值;
Object-C 可以通过 getter setter
方法操作属性, 还可以以字符串形式间接操作属性, 该方式是 Key Value Coding (KVC)。
KVC 使用前提 :