《objective-c基础教程》学习笔记(七)—— 存取方法
在上一篇博文中,我们有拿一个简单的“汽车模型”来讲解复合关系。在今天的这篇博文中,我们将接着上一次的例子,讲解下存取(accessor)方法的使用。所谓存取方法,就是用来读取或改变某个对象属性的方法。如果添加一个方法去改变Car对象中的engine对象变量,那它就是一个存取方法。
存取方法分为两种:setter方法和getter方法。setter方法,是为对象中的变量赋值。getter方法,是通过对象本身访问对象属性。
在Objective-c中,Cocoa框架在定义存取方法的时候,有相关的规定:
(1). setter方法,根据它的所要去改变的属性名称来命名,并在前面加set前缀。如:setEngine,setTire等。
(2). getter方法,则是以其返回的属性名称来命名,不要将get前缀加到getter方法名前面。因为在Cocoa中,get前缀有其他的用途。一般意味着这个方法会将你传递的参数作为指针来返回数值。
介绍完了基本的概念和定义的规则。下面,我们就来修改“汽车模型”,给汽车的engine和tire设置存取方法。
首先,先在Car对象定义中添加engine和tire的存取方法:
- @interface Car : NSObject
- {
- Engine *engine;
- Tire *tires[]; //四个轮子,定义一个四个数的数组。
- }
- -(Engine *) engine;
- -(void) setEngine:(Engine *) newEngine;
- -(Tire *) tireAtIndex:(int) index;
- -(void) setTire:(Tire *) tire atIndex:(int) index;
- -(void) drive;
- @end // Car
由于,tire有四个子集,所以这里还添加了一个atIndex参数,表示第几个轮子。接下来,实现Car中定义的存储方法:
- @implementation Car
- -(void) setEngine:(Engine *) newEngine
- {
- engine = newEngine;
- }
- -(Engine *) engine
- {
- return (engine);
- }
- -(void) setTire:(Tire *) tire
- atIndex:(int) index
- {
- if(index< || index>)
- {
- NSLog(@"bad index(%d) in setTire:atIndex",
- index);
- exit();
- }
- tires[index] = tire;
- }
- -(Tire *) tireAtIndex:(int) index
- {
- if(index< || index>)
- {
- NSLog(@"bad index(%d)in tireAtIndex:",
- index);
- exit();
- }
- return (tires[index]);
- }
- -(void) drive{
- NSLog(@"%@",engine);
- NSLog(@"%@",tires[]);
- NSLog(@"%@",tires[]);
- NSLog(@"%@",tires[]);
- NSLog(@"%@",tires[]);
- }
- @end
为了传入的index参数不符合条件,使得超出数组,我们做了简单的判断。最后,我们修改main主函数:
- int main(int argc, const char * argv[])
- {
- Car *car = [Car new];
- Engine *engine = [Engine new];
- [car setEngine:engine];
- for(int i=;i<;i++)
- {
- Tire *tire = [Tire new];
- [car setTire:tire atIndex:i];
- }
- [car drive];
- return ;
- }
这时,我们发现:之前在Car中定义的init初始化方法,这边移除掉了。由于Car现在自己定义了访问engine和tires变量的方法。所以,不需要init方法来创建。而是直接在主函数中创建Engine和Tire。
运行结果和之前的没有区别:
通过这个简单修改的例子,希望大家对Cocoa框架中的存取方法的使用方法有更深的了解。
2014.12.07 后续更新部分
在这几天的学习中,发现Objective-C在实际的使用了,很多都是用合并存取方法来实现。所有,这里,我想扩展给大家一起分享下。
让系统自动合并setter和getter只要两个步骤:
(1). 在类接口部分使用@property指令定义属性。
(2). 在类实现的部分使用synthesize指令声明该属性即可。
所有,上面例子中定义Engine的存取方法我们可以修改成以下代码:
原来的setter方法和getter方法可以合并改成:
- /* 3.Car */
- @interface Car : NSObject
- {
- Engine *engine;
- Tire *tires[]; //四个轮子,定义一个四个数的数组。
- }
- @property(nonatomic)Engine* engine;
- @end // Car
实现方法只要这样:
- @implementation Car
- @synthesize engine;
- @end;
在使用@property指令的时候,后面会带上一些参数,具体的作用这边大致介绍下。要想深入了解,可以之后自己百度之。
atomic(nonatomic):指定合成的存储方法是否为原子操作。即:主要指是否线性安全。aomic可以保证对象数据完整性,但是线程的安全性降低。nonatomic可以提高存储方法的访问性能。
copy:当调用setter方法对成员变量赋值的时候,会将被赋值的对象复制成一个副本,再将该副本赋值给成员变量。copy指令可以避免当计数器的值为0的时候,对象被清除。
readonly:指示系统只合成getter方法,不再合成setter方法。即:定义的方法只读,不能给赋值。
readwrite:是默认值,指示系统需要合成setter,getter方法。
retain:当把某个对象赋值给该属性时,该属性原来所引用的对象的引用数减1,被赋值对象的引用数加1。(ARC内存机制中用到)
retainCount:获取引用的对象的引用数。
weak:指示符指定该属性对被赋值对象持有弱引用。即:即使该弱引用指向被赋值的对象,该对象也可能被回收。
strong:指示符指定该属性对被赋值对象持有强引用。即:只要该抢引用指向被赋值的对象,那么该对象就不会自动回收。
《objective-c基础教程》学习笔记(七)—— 存取方法的更多相关文章
- Python基础教程学习笔记:第一章 基础知识
Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入“p ...
- 【学习笔记】Python基础教程学习笔记
教程视频网盘共享:http://pan.baidu.com/s/1hrTrR5E 03-python基础.if判断 print 输出数据 print("hahahah")----- ...
- 匿名内部类--毕向东java基础教程学习笔记
1.匿名内部类其实就是内部类的简写形式. 2.定义匿名内部类的前提: 该内部类必须继承一个类,或者实现一个接口. 3.匿名内部类的格式:new 父类名或接口名(){定义子类内容:} 4.其实匿名内部类 ...
- 内部类--毕向东Java基础教程学习笔记
内部类的访问规则 1. 内部类可以直接访问外部类的成员,包括私有. 之所以可以直接访问外部类的成员,是因为内部类中持有外部类的引用,格式:外部类名.this 2.外部类要访问内部类,必须建立内部类对象 ...
- 异常处理——毕向东Java基础教程学习笔记
1.异常:就是程序运行过程中出现的不正常情况. 异常的由来:问题本身也是日常生活中一个具体的事物,也可以通过java类的形式进行描述,并封装成对象. 其实 ...
- 《嵌入式Linux基础教程学习笔记一》
常用书目下载地址:http://www.cnblogs.com/pengdonglin137/p/3688029.html 第二章 1.进程上下文和中断上下文(Page20) 当应用程序执行系统调用, ...
- Objective-C基础教程学习笔记(附录)从Java转向Objective-C
Java接口与Objective- C正式协议类似,因为它们都需要实现一组方法.Java具有抽象类,但Objective-C没有.Java具有类变量,但在Objective-C中, 可以使用文件范围内 ...
- Python基础教程学习笔记:第二章 列表和元组
1.序列中元素的索引: 第一个元素索引是0,第二个是1,依次递增 最后一个元素索引是-1,倒数第二个是-2,依次递减 2.序列(Sequence)的种类: 列表(list).元组(tuple).字符串 ...
- Objective-c基础知识学习笔记
Objective-c基础知识学习笔记(一) 一直有记录笔记的习惯.但非常久没分享一些东西了,正好上半年開始学习IOS了,如今有空写点.因开发须要,公司特意为我们配置了几台新MAC.还让我们自学了2周 ...
- python3.4学习笔记(七) 学习网站博客推荐
python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...
随机推荐
- 制作SMD Package及SMD焊盘制作
1.设置公英制. 2.设置栅格点.在Etch里设置0.1MM. 3.封装包括以下内容:REF标识, Place bound层包括高度, silkscreen 层, 1pin标识及pin序, 中心坐标, ...
- C++混合编程之idlcpp教程Lua篇(3)
上一篇 C++混合编程之idlcpp教程Lua篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用.这一篇会有新的内容. 与LuaTutorial0相似,工程LuaTutoria ...
- Winform(C#.NET)自动更新组件的使用及部分功能实现(续)
接昨天的文章Winform(C#.NET)自动更新组件的使用及部分功能实现 强制更新的实现部分: 将DownloadConfirm窗体修改成单纯的类 public class DownloadConf ...
- Navicat for MySQL的服务器连接管理
Navicat for MySQL可以导入导出数据库服务器的连接,方便你换机器时不用再设置连接. 导出为一个.ncx的XML文件. 导入后,在执行一个查询时,可能会报以下错误 这是因为源机器和本 ...
- AngularJS快速入门指南05:控制器
AngularJS控制器用来控制AngularJS applications的数据. AngularJS控制器就是普通的JavaScript对象. AngularJS控制器 AngularJS app ...
- 如何使用Coded UI Test对Webpage进行自动化测试
在Visual Studio中,Coded UI Test已经不是什么新特性了,较早版本的Visual Studio中就已经有这个东东了.它主要用来帮助自动化测试工程师和开发人员确保程序在UI方面没有 ...
- Lingo 做线性规划 - DEA
Reference: <An Introduction to Management Science Quantitative Approaches to Decision Making, Rev ...
- django上传文件
template html(模板文件): <form enctype="multipart/form-data" method="POST" action ...
- 自己动手写js分享插件(QQ空间,微信,新浪微博。。。)
参考博客:http://blog.csdn.net/libin_1/article/details/52424340 下载链接:http://download.csdn.net/detail/come ...
- SQL 2012 发布与订阅实现数据同步 图解(解决 错误22022)
概念参见:https://msdn.microsoft.com/zh-cn/library/ms151170.aspx 推送订阅 对于推送订阅,发布服务器将更改传播到订阅服务器,而无需订阅服务器发出请 ...