• OC中的@property和@synthesize


    学习链接:https://www.jianshu.com/p/2654198f4d08 

       OC中提供两个关键字@property和@synthesize,用于提供setter和getter方法,使得代码更加简洁,在这不多做介绍,看完会用就行。 

      一般@property在.h文件中使用,@synthesize在.m文件中使用

    • 以实例属性 _name 为例:
          属性声明:@property NSString *name;
      相当于在 @interface 中声明两个方法:
          setter方法:- (void)setName:(NSString *)name;
          getter方法:- (NSString *)name;

    • 属性的实现:在 .m 文件中使用 @synthesize 实现属性
         以实例变量 _name 为例:
         属性实现:@sybthesize name = _name;
         相当于在 @implementation 中实现两个方法

      原理其实就是系统会自动生成一个_属性名的变量,就比如
    -(void)setName:(NSString *)name { 
          _name = name;      }
    -(NSString *)name {       
             return _name;      }

      值得注意的是_属性名这个变量是私有的,如果重写了setter和getter变不再会自动生成了

      下面还有一些控制属性的特性:

    • 读写性 
      读写性的控制(readonly、readwrite、setter=、getter=)
        readonly:只读状态,是告诉编译器,属性值生成 getter 方法,不生成 setter 方法。
        readwrite:读写状态,是告诉编译器,属性值生成 getter 方法,又生成 setter 方法,既有设置器,也有访问器,默认的读写特性。
        setter=:指定属性生成的setter方法的名字。
        getter=:指定属性生成的getter方法的名字。

    • 原子性
      原子性控制(atomic、nonatomic)
      控制属性在多线程进行访问的安全问题。
        atomic:原子特性,是线程安全的访问,setter、getter 方法在多线程访问下是绝对安全的。每次只允许一个线程访问属性,默认是atomic,属性比较常用,atomic会不停对属性做加锁解锁操作,消耗资源,降低系统性能。
        nonatomic:非原子性控制,setter、getter方法内部不做线程安全控制,仅仅是普通的setter、getter方法,一般情况下使用nonatomic。

    • 语意特性
       
    语义设置(assign、retain、copy)
     assign:一些基本数据类型(非对象类型,比如int、float等)的属性使用assign,使用assign,setter,getter方法直接赋值。
        
    @property (nonatomic, assign) NSInteger age;

    retain:一般对象作为属性(比如NSString等)的时候,并且要保留这个对象的时候,已修改全修改,跟strong差不多。
    @property (nonatomic, retain) NSString *name;

    -(void)setName:(NSString *)name {
          if (_name != name) {
              [_name release];
              _name = [name retain];
          }
      }
    
      - (NSString *)name {
          return  [[_name retain] autorelease];
      }

    copy:一般对象需要拷贝一个对象副本的时候使用,拷贝了一份新的,原来的修改,新的不会修改。
    @property (nonatomic, copy) NSString *gender;

    -(void)setGender:(NSString *)gender {
        if (_gender != gender) {
            [_gender release];
            _gender = [gender copy];
        }
    }
    
    -(NSString *)gender {
        return  [[_gender retain] autorelease];
    }
  • 相关阅读:
    Python:数据驱动测试DDT
    python-日志模块logging
    《测试架构师修炼之道》测试点
    Pycharm中使用Github
    MySql视图及存储过程
    MySQL游标和触发器
    MySQL事务处理及字符集和校对顺序
    MySQL安全管理、数据库维护及改善性能
    mysql-数据类型
    mysql-日期时间函数
  • 原文地址:https://www.cnblogs.com/caijiaming/p/13808992.html
Copyright © 2020-2023  润新知