美文网首页iOS开发实用技术
iOS中@Property声明的属性同时重写getter和set

iOS中@Property声明的属性同时重写getter和set

作者: __Simon__ | 来源:发表于2017-07-21 10:17 被阅读45次

    在.h或者.m文件中用@property声明一个属性时。如果同时重写getter和setter方法,会报“该变量没有定义的错误”。如:

    Person.h

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    
    @property (nonatomic, copy) NSString * name;
    
    - (NSString *)name;
    - (void)setName:(NSString *)name;
    
    @end
    

    Person.m

    #import "Person.h"
    
    @implementation Person
    - (NSString *)name
    {
        return _name;
        // 编译器报错: Use of undeclared identifier '_name'
    }
    - (void)setName:(NSString *)name
    {
        _name = name;
    }
    @end
    

    解决办法:.m文件中需要加上:

    @synthesize name = _name;  
    

    修改之后的Person.m

    #import "Person.h"
    
    @implementation Person
    @synthesize name = _name;  
    
    - (NSString *)name
    {
        return _name;
    }
    - (void)setName:(NSString *)name
    {
        _name = name;
    }
    @end
    

    原因:因为@property默认给该属性生成gettersetter方法,当gettersetter方法同时被重写时,则系统就不会自动生成gettersetter方法了,也不会自动帮你生成_name变量,所以编译器会报“使用未定义的变量的错误”。

    声明的property如果没有特意指定synthesize的话,那么Objective-C就会自动的给你声明一个“ _ ” 开头的实例变量。
    _name访问的是name的地址。self.name访问的是namegetter。这两者并不是完全等价的,self.name是用objc_msgSend发消息,_name或者self->name则是直接访问内存地址

    相关文章

      网友评论

        本文标题:iOS中@Property声明的属性同时重写getter和set

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