iOS24-@synthesize和@dynamic

在iOS开发过程中,当我们在声明属性的时候,LLVM 编译器会自动帮我们生成成员变量,声明并实现该属性的set和get方法(protocol/category是不生成成员变量,声明属性的set和get方法,但是不实现属性的set和get方法...),简称:属性自动合成

那@dynamic有什么作用呢?
@dynamic是旨在告诉编译器,不用自动帮我合成成员变量和属性的set、get方法,我要自己写。所以该属性就没有了带下划线的成员变量,和可直接使用的set、get方法。
如下代码:
Person.h

@interface Person : NSObject

@property (nonatomic, assign, readonly) int age;

@end

Person.m

@interface Person ()
{
    int _age;
}
@end

@implementation Person

//dynamic的实现需要写在@implementation 
@dynamic age;
//由于设计成了readonly 所以就直接实现get方法即可
//-(void)setAge:(int)age{
//    _age = age;
//}
-(int)getAge{
    if (!_age) return 0;
    return _age;
}
@end

那@synthesize有什么作用呢?
@synthesize 是旨在告诉编译器,有编译器自动生成带下划线的成员变量,和可直接使用的set、get方法。
Person.h

@interface Person : NSObject

@property (nonatomic, assign) int age;

@end

Person.m

@interface Person ()
{
    int _myAge;
}
@end

@implementation Person
//不使用synthesize
//@synthesize age = _age;
//
//-(void)setAge:(int)age{
//    _age = age;
//}
//
//-(int)getAge{
//    return _age;
//}

//使用synthesize
@synthesize age = _myAge;

-(void)setAge:(int)age{
    _myAge = age;
}

-(int)getAge{
    if (!_myAge) return 0;
    return _myAge;
}
@end

总结:
(1)@synthesize由编译器自动添加默认的成员变量并生成相应的set、get方法
(2)在@implementation中实现的@synthesize age = XXX,旨在标明,实现的set和get方法操作的成员变量修改为XXX了,例如上面我写的_myAge,@synthesize age = XXX就是指在set和get方法中操作的成员变量实际上就是_myAge,此时系统没有age的存在
(3)如果在@implementation中未实现@synthesize,则默认使用系统的set和get方法和使用系统生成的成员变量,也就是
+"属性"(例如上面代码的age属性,实际默认会生成 _age)

你可能感兴趣的:(iOS24-@synthesize和@dynamic)