zoukankan      html  css  js  c++  java
  • iOS学习12之OC属性和点语法

    1、属性(@property和@Synthesize)

     1> 属性是 Objective-C 2.0 定义的语法,提供 settergetter 方法的默认实现。在一定程度上简化代码,并且提高程序的安全性

     2> @property

      属性的声明:在 .h 文件中使用 @property 声明属性。

       以实例属性 _name 为例:

        属性声明:@property NSString *name;

       相当于在 @interface 中声明两个方法:

        setter方法:- (void)setName:(NSString *)name;

        getter方法:- (NSString *)name;

     3> @synthesize

      属性的实现:在 .m 文件中使用 @synthesize 实现属性

       以实例变量 _name 为例:

        属性实现:@sybthesize name = _name;

       相当于在 @implementation 中实现两个方法:

        setter方法:

          - (void)setName:(NSString *)name {
              _name = name;
          }

        getter方法:

          - (NSString *)name {
              return _name;
          }

     4> @synthesize的使用 

      @synthesize 在类的实现部分

       在 Xcode4.5以及之后的版本中,@synthesize 可以省略,只是用 @property 声明属性即可

       在默认的情况下,当没有实现 setter 和 getter 方法时, @synthesize 可以自动生成标准的 setter 和 getter 方法

     5> 属性和实例变量

      属性的作用是生成 setter 以及 getter 方法的实现,如果方法内部操作的实例变量未定义,系统会自动生成一个 _属性名实例变量,但是生成的实例变量的可见度是私有的,子类不可以访问。

      一旦同时重写settergetter 方法,并且没有实现 @synthesize,@synthesize不再生成实例变量。

    2、属性的特性

    Objective-C 提供属性的目的是为了简化程序员的编码Objective-C 为属性提供了一些关键字用以控制 setter、getter 的实现细节,这些关键字我们称之为 属性的特性(attribute)。  

     1>属性的特性 - 读写性

      读写性的控制(readonlyreadwritesetter=getter=)

      readonly:只读状态,是告诉编译器,属性值生成 getter 方法,不生成 setter 方法

      readwrite:读写状态,是告诉编译器,属性值生成 getter 方法,又生成 setter 方法既有设置器也有访问器默认的读写特性

      setter=:指定属性生成的setter方法的名字。

      getter=指定属性生成的getter方法的名字。

    1 // 1.读写性控制
    2 // readonly: 只读的,编译器只提供getter方法,没有setter方法
    3 // readwrite:可读可写的,编译器提供了setter和getter方法,默认是readwrite
    4 @property (readonly) NSString *name; // 姓名
    5 @property (readwrite) NSString *gender; // 性别
    6 
    7 // getter=getAge表示修改getter方法的方法名
    8 // setter=setage:表示修改setter方法的方法名
    9 @property (readwrite, getter=getAge, setter=setage:) NSInteger age;

     2> 属性的特性 - 原子性

      原子性控制(atomicnonatomic)

      控制属性在多线程进行访问的安全问题

      atomic原子特性,是线程安全的访问,setter、getter 方法在多线程访问下是绝对安全的。每次只允许一个线程访问属性默认是atomic属性比较常用,atomic会不停对属性做加锁解锁操作,消耗资源,降低系统性能。

      nonatomic非原子性控制,setter、getter方法内部不做线程安全控制,仅仅是普通的setter、getter方法,一般情况下使用nonatomic。

    @property (readwrite, atomic) NSString *hobby; //爱好
    @property (readwrite, nonatomic) NSString *character; //性格

     3> 属性的特性 - 语义特性

      语义设置(assignretaincopy)

      assign:一些基本数据类型(非对象类型,比如int、float等)的属性使用assign,使用assign,setter,getter方法直接赋值。

       @property (nonatomic, assign) NSInteger age;

       setter 和 getter方法内部实现:

    1     - (void)setAge:(NSInteger)age {
    2         _age = age;
    3     }
    4 
    5     - (NSInteger)age {
    6         return _age;
    7     }

      retain:一般对象作为属性(比如NSString等)的时候,并且要保留这个对象的时候。

       @property (nonatomic, retain) NSString *name;

       setter 和 getter方法内部实现:

     1   - (void)setName:(NSString *)name {
     2       if (_name != name) {
     3           [_name release];
     4           _name = [name retain];
     5       }
     6   }
     7 
     8   - (NSString *)name {
     9       return  [[_name retain] autorelease];
    10   }

      copy:一般对象需要拷贝一个对象副本的时候使用。

       @property (nonatomic, copy) NSString *gender;

       setter 和 getter方法内部实现:

     1 - (void)setGender:(NSString *)gender {
     2     if (_gender != gender) {
     3         [_gender release];
     4         _gender = [gender copy];
     5     }
     6 }
     7 
     8 - (NSString *)gender {
     9     return  [[_gender retain] autorelease];
    10 }

    3、点语法

     1> 点语法的定义

      点语法Objective-C 2.0 中定义的语法格式。提供了一种便携的属性访问方式。

     2> 点语法的使用

      只要符合系统默认的setter、getter书写格式的方法都可以使用点语法。

       例如实例变量 _name 

    1   [person setName:@"Lily"];
    2   person.name = @"Lily";
    3 
    4   NSString *string = [person name];
    5   NSString *string = person.name;

      注:点语法点的是属性名

    总结:属性是一对 setter 、getter 方法,点语法是属性的另一种调用格式

    4、面试题

     类之间的引入

      #import "..." 引入类的接口部分,容易造成循环引入

      @class 只是告诉编译器后面的字符是一个类名,并不会引入类的接口部分

      在 .h 文件中使用 @class 声明类后,要使用类中方法,需要在 .m 文件中使用 #import "..." 引入

  • 相关阅读:
    android 读中文文本文件
    Android-将RGB彩色图转换为灰度图
    andriod 获取电池的信息
    android studio快捷键
    2016年深圳市服务业占GDP比重首次突破六成
    三分钟看完北京城市(含京津冀)【总体规划2016-2050】
    CentOS 7.3.1611系统安装配置图解教程
    为何北美华裔二代三代之后长相就跟中国人不一样了?
    别看不起印度,印度比中国好多了?
    东南亚十大城市
  • 原文地址:https://www.cnblogs.com/gfxxbk/p/5308138.html
Copyright © 2011-2022 走看看