属性与成员变量,@synthesize,@dynamic

在 iOS 中还是在对类中成员变量进行相关的操作

// 在 Person 类的 .m 文件中 创建2个成员变量 _name 与 _age
@interface Person (){
     NSString *_name;
     int _age;
}
@end

@property 的作用

// 在 .h 文件中创建2个属性
@interface Person :NSObject 
@property NSString *name; // 此处为简单说明,没有加入 copy 等特质修饰符
@property int age; 
@end

在@property创建属性时,相当于干了以下2件事情:

  • 在编译过程中,在实现文件中根据默认规则创建了对应的实例变量,比如 name 属性会创建对应的 _name 成员变量,同上面的成员变量的表述一致
  • 同时,在编译过程中,会自动生成该属性对应的访问方法(setter,getter)

如果在属性生成实例变量时,不想按照默认方法实现,可以在实现中使用@synthesize 进行修饰,比如:

@implementation 
@synthesize  name =_myName;
@synthesize  age =_myAge;
@end

@dynamic 表示动态的,它会告诉编译器:不要为这个属性创建对应的实例变量,以及相关的存取方法. 当编译器发现没有存储方法的时候,也不会报错. 有时候会用在coreData使用数据库的时候,因为,这些属性不是实例变量,可能是来自数据库中.


  • 属性与成员变量
    在 iOS5.0以前,苹果还是使用旧的编译机制。在彼时要声明一个属性:
    1. 在interface 中要声明一个属性 propertyName
    2. 同时要在 interface 中声明一个与 propertyName 相对应的 _propertyName
  1. 在 implementation 中加入一个 @synthesize propertyName

在编译器转换为:LLVM之后,在声明属性propertyName的时候,系统会默认生成一个_propertyName的成员变量;同时,会自动生成setter和 getter 方法。

  • @synthesize,@dynamic
    使用@property 修饰的属性 AName,如果在实现里面都没有写这2个关键词,那么就是默认用了 @synthesize.
    @synthesize AName,表示自动生成了一个_AName变量,如果没有 setter 方法和 getter 方法,会自动生成
    @dynamic AName,表示需要手动生成setter 方法和 getter 方法;如果没有手动生成,编译时不会报错,在赋值取值的时候会崩溃

你可能感兴趣的:(属性与成员变量,@synthesize,@dynamic)