1. 从OC 2.0开始就已经可以自动生成设置函数方法和获取函数方法(统称为存取器方法)。

什么是 @property 和 @synthesize ?

@property 和 @synthesize 实际是开发工具 Xcode 对代码的一种替换,我不确定它们是否是OC的语法,毕竟IOS开发基本是在 Xcode 上进行,它们的主要作用就是自动帮我们生成 getter 和 setter 方法,大大简化我们的代码,并且大部分人都这么做,有利于团队开发。

为什么要用 @property 和 @synthesize ?

a)当我们在 .h 文件写一个变量时,需要声明它的 getter 和 setter 方法,然后去 .m 文件实现,几个变量还行,如果数量多了, .h 和 .m 文件里就会充斥着代码几乎类似的 getter 和 setter 方法。

b)使用 @property 和 @synthesize 时就不需要再继续写 getter 和 setter 方法的声明和实现了,甚至连定义变量都不需要了,开发工具会自动帮我们把变量以及它的 getter 和 setter 方法都实现,虽然我们看不到,but they are there.

怎么使用 @property 和 @synthesize ?

Student.h

1
2
3
4
5
6
7
8
9
10
11
#import <Foundation/Foundation.h>
 
@interface Student : NSObject
 
@property int age;
 
// 相当于
// - (void)setAge:(int)newAge;
// - (int)age;
 
@end

 Student.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@import "Student.h"
 
@implementation Student
 
@synthesize age;
 
// 相当于
// - (void)setAge:(int)newAge {
//     age = newAge;
// }
// - (int)age {
//     return age;
// }
 
@end

当然我们之前说过,成员变量最好开头加上下划线,例如:_age,在@synthesize后面赋值即可,开发工具会默认生成 _age 变量而不是 age

 Student.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@import "Student.h"
 
@implementation Student
 
@synthesize age = _age;
 
// 相当于
// - (void)setAge:(int)newAge {
//     _age = newAge;
// }
// - (int)age {
//     return _age;
// }
 
@end

在 Xcode4.5以后,@synthesize可以省略不写,但它还是确实在那的,只是你看不见,它会默认给成员变量加下划线

Student.m

1
2
3
4
5
6
7
@import "Student.h"
 
@implementation Student
 
// @synthesize age = _age;
 
@end

当你不拘于标准的 getter 和 setter 方法时,即想在 getter 或 setter 方法中添加一点自己的东西,这时你就只能自己重写了,开发工具无能为力

Student.m

1
2
3
4
5
6
7
8
9
10
@import "Student.h"
 
@implementation Student
 
- (int)age {
    _age += 10;
    return _age;
}
 
@end

4--OC --合成存取器方法的更多相关文章

  1. 【OC学习-8】存取器方法?getter和setter?事实上就是赋值和返回值的两种函数

    我们在声明类的时候,有实例变量+方法(函数),这些实例变量假设默认的话都是protected类型,一般无法直接訪问.更别提赋值和调用了,所以就产生了两种函数,getter函数就是可以返回实例变量的值, ...

  2. php学习九:存取器&魔术方法

    当声明属性的时候用到了private,那么的话只能本类中才能访问此属性,其他地方无法使用,这个时候需要给外界提供一些方法来使外界访问 方法一:存取器: 可以提供一个public的方法来使外界对类里面的 ...

  3. 对象存取器属性:getter和setter

    在一个对象中,操作其中的属性或方法,通常运用最多的就是读(引用)和写了,譬如说o.a,这就是一个读的操作,而o.b = 1则是一个写的操作.事实上在除ie外最新主流浏览器的实现中,任何一个对象的键值都 ...

  4. JavaScript 之存取器属性

    首先介绍一下此篇随笔的主角: Object.getOwnPropertyDescriptor 和 Object.getOwnPropertyDescriptors 通过这两个api,可以访问除 nul ...

  5. js篇之对象数据属性与存取器属性

    在ECMAScript中,对象属性值可以用一个或两个方法代替,这两个方法就是getter和setter.由getter与与setter定义的属性叫做‘存取器属性’.当程序查询存取器属性的值时,js调用 ...

  6. 011_URL和Ajax辅助器方法

    创建基本的链接和URL 在我们介绍链接或URL之前先做一些准备,我们这部分要介绍的知识将要使用的项目就是之前建立的HelperMethods项目,现在需要先为其添加一个People控制器,并在其中定义 ...

  7. python装饰器方法

    前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...

  8. java 访问器方法中对象引用的问题

    "注意不要编写返回引用可变对象的访问器方法".因为会破坏类的封装性,引用的内容可能会被改变,产生业务逻辑上的错误. 什么是可变对象? 先要搞清楚java中值传递和引用传递的问题,总结如下: 1.对象就 ...

  9. c# 索引器方法

    索引器方法允许我们构建能够以类似访问数组的语法来访问内部子类型的自定义类型 在语法上索引器方法和属性的定义很类似,一样是使用get,set,不同的是索引器是使用this[]创建的. 一个简单的索引器代 ...

随机推荐

  1. BestCoder Round #86 A B C

    这次BC终于不像上次一样惨烈 终于A了三题…… 终测ing…… 发一波题解…… A.Price List A题十分无脑 只要把所有数加起来存到sum里 询问的时候大于sum输出1 否则输出0就行了…… ...

  2. Business Intelligence(BI) 商务智能

    商业智能技术正是一种能够帮助企业迅速地完成信息采集.分析的先进技术.它以数据仓库(Data Warehousing).在线分析处理(OLAP).数据挖掘(Data Mining)3种技术的整合为基础, ...

  3. 【第三篇】学习 android 事件总线androidEventbus之list数据事件的传递,发送list数据事件到另外一个Activity

    这个和普通的事件总线的发送接收一样. package com.example.mysimpleeventbus; import java.util.ArrayList; import java.uti ...

  4. HDU 5807 Keep In Touch

    加维降复杂度 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #inc ...

  5. leetcode383

    已知两个字符串,然后比较一个字符串是否来自另一个字符串,没有顺序要求. 简单题,用一个数组保存前一个字符串的每一个字符出现的次数,然后循环后一个字符串去检查,如果次数不够了,那么就返回false pu ...

  6. DOM操作-引用同级的元素

    代码: ———————————————————————————————— <script type="text/javascript">            //获取 ...

  7. 递归解析任意层的json

    package com.sun.test; import java.util.Iterator; import net.sf.json.JSONArray;import net.sf.json.JSO ...

  8. MC 自己平均

    using System; using System.Drawing; using System.Linq; using System.Collections; namespace PowerLang ...

  9. php编译错误Note that the MySQL client library is not bundled anymore!

    Note that the MySQL client library is not bundled anymore! 解决方法. 1. 查看系统有没有安装mysql header find / -na ...

  10. Entity Framework中对存储过程的返回值的处理

    很早就开始注意到EF了,但一直没有机会用,换了工作后,第一个项目就使用EF6进行开发. 项目不是很大,EF完全可以胜任. 但是开发过程中,难免还是会遇到一些复杂的运算,需要频繁访问数据库. 此时,想到 ...