• OC中的@property详解


    简介:

    @property 生成了变量的get set 方法,同时指定了变量名称。

    例如@property (nonatomic,strong) NSString *name;表示生成了_name私有变量,同时生成了- (void)setName:(NSString*)aName 和 -(NSString*)name 两个方法。

    以上就是最简单的用法,但是为了深入了解@property,以下从细节方面了解@property到底做了什么。

    类名为Person

    (1)@property 只是声明get set方法,@synthesize 才是定义get set方法,@synthesize 才是定义变量_name(当然也可以定义其他名字)

          早期的OC的@property的写法如下:

    Person.h中

    @property (nonatomic,strong) NSString *name;

    Person.m中

    @synthesize name = _privateName;//名字任意指定,如果不写此行,则默变量名_name
    /*此时@synthesize 这一行等效于
      - (NSString *)name{
        return _privateName;
      }
      - (void)setName:(NSString *)aName{
        _privateName = aName;
      }
    */
    

    现在oc语言中,连@synthesize都可以省略,默认情况就是在生成的变量只是在方法器前面加上一个下划线。

    (2)@property中的readonly关键字仅仅是不声明set方法吗,那么set方法在@implementaion中到底有没有实现呢?

    通过例子验证,

    Person.h中

    @property (nonatomic,strong,readonly) NSString *name;

    Person.m中

    @synthesize name = _privateName;
    

     main函数中

    Person *p = [[Person alloc]init];
    BOOL b1 = [p respondsToSelector:@selector(name)];
    BOOL b2 = [p respondsToSelector:@selector(setName:)];
    NSLog(@"b1 = %d;b2 = %d",b1,b2);//输出b1 = 1;b2 = 0
    

     所以证明,readonly不仅仅是拒绝声明,同时拒绝定义。

    (3)在protocol中定义@property属性的后果。

    既然property只是声明,所以在protocol中用@property就打不到一般的预期效果了,编译器会提示一个warning:auto property synthesis will not synthesize property 'XXX' declared in protocol 'XXXX'。也就是说,编译器本来想帮你生成@synthesize的(为什么编译器必须帮你生成呢,因为有@property,就允许调用者使用get 和set方法啊),但是发现@Property居然在协议中,所以编译器也蒙了。 此时必须手动实现get set方法,必须手动添加对应的变量。

    personprotocol.h

    @protocol PersonProtocol <NSObject>
    @property (nonatomic,strong) NSString *name;
    @end

    person.h

    @interface Person : NSObject<PersonProtocol>
    @end

    person.m 

    @implementation Person
    {
        NSString *_privateName;
    }
    - (NSString *)name
    {
        return _privateName;
    }
    - (void)setName:(NSString *)aName
    {
        _privateName = aName;
    }
    

      此处有个小注意点:成员变量可以定义在@implementation中,虽然一般人习惯定义在extension中。

    (3)小tip:@synthesize 的写法

    一般情况下期写法为@synthesize name = _name;表示name是存取起名称,_name是具体的私有变量

    特殊写法为@synthesize name;//其等效于@synthesize name = name;即世纪私有变量名就是name

  • 相关阅读:
    面向对象编程(二)封装--构造方法,this关键字,static关键字,方法重载
    面向对象编程(四)继承,概念及super关键字,final关键字,Object类常见方法
    Python学习4--字符串
    python学习3--元祖
    数据挖掘概念与技术14--Star-Cubing
    Python学习2--列表
    数据挖掘概念与技术13--BUC
    数据挖掘概念与技术12--数据立方体的计算和多路数组聚集详解
    Python学习1--数据类型与循环要点
    数据挖掘概念与技术11--数据仓库的实现
  • 原文地址:https://www.cnblogs.com/dongfangchun/p/5301220.html
Copyright © 2020-2023  润新知