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,是遵循了协议的类。

上一篇下一篇

猜你喜欢

热点阅读