美文网首页iOS Developer
@property, @sythesize,@dynamic

@property, @sythesize,@dynamic

作者: 起个名字想破头 | 来源:发表于2017-05-09 17:01 被阅读78次

    @property(属性): 声明settergetter方法
    @synthesize(合成): 根据@property声明的属性生成实例变量,并自动实现settergetter方法
    @dynamic:告诉编译器不生成实例变量、gettersetter方法

    1.最常用的方法,只使用@property

    //.h
    @interface ViewController : UITableViewController
    @property (nonatomic, copy) NSString *name;  //声明一个属性
    @end
    
    //.m
    @implementation ViewController
    //不需要显示声明@synthesize, xcode会自动调用@synthesize,根据声明的name属性,自动生成_name变量
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.name = @"";     //setter方法已自动实现
        _name = @"艾玛";  //_name已自动生成
        NSLog(@"_name:%@", self.name);  
    //打印结果_name:艾玛,说明_name 即属性name的实例变量
    }
    @end
    

    2.显示声明@synthesize

    //.h
    @interface ViewController : UITableViewController
    @property (nonatomic, copy) NSString *name;  //声明一个属性
    @end
    
    //.m
    @implementation ViewController
    @synthesize name;  //对name属性生成实例变量name, 并生成setter和getter方法
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.name = @"";     //setter方法已自动实现
        name = @"艾玛";  //_name已自动生成
        NSLog(@"self.name:%@", self.name);  
    //打印结果self.name:艾玛,说明name 即属性name的实例变量
    }
    @end
    

    3.显示声明@synthesize和不显示声明@synthesize对生成变量名的区别

    通过上面1和2的对比,会发现不声明@synthesize时,系统自动生成的变量名比属性名多了个_(下划线)

    4.显示关联实例变量和属性名称

    //.h
    @interface ViewController : UITableViewController 
    @property (nonatomic, copy) NSString *name;
    @end
    
    //.m
    @implementation ViewController
    @synthesize name = _name;  //关联实例变量_name到属性name上,即属性name生成的实例变量名为_name
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.name = @"";
        _name = @"艾玛";
        NSLog(@"self.name:%@", self.name);
    //打印结果self.name:艾玛,说明_name 即属性name的实例变量
    }
    @end
    

    5.@dynamic的使用

    //.h
    @interface ViewController : UITableViewController 
    @property (nonatomic, copy) NSString *name;
    @end
    
    //.m
    @implementation ViewController
    @dynamic name;  //通知编译器不要自动生成实例变量,setter和getter
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.name = @"";    //此处没有错误提示, 因为@property声明了setter和getter方法,只是没有实现
        _name = @"艾玛";  //这里会有错误提示,如下图所示
        NSLog(@"self.name:%@", self.name);
    }
    @end
    
    WX20170509-163855.png

    6.最后加一个小尝试,@dynamic@synthesize同时使用会怎么样?直接上图吧

    @dynamic在上.png @synthesize在上.png

    ps:在著名的《招聘一个靠谱的 iOS》的参考答案中指出,@property = ivar + getter + setter;个人感觉稍微欠妥,也可能是我理解错误,还请大家指正!

    相关文章

      网友评论

        本文标题:@property, @sythesize,@dynamic

        本文链接:https://www.haomeiwen.com/subject/drcltxtx.html