很多人在初学移动开发的时候会对object-c中的合成存取方法感到疑惑,此处尝试为看到本文有缘人答疑解惑,鄙人才疏学浅,难免有疏漏谬误之处,热烈欢迎诸位看官拍砖指点.

1.合成存取方法:

OC为增加开发效率,从2.0之后不需要程序员自己来写成员变量的setter和getter方法,取而代之的是自动合成的setter和getter。

系统自动合成setter和getter需要2步:

  1. 在类interface部分用@propert指令定义属性。
  2. 在实现部分用@synthesize指令声明属性。

属性的定义:如果为某个类定义了一个成员变量并提供了相应地setter、getter方法,那么可称为定义了一个属性(property)。

使用@synthesize的语法格式如下:

@synthesize 属性名 [=成员变量名];

如果@synthesize后没有属性,如果没有指定成员变量名,成员变量默认与合成的getter方法同名。 这里需要注意的是,此行为可能导致莫名其妙的错误,请看代码:

  1. //接口部分
    #import <Foundation/Foundation.h>
  2.  
  3. @interface setGet : NSObject
  4. @property (setter=setAge:) int age;
  5. @property NSString *name;
  6. @end
  1. //实现部分
    #import "setGet.h"
  2.  
  3. @implementation setGet
  4. @synthesize age,name;
  5. - (void) setAge:(int)age
  6. {
  7. NSLog(@"Call setter method!");
  8. self.age=age;
  9. }
  10. @end
  1. //主程序部分
    #import <Foundation/Foundation.h>
  2. #import "setGet.h"
  3. int main(int argc, const char * argv[]) {
  4. @autoreleasepool {
  5. setGet* test=[[setGet alloc] init];
  6. test.age=;
  7. NSLog(@"The age is:%d",test.age);
  8. }
  9. return ;
  10. }

在以上测试代码中,将会无限输出:Call setter method!

具体原因不言自明,正因为没有在@synthesize部分对属性名指定成员变量名,导致了程序产生了递归。

只要在实现部分稍作改动,程序便正常输出:

  1. //实现部分修改
  2. #import "setGet.h"
  3.  
  4. @implementation setGet
  5. @synthesize age=whatever,name;
  6. - (void) setAge:(int)age
  7. {
  8. NSLog(@"Call setter method!");
  9. self->whatever=age;
  10. // or :whatever=age;
  11.  
  12. }
  13. @end

不过OC规范一般是下划线开头来定义成员变量:_age。

补充一句:

“.”的用法仅限于getter和setter方法,用于左值则调用setter方法,用于右值则调用getter方法(如主程序中的NSLog中算是右值)。

Object-c中的属性和成员变量的关系详解的更多相关文章

  1. OC中在.h和.m中声明的属性和成员变量有何区别?

    相比Swift而言,OC规矩太多. 差不多,.h中声明的属性和成员变量均可以在子类中访问到.而.m则不可.而属性其实也就是成员变量的一种简写,其内部自动包含了getter和setter方法. 如图:V ...

  2. struts2 - View页面中获取Action的成员变量

    struts2 - View页面中获取Action的成员变量 2016年03月02日 11:04:44 IT男青年 阅读数:1074   View页面中获取Action的成员变量 按照Struts的设 ...

  3. Objective-C的属性和成员变量用法及关系浅析

    在使用Objective-C语言进行了一段时间的iOS开发之后,发现自己的语言基础相对薄弱,于是开始弥补自己的短处.我发现在用过一种语言之后,再回过头来看它的很多原理会发现有更加深刻的理解.下面就对一 ...

  4. IOS学习5——属性与成员变量

    [转]iOS中属性与成员变量的区别 ios中属性修饰符的作用 1. 属性用property声明 2. 简而言之,对于目前的ios开发,属性和成员变量的区别,完全可以不管. 3. 这个是历史原因造成的. ...

  5. 让Category支持添加属性与成员变量【转载】

    Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数.但是Category不允许为已有的类添加新的属性或者成员变量.     一种常见的办法是通过runti ...

  6. JavaBean属性和成员变量的区别和联系

    JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中.特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性.名称中的“Bean”是用于 ...

  7. Java反射机制可以动态修改实例中final修饰的成员变量吗?

    问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...

  8. (转载)php的类中可以不定义成员变量,直接在构造方法中使用并赋值吗?

    (转载)http://s.yanghao.org/program/viewdetail.php?i=184313 php的类中可以不定义成员变量,直接在构造方法中使用并赋值吗? class block ...

  9. Node.js中环境变量process.env详解

    Node.js中环境变量process.env详解process | Node.js API 文档http://nodejs.cn/api/process.html官方解释:process 对象是一个 ...

随机推荐

  1. 智能会议白板系统CodeMap

    4个人3个月,1个项目,47个工程->白板系统 白板部分: 识别部分: 望多指教.

  2. 设置mysql 在mac中的环境变量

    在mac os的用户目录下有一个隐藏文件.bash_profile,编辑它就可以完成环境变量的创建. 比如要将mysql的运行目录加到环境变量中,可以在.bash_profile中新增如下一行: ex ...

  3. javap 可以打印出用于jni调用的java函数的签名信息

    javap可以打印出java的字节码: -c     Prints out disassembled code, i.e., the instructions that comprise the Ja ...

  4. 最大连续子数组问题-homework-01

    1)先写我的 github 的介绍: github 的域名:http://www.github.com/zhuifeng1022 登入 github 大概是下面的视图: 按照助教的方法:我已经建好了代 ...

  5. html5+css3中的background: -moz-linear-gradient 用法

    在CSS中background: -moz-linear-gradient 让网站背景渐变的属性,目前火狐3.6以上版本和google浏览器支持这个属性. background: -moz-linea ...

  6. Gym 100507A About Grisha N. (水题)

    About Grisha N. 题目链接: http://acm.hust.edu.cn/vjudge/contest/126546#problem/A Description Grisha N. t ...

  7. Unity中2D和UGUI图集的理解与使用

    图集 什么是图集? 在使用3D技术开发2D游戏或制作UI时(即使用GPU绘制),都会使用到图集,而使用CPU渲染的2D游戏和UI则不存在图集这个概念(比如Flash的原生显示列表),那么什么是图集呢? ...

  8. MFC实现数独(1)

    雨天纷纷扰扰,数月里每日有雨,这个夏天不热,写这个数独的动机很简单:实践是最好的成长方式,想要获得自信,必有这么一遭,我躲不过.至于决定记录成博客,则是因为很久没有写文章,经常感觉脑海里很空白,屡次开 ...

  9. The plot Function in matlab

    from http://pundit.pratt.duke.edu/wiki/MATLAB:Plotting The plot Function The plot function is used t ...

  10. vim 打开多个文件

    一.如果在终端还没有打开vim 1.vim横向分屏打开多个文件 vim -o 文件1 文件2 2.vim纵向分屏打开多个文件 vim -O 文件1 文件2 二.如果在终端已经打开vim 1.横向分屏打 ...