iOS属性property及其他关键字
2019-04-21 本文已影响0人
鹏雨燕
类声明属性时@property()..会自动生成属性的get和setter方法,并且新建一个实例var = _var;
@sythesize是属性的默认情况,即通过@property声明,则会新建一个实例,并检查set和get方法,如果没写,会自动帮你填充。
@dynamic意思是set和get方法由用户自己实现,编译器不检查,而且也不会新建实例,有什么应用场景?不需要系统帮你实现get,set方法的时候
在iOS的extention声明一个属性时,由于extention是一个.h头文件,更加不会主动生成成员变量和set,get,事实上没有地方实现成员变量的get和set方法。
category扩展实现不允许成员变量的生成,扩展是在运行时才会执行,新增成员变量会打乱内存结构导致crash,但是可以通过内存关联实现属性扩展如下面示例:
// MyView+MyCategory.h
#import "MyView.h"
@interface MyView (MyCategory)
// 在 Category 中定义属性:
@property (assign, nonatomic) int32_t viewIndex;
@end
// MyView+MyCategory.m
#import "MyView+MyCategory.h"
#import <objc/runtime.h>
// 标记属性的 Key:
static const void *ViewIndexKey = &ViewIndexKey;
@implementation MyView (MyCategory)
@dynamic viewIndex;
- (void)setViewIndex:(int32_t)viewIndex {
objc_setAssociatedObject(self, ViewIndexKey, @(viewIndex), OBJC_ASSOCIATION_ASSIGN);
}
- (int32_t)viewIndex {
return [objc_getAssociatedObject(self, ViewIndexKey) intValue];
}
@end
protocol实现成员变量的增加需要加@sythesize生成一个成员变量才能用。
顺便提一句,代理delegate,是遵循了协议的类。