zoukankan      html  css  js  c++  java
  • 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,点语法是属性的另一种调用格式

  • 相关阅读:
    Jessica's Reading Problem POJ
    FatMouse and Cheese HDU
    How many ways HDU
    Humble Numbers HDU
    Doing Homework again
    Stacks of Flapjacks UVA
    Party Games UVA
    24. 两两交换链表中的节点
    面试题 03.04. 化栈为队
    999. 可以被一步捕获的棋子数
  • 原文地址:https://www.cnblogs.com/Jenaral/p/4916990.html
Copyright © 2011-2022 走看看