1、属性(@property和@Synthesize)

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

 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 方法的实现,如果方法内部操作的实例变量未定义,系统会自动生成一个 _属性名 的实例变量,但是生成的实例变量的可见度是私有的,子类不可以访问。

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

2、属性的特性

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

 1>属性的特性 - 读写性

  读写性的控制(readonly、readwrite、setter=、getter=)

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

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

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

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

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

 2> 属性的特性 - 原子性

  原子性控制(atomic、nonatomic)

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

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

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

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

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

  语义设置(assign、retain、copy)

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

   @property (nonatomic, assign) NSInteger age;

   setter 和 getter方法内部实现:

     - (void)setAge:(NSInteger)age {
    _age = age;
    }     - (NSInteger)age {
    return _age;
    }

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

   @property (nonatomic, retain) NSString *name;

   setter 和 getter方法内部实现:

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

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

   @property (nonatomic, copy) NSString *gender;

   setter 和 getter方法内部实现:

 - (void)setGender:(NSString *)gender {
if (_gender != gender) {
[_gender release];
_gender = [gender copy];
}
} - (NSString *)gender {
return [[_gender retain] autorelease];
}

3、点语法

 1> 点语法的定义

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

 2> 点语法的使用

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

   例如实例变量 _name 

   [person setName:@"Lily"];
  person.name = @"Lily";   NSString *string = [person name];
  NSString *string = person.name;

  注:点语法点的是属性名

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

4、面试题

 类之间的引入

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

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

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

iOS学习12之OC属性和点语法的更多相关文章

  1. iOS学习之Object-C语言属性和点语法

    一.属性      1.属性的声明:在.h文件中使用@property声明属性.           @property NSString *name;       2.属性的作用是生成setter以 ...

  2. iOS学习之Object-C语言属性和点语法(转载收集)

    一.属性      1.属性的声明:在.h文件中使用@property声明属性.           @property NSString *name;       2.属性的作用是生成setter以 ...

  3. IOS学习之路--OC的基础知识

    1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch框架 3.Xcode使用 -------------------- CocoaTouc ...

  4. 【IOS学习基础】OC类的相关

    几天前突然在别人的类的.m文件中看到这么一句代码:@synthesize xxxx = _xxxx; 当时愣是没理解啥意思,过后才缓过神来发现原来是把一些类的基础知识忘记了,虽然不用过多去深究以前的一 ...

  5. iOS学习17之OC内存管理

    1.内存管理的方式 1> iOS应用程序出现Crash(闪退),90%的原因是因为内存问题. 2> 内存问题 野指针异常:访问没有所有权的内存,如果想要安全的访问,必须确保空间还在 内存泄 ...

  6. iOS学习16之OC集合遍历和数组排序

    1.集合遍历 1> 遍历 集合(Collection):OC中提供的容器类:数组,字典,集合. 遍历:对集合中元素依次取出的过称叫做遍历. 三种方式:① for循环遍历: ② NSEnumera ...

  7. iOS学习10之OC类和对象

    本次是OC的第一节课,主要是学习和理解类与对象 1.面向对象 1> OOP(Object Oriented Programming)面向对象编程. 面向对象以事物为中心,完成某件事情都需要哪些事 ...

  8. iOS学习15之OC集合

    1.数组类 1> 回顾C语言数组 数组是一个有序的集合, 来存储相同数据类型的元素. 通过下标访问数组中的元素,下标从 0 开始. 2> 数组 数组是一个有序的集合,OC中的数组只能存储对 ...

  9. iOS 学习 - 12.NSMutableAttributedString 计算高度

    计算 NSMutableAttributedString 高度,必须要有两个属性 -(void)test{ UILabel *label = [[UILabel alloc]initWithFrame ...

随机推荐

  1. 10.11 cocoapods安装

    手动安装gem 手动下载 rubygem https://rubygems.org/pages/download#formats 10.11 cocoapods安装 sudo gem install ...

  2. DB2 上copy表结构及数据

    现已有一行数据,要复制为多行,每行只有两个字段值不同,db2 没有sql server的top关键字,本只想复制几次,然后update逐条数据,发现不行. 然后想到不如临时创建一张表B,插入此行数据, ...

  3. 【转载】python super的用法

    转载地址: http://blog.csdn.net/cxm19830125/article/details/20610533 super的用法是调用继承类的初始化方法,如下面的代码: class A ...

  4. 排序练习【sdut 1582】【堆排序】

    排序 Time Limit: 1000ms   Memory limit: 32678K  有疑问?点这里^_^ 题目描述 给你N(N<=100)个数,请你按照从小到大的顺序输出. 输入 输入数 ...

  5. WPF MVVM模式下实现ListView下拉显示更多内容

    在手机App中,如果有一个展示信息的列表,通常会展示很少一部分,当用户滑动到列表底部时,再加载更多内容.这样有两个好处,提高程序性能,减少网络流量.这篇博客中,将介绍如何在WPF ListView中实 ...

  6. JMockit

    [TOC] 简介 JMockit是基于JavaSE5中的java.lang.instrument包开发,内部使用ASM库来动态修改java的字节码,使得java这种静态语言可以想动态脚本语言一样动态设 ...

  7. iOS经典面试题(转)

    iOS经典面试题   前言 写这篇文章的目的是因为前两天同学想应聘iOS开发,从网上找了iOS面试题和答案让我帮忙看看.我扫了一眼,倒吸了一口冷气,仔细一看,气的发抖.整篇题目30多个没有一个答案是对 ...

  8. Linux学习笔记(12)用户和用户组管理

    越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范.在Linux中主要是通过用户配置文件来查看和修改用户信息. 1 用户信息文件 (1)用户信息文件/etc/passw ...

  9. 第一个vs2013控制台程序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. Class.forName()的作用与使用总结

    1.Class类简介: Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类 ...