property和synthesize

创建一个Person类。提供成员属性的_age和_height的setter和getter方法。

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
int _age;
int _height;
} - (void)setAge:(int)age;
- (int)age;
@end #import "Person.h"
@implementation Person - (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
@end

开发中考虑封装性将成员属性通过提供setter与getter结构供外界访问。但是这些setter跟getter代码没有任何技术含量。于是苹果提供关键字property和synthesize 关键字利用编译器特性将我们自动生成setter跟getter方法。

@property int age;
// - (void)setAge:(int)age;
// - (int)age; @synthesize age;
/*
- (void)setAge:(int)age
{ }
- (int)age
{ }
*/

@synthesize age虽然帮我们实现了set跟get方法的实现,并未指定将外界传递的值对哪个成员属性进行赋值。如上Person类需要给成员_age复制。

@synthesize age = _age;

如果我们使用@synthesize age没有指定给哪个成员复制,那么会自动访问与@synthesize后面同名的成员属性,如果没有同名的成员属性也会自动生成同名私有成员变量。

通过@property 和@synthesize我们可以对Person类简写成如下

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
int _age;
int _height;
} @property int age;
@property int height;
@end #import "Person.h"
@implementation Person @synthesize age = _age;
@synthesize height = _height;
@end

上面的Person类还可以继续进行简写,不写成员变量。xcode编译器自动生成带有下划线的私有成员变量。这是由于Xcode的功能强大。

#import <Foundation/Foundation.h>
@interface Person : NSObject @property int age;
@property int height;
@end #import "Person.h"
@implementation Person @synthesize age = _age;
@synthesize height = _height;
@end

Xcode4.4之后property关键字可以独揽@synthesize的功能。因此Person类可以简写:

#import <Foundation/Foundation.h>
@interface Person : NSObject @property int age;
@property int height;
@end #import "Person.h"
@implementation Person @end

自动生成的下划线成员属性特点:

* 自动生成下划线的成员属性是私有的,子类是不可以直接访问的

* 如果手动生成_成员属性,系统则不会帮我们生成

* 如果手动同时重写setter跟getter实现,xcode不会帮我们生成下划线属性

OC开发系列-@property和@synthesize的更多相关文章

  1. OC语法5——@property和@synthesize

    @property和@synthesize: 我们回想一下: 在OC中我们定义一个Student类需要两个文件Student.h 和 Student.m. Student.h(声明文件):定义成员变量 ...

  2. OC开发系列-内存管理

    概述 移动设备的内存极其有限,每个app所有占用的内存是有限的.当app所占用的内存比较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间. 任何集成了NSObject的对象都需要手动进行 ...

  3. OC基础--关键字@property 和 @synthesize

    一.@property关键字需要掌握的知识: 1.用在@interface中,用来自动生成setter和getter的声明 例:@property int age;--相当于执行了右边的代码--> ...

  4. OC开发系列-成员变量的作用域

    成员变量的作用域 OC中成员变量有四种作用域,同时每一种作用域对应着响应的关键字. * @private:自能在当前类的实现@implementation中访问 * @protected: 可以在当前 ...

  5. OC开发系列-类与对象

    面向对象 面向对象思想是一种解决问题的思想, 不在是面向过程的去思考问题怎样解决.面向对象解决问题时首先要考虑需要找几个对象能解决这个问题. 常见的概念: * Object Oriented 面向对象 ...

  6. OC中两个关键字的作用:@property和@synthesize

    两个关键字的使用:@property和@synthesize 一.@property关键字这个关键字是OC中能够快速的定义一个属性的方式,而且他可以设置一些值,就可以达到一定的效果,比如引用计数的问题 ...

  7. OC学习篇之---@property和@synthesize的使用

    在之前一片文章我们介绍了OC中的内存管理:http://blog.csdn.net/jiangwei0910410003/article/details/41924683,今天我们来介绍两个关键字的使 ...

  8. iOS runtime探究(三): 从runtime開始理解OC的属性property

    你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639303 本文主要解说runtime相关知识, ...

  9. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

随机推荐

  1. IDEA上传项目到SVN

    1.打开IDEA ,上面工具栏选择VCS 选择把项目交给SVN管理 2.选择SVN 3.选择SVN管理后可以看到项目变这个颜色 4.右键项目选择如下 5.点击绿色的+号,选择一个SVN仓库的地址,下面 ...

  2. ASP.NET中ajax验证用户名和邮箱是否重复

    这个是前台显示的页面代码↓ <%@ Page Language="C#" AutoEventWireup="true" CodeFile="De ...

  3. mysql创建新用户并且授权远程访问

    1 修改root用户的密码 linux安装了mysql后,默认情况下,如果是root用户,不需要密码就可以登陆. mysql -u root -p 然后回车就可以登陆了,如果是普通用户,不能登陆. 2 ...

  4. shell提取rpm的报名

    说明: rpm本身未安装,下面方法是基于rpm包文件实现提取rpm的包名 rpm -qpi ZXVEi-git0/CgsOS/abrt-2.1.11-48.el7.centos.x86_64.rpm ...

  5. Redis数据结构之字典-dict

    dict是Redis服务器中出现最为频繁的复合型数据结构,除hash使用dict之外,整个Redis数据库中所有的key和value也会组成一个全局字典,还有带过期时间的key集合也是一个字典. zs ...

  6. STL 队列模板实现

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u010016150/article/details/32715801   C++ Prime确实有点 ...

  7. Excel的线程 与 SynchronizationContext的实现

    COM组件的线程模型与Excel多线程的背景知识 COM组件的线程模型被称之为Apartment模型,COM对象初始化时其执行上下文(Execution Context),他要么和单个线程关联STA( ...

  8. (PASS)什么是原子性和原子性操作?

    什么是原子性操作呢? 下面我举一个例子来说明一下: A想要从自己的帐户中转1000块钱到B的帐户里.那么从A开始转帐,到转帐结束的这一个过程,称之为一个事务.在这个事务里,要做如下操作: 1. 从A的 ...

  9. tomcat 端口被占用 项目端口号被占用怎么解决

    1.Win+R  打开运行 ,输入cmd 打开命令行窗口 . 2.假设要查询端口被占用情况,在命令行下输入:netstat  -aon|findstr  "8883" 3.得到进程 ...

  10. 2 java程序入门

    1. 第一个java  class  { public static void main(String[] args) { System.out.println("Hello World!& ...