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. java ---线程wait/notify/sleep/yield/join

    一.线程的状态 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线 ...

  2. Struts2拦截器之FileUploadInterceptor

    一.它能做什么? 借助于这个拦截器我们可以实现文件的上传和下载功能. 理论部分: struts2的文件上传下载功能也要依赖于Apache commons-fileupload和Apache commo ...

  3. 3.2 STL中的函数对象类模板

    *: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...

  4. Javascript和Java获取各种form表单信息的简单实例

    大家都知道我们在提交form的时候用了多种input表单.可是不是每一种input表单都是很简单的用Document.getElementById的方式就可以获取到的.有一些组合的form类似于che ...

  5. Bitmap在Java中的实现和应用

    >>40亿数据排序问题 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数(在文件中至少缺失这样一个数——为什么?).在具有足够内存的情况下,如何解决该 ...

  6. Ubuntu下安装Python3.4

    转自:http://blog.sina.com.cn/s/blog_7cdaf8b60102vf2b.html 1. 通过命令行安装Python3.4,执行命令:sudo apt-get instal ...

  7. Web框架本质

    Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:utf- ...

  8. sort函数用法

    原文链接:http://blog.csdn.net/csust_acm/article/details/7326418 sort函数的用法 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己 ...

  9. PHP+Nginx环境搭配

    一.Nginx安装 nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好. u ...

  10. shell test 數值 字符串 文件比較

    數值比較 描述 n1 –eq n2 等於 n1 –gt  n2 大於 n1 –ge n2 大於等於 n1 –lt  n2 小於 n1 –le n2 小於等於 n1 –ne n2 不等於   字符串比較 ...