在iOS开发过程中,对类属性的定义有好几个关键字property,synthesize,dynamic。下面简单解释一下这几个关键字

property和synthesize

关键字 property 顾名思义,表示属性。其通常的用法是在头文件.h中声明类的属性。如果这样的话就表示这个属性是类的公开属性,外部可以进行访问。早期的代码中 property 要配合关键字 synthesize 使用。property 是声明,而 synthesize 相当于是实现了getter和setter方法。举个例子:

@interface TestEntity2 : NSObject

@property(nonatomic,strong)NSString *sss;
@property(nonatomic,strong)NSString *ttt;

@end

@implementation TestEntity2

@synthesize sss = sss_p;//相当于实现了下面2个函数
@synthesize ttt;//

- (void)setSss:(NSString *)sss{
    sss_p = sss;
}

- (NSString *)sss{
    return sss_p;
}

- (void)setTtt:(NSString *)ttt{
    _ttt = sss;
}

- (NSString *)ttt{
    return _ttt;
}

@end

后来苹果进一步对编译器进行了优化。基本上用不到关键字 synthesize ,默认系统会实现类似于上面ttt变量的getter和setter函数。这样编写类就更省事了。另外,再使用 property 关键字进行声明变量的时候,编译器支持设定变量的getter和setter方法,但是如果这样进行了设定,就必须配套 sythesize 进行声明,有点类似于内部别名。否则变量根本就无法使用。比如:

@property(nonatomic,strong,getter=fetchXXX,setter=resetXXX:)NSString *xxx;
//================================================================================================
@synthesize xxx = xxx_p;
- (NSString *)fetchXXX{
    return xxx_p;
}

- (void)resetXXX:(NSString *)xxx{
    xxx_p = xxx;
}

dynamic

关键字 dynamic 的作用是告诉编译器,代码中用@dynamic修饰的属性,其getter和setter方法会在程序运行的时候或者用其他方式动态绑定,以便让编译器通过编译。典型的用法是在CoreData中的NSManagedObject。如果在NSManagedObject子类中定义了属性,而implemention中没有使用 **dynamic 关键字,这样会报一个警告:

Property 'name' requires method 'name' to be defined - use @synthesize, @dynamic or provide a method implementation in this class implementation

这个问题的关键在于NSManagedObject,如下是其声明:

NS_CLASS_AVAILABLE(10_4,3_0) NS_REQUIRES_PROPERTY_DEFINITIONS
@interface NSManagedObject : NSObject {
@private
    int32_t             _cd_rc;
    uintptr_t           _cd_stateFlags;
    ...
}

宏的作用就是必须要指定属性的 dynamic 或者 dynamic ,否则就不行。这个是利用编译属性实现的。而在类实现中加入 dynamic 后,编译警告就消失了。

总结

  • @synthesize:编译器期间,让编译器自动生成getter/setter方法。当有自定义的存或取方法时,自定义会屏蔽自动生成该方法
  • @dynamic:告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告,然后由自己实现存取方法,或者存取方法在运行时动态创建绑定:主要使用在CoreData的实现NSManagedObject子类时使用,由Core Data框架在程序运行的时动态生成子类属性
如果觉得我的文章对你有用,请随意赞赏