要彻底搞清楚这两个关键字需弄明白成员变量和成员属性的区别;
成员变量,OC1.0的时候我们为interface同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量
@interface ViewController : UIViewController
{
// 成员变量
@public
NSString* publicString;
@protected
NSString* protectedString;
@private
NSString* privateString;
}
@end
OC2.0及以后,@property它将自动创建一个以下划线开头的实例变量。因此,在这个版本中,我们不再为interface声明实例变量。变成我们常见的形式
@interface MyViewController :UIViewController
@property (nonatomic, strong) UIButton *myButton;
@end
我们会在项目中看见这种写法,@synthesize就是告诉编译器给我们自动生成setter/getter方法;你还可以指定属性等于指定的变量,如:@synthesize myButton(属性) = xxx(变量),这就是为什么要先将变量和属性的区别了;
@interface ViewController ()
@property (nonatomic, strong) UIButton *myButton;
@end
@implementation ViewController
@synthesize myButton;
以之相反的@dynamic就是告诉编译器setter/getter由我们自己生成,不需要编译器帮忙生成,一般当一个类实现协议,但这个协议里面有一个属性没有实现就会报错警告,此时用@dynamic就可以告诉编译器这个属性我们自己处理。
网友评论