• setter getter 属性 点语法


    转载自:http://liuyafang.blog.51cto.com/8837978/1543715

    什么时setter,getter,

    • 在OC里, 为实例变量赋zhi的方法称作setter(设置器)

    • 读取实例变量值的方法称作getter(访问器)

    • 我们之前写的那些赋值取值的方法都可以称作setter和getter

    setter、getter的书写格式

    • OC里规定里setter和getter的书写格式

    • 如果一个实例变量是 int age; 或者int_age;

    • setter的书写格式如下 - (void)setAge:(int)age;即set+首字母大写的实例变量名(忽略下划线)

    • getter的书写格式如下, -(int)age; 即返回值类型与变量类型一致,方法名与实例变量名相同(忽略下划线)

    setter、getter与实例变量的关系

    • 无论setter还是getter内部操作的是实例变量

    • 每一个实例变量都需要一对setter和getter方法

    属性的定义

    • 属性都声明:使用@property声明属性(例如:@property NSString*name;)

    • 相当于@interface中声明里两个方法

    • - (void)setName:(NSString *)name;

    • -(NSString *)name;

    属性的实现

    • 属性的实现:使用@synthesize实现属性(例如 :@synthesize name = _name)

    • 相当于@implementtation实现里

    • - (void)setName:(NSString *)name;

    • - (NSString *)name;

    属性的属性

    • Objective-C提供属性的的是为了简化程序员编码 

    • 为属性提供了一些关键字用以控制setter、getter的实现细节 

    • 这些关键字我们称为属性的属性(attribute) 

    • 一共3大类attribute。 

    属性的属性共有三大类

    第一类

    •      1。 读写性控制(readonly,readwrite,setter,getter)

    • 如果读写性控制的关键字是readonly,是告诉编译器,只声明getter方法(无setter方法)

                   例如;@property(readonly)NSString *name;  等价于  - (NSString *)name;

    • 如果是readwrite ,告诉编译器,即声明setter有声明getter

                   例如:@property(readwrite)NSString *name;

                             等价于 - (NSString *)name;

                                       - (void)setName:(NSString *)name;

    • readwrite是读写性控制的默认设置

    第二类

    • 2.原子性控制(nonatomic、atomic)

    • 如果原子性控制的关键字是atomic。setter、getter方法在多线程访问下是绝对安全的,即setter、getter内部做了多线程访问处理,原子性控制的默认设置是atomic;

    • 如果原子性控制的关键字是nonatomic,setter、getter方法内部不会做多线程访问处理,仅仅是普通多setter、getter方法

         。。

    • 程序开发过程中,setter、getter处处都在用,如果使用atomic,需要不断的对setter、getter加锁解锁以保证线程访问安全,会很占用系统资源,降低系统性能。

    • 同城设置为nonatomic, 某些属性需要线程安全对时候,才定义为atomic

                   例如:@property(readwrite , nonatomic)NSString *name;

                             等价于;- (NSString *)name;

                                            - (void)setName:(NSString *)name;

    第三类

    •   3.语义设置(assign,retain,copy)

    • 如果语义设置对关键字是assign。setter、getter内部实现是直接赋值,

              例如:@property(nonatomic , assign)NSString *name;

                             - (void)setName:(NSString *)name

                             {

                                      _name = name;

                               }

                             -(NSString *)name

                             {

                                       return   _name;

                                    }

    • 如果语义设置的关键字是retain。setter、getter的内部实现会做内存优化     

              例如:@property(nonatomic,retain)NSString *name;

              - (void)setName:(NSString *)name

              { if(_name != name){

                   [_name release];

                   _name = [name retain];

                             }

                   }

              - (NSString *)name{

                  return [[_name retain]autorelease];

                   }

    • 如果语义设置的关键字是copy,setter、getter的内部实现也会做内存优化

                   例如 @porperty(nonatomic , copy)NSString *name;

              - (void)setName:(NSString *)name

              {

                  if (_name != name) {

                      [_name release];

                      _name = [name retain];

                  }

              }

              - (NSString *)name

              {

                  return [[_name retain] autorelease];

              }

    属性需要注意的是

    • 如果属性是非对象类型(比如int,float等)属性等语义设置只用assign

    • 如果属性是对象类型(比如NSString,NSArray等)属性等语义设置使用retain

    • 如果属性是对象类型,并且想得到参数的copy,使用copy关键字

    -点语法的使用

    • 凡事符合系统默认setter、getter书写格式的方法,都可以使用点语法

              例如:[person setName:@“zhangsan”];

              可以等价写成 person.name = @“zhangsan”;

              NSString *name = [person name];

              可以等价写成NSString *name = person.name;

    • 属性是一对getter、setterfangfa,点语法是属性的另一种调用格式

  • 相关阅读:
    Solution -「USACO 2020.12 P」Spaceship
    Solution -「USACO 2020.12 P」Sleeping Cows
    Solution -「HDU #6566」The Hanged Man
    Solution -「JOISC 2019」「LOJ #3036」指定城市
    HTML5 之required修改默认提示
    Js 之内容加密
    小程序 之生成接口签名
    Js 之Api接口验签
    View.js 之加载动画
    View.js 之跳转动画
  • 原文地址:https://www.cnblogs.com/Jenaral/p/4916990.html
Copyright © 2020-2023  润新知