实例变量(instance var)与属性(@property)的关系

Objective-C 2.0之后,声明一个@property name自动产生一个实例变量,名为_name,因此省去实例变量和属性重复输入的麻烦。而使用@synthesize可以改变_name名称。@property和@synthesize不必成对出现。

@property name:指示编译器自动合成setter和getter方法,setter方法名即setName,而getter方法名即name。@property后面的关键字,例如readonly、readwrite、retain、nonatomic、copy等,指定如何生产setter和getter方法。这些属性修饰符大致分为四类:

(1)可变性 (Mutability)

- readonly,只生成getter方法,没有setter方法

- readwrite,是默认的

(2)内存管理 (Memory management)

- assign,是默认的,适用于内置类型(int, bool等)或者代理对象(delegate),不存在引用计数机制。

- retain,只适用于对象,不适用内置类型(int, bool等)。当使用setter方法时,将对象的引用计数加1。

- copy,使用setter方法时,拷贝一个对象,即在内存中产生新对象,而不是把原来的对象的引用计数加1。显然,复制出来的新对象的引用计数为1。

(3)并发性 (Concurrency)

- nonatomic,访问属性非原子性,一般单线程声明nonatomic,考虑到速度问题。多线程程序就不要使用nonatomic。

- atomic,访问属性原子性,与nonatomic相反。

(4)API控制 (API control)

- getter=newGetterName,指定新的getter方法名,一般重新改写BOOL实例变量的getter名。例如

  1. @property (getter=isFinished) BOOL finished;

- setter=,指定新的setter方法名。

@synthesize name = custom_name:将实例变量_name名称换成custom_name

@synthesize name:将实例变量_name名称换成name

注意:@synthesize不会影响@property产生的setter和getter方法的名称

setter和getter方法什么时候被调用?

例如,属性声明如下

  1. @interface Person : NSObject
  2. @property NSString *firstName; // atomic, assign, readwrite (default)
  3. @end

有2种方法:

(1)显示调用(发送消息)

  1. [somePerson firstName]; // Call getter method
  2. [somePerson setFirstName: @"Johnny"]; // Call setter method

(2)隐式调用(点语法)

  1. NSString *firstName = somePerson.firstName; // Call getter method
  2. somePerson.firstName = @"Johnny"; // Call setter method

如果在实例方法中直接使用实例变量,则不会调用对应的setter和getter方法,例如

  1. - (void)someMethod
  2. {
  3. NSString *myString = _firstName; // Won't call getter method
  4. _firstName = @"A string"; // Won't call setter method
  5. }

显然直接使用实例变量会有风险,如内存泄露、循环引用等。最好访问实例变量,都通过@property产生的setter和getter方法。

OC 实例变量(instance var)与属性(@property)的关系 isa指针的更多相关文章

  1. OC 实例变量(Instance Var)和成员变量(member var)区别

    摘要:  Objective-C  引入了“实例变量"的概念,但同时, 也经常出现 “成员变量”的声音. 到底什么是实例变量,什么是成员变量,二者的区别是什么呢? 今天查看apple 的官方 ...

  2. oc实例变量初始化方法

    1 使用实例setter方法 默认初始化方法 + setName:xxx setAge:xxx 2 使用实例功能类方法,默认初始化方法 + setName:xxx age:xxx3 使用实例初始化方法 ...

  3. OC:属性的内部实现原理、dealloc内释放实例变量、便利构造器方法的实现原理、collection的内存管理

    代码: // // main.m #import <Foundation/Foundation.h> #import "Person.h" #import " ...

  4. iOS 成员变量,实例变量,属性变量的区别,联系

    在ios第一版中: 我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: 注意:(这个是以前的用法) @interface MyV ...

  5. iOS中的成员变量,实例变量,属性变量

    在ios第一版中: 我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: 注意:(这个是以前的用法) @interface MyV ...

  6. Object的属性property详细解释(自动生成成员变量)

    类Class中的属性property: 在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interfac ...

  7. objective-C学习笔记(三)数据成员:属性与实例变量

    类型成员 Type Member 结构体 struct 的成员很简单,只有变量. 类的成员就很多了: 数据成员 data member 描述对象(本讲重点) · 实例变量  instance vari ...

  8. ios -- 成员变量、实例变量与属性的区别

      最近打开手机就会被胡歌主演的<猎场>刷屏,这剧我也一直在追,剧中的郑秋冬,因为传销入狱五年,却在狱中拜得名师孙漂亮(孙红雷),苦学HR,并学习了心理学,成功收获两样法宝.出狱后因为怕受 ...

  9. IOS的属性和实例变量

    实际上,@property声明的是属性,并不是实例变量.但是编译器会根据属性,自动生成实例变量,和对应的access方法.所以已经在interface里声明了@property,就不再需要在imple ...

随机推荐

  1. require或include相对路径多层嵌套引发的问题

    require或include相对路径多层嵌套引发的问题   php中require/include 包含相对路径的解决办法 在PHP中require,include一个文件时,大都是用相对路径,是个 ...

  2. change the walltime for currently running PBS job (qalter pbs)

    qalter jobid -l walltime=X e.g.qalter 377470.manager -l walltime=2222:00:00qalter: Unauthorized Requ ...

  3. [HDOJ5935]Car(精度,数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5935 题意:有个老司机在开车, 开车过程中车的速度是不减的. 交警记录了这个老司机在nn个时间点的位置 ...

  4. 网上搜集的jq常用代码

    1. 设置IE特有的功能:  if ($.browser.msie) { //do something... } 2. 使用jQuery来代替一个元素: $('#thatdiv').replaceWi ...

  5. 这只是一篇用Markdown写的随记,就是熟悉熟悉MarkDown而已

    这几天的随想 今天是八月十一号了,来到公司实习已经第八天了,包块周末的话就是十二天了,我在这十二天里干了什么,转眼半个月就过去了 马上就要开学了,这个暑假干了些什么,单词单词也没背多少,之前七月回家有 ...

  6. iOS - NSURLSession 网络请求

    前言 NS_CLASS_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0) @interface NSURLSession : NSObject @available(iOS ...

  7. QQServer_update

    import java.awt.*; import javax.swing.*; import java.net.*; import java.io.*; import java.awt.event. ...

  8. python把元组组合成字典

    list=((","16g"), (","32g"), (","red"), (","bl ...

  9. oracle 10g正则表达式 REGEXP_LIKE 用法

    ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...

  10. Python学习笔记4—列表

    列表定义 >>> a=['] >>> type(a) <type 'list'> >>> bool(a) #列表有值,则为true T ...