@synthesize修饰符及@dynamic修饰符

410 阅读2分钟
@interface MyObject : NSObject
{
   NSString *string;
}

@property ()NSString *string;
@end

@implementation MyObject
@synthesize string;
//@synthesize string = _string;

/*
- (void)setString:(NSString *)string
{
   _string = string;
}

- (NSString *)string
{
   return _string;
}
*/

结论1:@synthesize修饰符的作用是合(生)成了一个string的成员变量及string的getter和setter方法的实现。

首先先不探究编译器问题,现今Xcode上@property声明的属性会自动生成一个带_的成员变量及属性getter,setter方法的声明和实现(前提是你不同时重写setter和getter方法的实现,因为同时重写这两个方法的时候是不会生成带_的成员变量的)。

而在老版本的Xcode上(上一代编译器的xcode),我们需要声明一个成员变量 + @property修饰的属性 + @synthesize修饰的属性,利用synthesize将@property修饰的属性和声明的成员变量关联,同时synthesize会合成此属性的setter和getter方法的实现。

应用:现如今你仍可使用@synthesize修饰属性,作用没变。当你编写某个协议时,你在协议中使用了一个@property修饰的属性,虽然这并不常见,但是的确可以,当某个对象遵守此协议时,编译器会提示你此前在协议中声明的属性需要用@synthesize修饰来生成成员变量及setter和getter方法的实现。

结论2:@dynamic修饰符的作用是自己编写属性的setter和setter方法的实现,避免编辑器的⚠️。

应用:当你在category中声明一个属性时,这个属性不会生成带_的成员变量,也不会合成getter和setter方法的实现,它仅仅声明了这个属性以及getter和setter方法的声明。此时你需要通过在@implementation中用@dynamic修饰此属性,告诉编译器你要自己编写此属性的setter和getter的实现。(此修饰符修饰的属性的方法必然是运行时添加的,因为category本身就是运行时添加的)