在上一篇博文中,我们有拿一个简单的“汽车模型”来讲解复合关系。在今天的这篇博文中,我们将接着上一次的例子,讲解下存取(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基础教程》学习笔记(七)—— 存取方法的更多相关文章

  1. Python基础教程学习笔记:第一章 基础知识

    Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入“p ...

  2. 【学习笔记】Python基础教程学习笔记

    教程视频网盘共享:http://pan.baidu.com/s/1hrTrR5E 03-python基础.if判断 print 输出数据 print("hahahah")----- ...

  3. 匿名内部类--毕向东java基础教程学习笔记

    1.匿名内部类其实就是内部类的简写形式. 2.定义匿名内部类的前提: 该内部类必须继承一个类,或者实现一个接口. 3.匿名内部类的格式:new 父类名或接口名(){定义子类内容:} 4.其实匿名内部类 ...

  4. 内部类--毕向东Java基础教程学习笔记

    内部类的访问规则 1. 内部类可以直接访问外部类的成员,包括私有. 之所以可以直接访问外部类的成员,是因为内部类中持有外部类的引用,格式:外部类名.this 2.外部类要访问内部类,必须建立内部类对象 ...

  5. 异常处理——毕向东Java基础教程学习笔记

    1.异常:就是程序运行过程中出现的不正常情况. 异常的由来:问题本身也是日常生活中一个具体的事物,也可以通过java类的形式进行描述,并封装成对象.                        其实 ...

  6. 《嵌入式Linux基础教程学习笔记一》

    常用书目下载地址:http://www.cnblogs.com/pengdonglin137/p/3688029.html 第二章 1.进程上下文和中断上下文(Page20) 当应用程序执行系统调用, ...

  7. Objective-C基础教程学习笔记(附录)从Java转向Objective-C

    Java接口与Objective- C正式协议类似,因为它们都需要实现一组方法.Java具有抽象类,但Objective-C没有.Java具有类变量,但在Objective-C中, 可以使用文件范围内 ...

  8. Python基础教程学习笔记:第二章 列表和元组

    1.序列中元素的索引: 第一个元素索引是0,第二个是1,依次递增 最后一个元素索引是-1,倒数第二个是-2,依次递减 2.序列(Sequence)的种类: 列表(list).元组(tuple).字符串 ...

  9. Objective-c基础知识学习笔记

    Objective-c基础知识学习笔记(一) 一直有记录笔记的习惯.但非常久没分享一些东西了,正好上半年開始学习IOS了,如今有空写点.因开发须要,公司特意为我们配置了几台新MAC.还让我们自学了2周 ...

  10. python3.4学习笔记(七) 学习网站博客推荐

    python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...

随机推荐

  1. IOS笔记之UIKit_UIAlertView、UIActionSheet

    //首先必须继承协议 @interface TRViewController : UIViewController<UIAlertViewDelegate,UIActionSheetDelega ...

  2. log4j使用方法

    项目在开发运行阶段,需要根据日志调试或者排错,这时候就需要有日志管理来帮助我们解决这些问题: 在java中我们可以使用System.out.println(),但是这种方式功能呢个太弱,而且不易控制, ...

  3. android 一题多改系列——android 打电话实现两种方法

    在android开发中,用户能够拨打电话是最基本的需求.俗话说“条条大路通罗马”,实现拨打电话的方式有多种,今天,就提供最常用两种. 首先,拨打电话,对于用户来说,是一个耗费的操作,因此,需要一定权限 ...

  4. C#课外实践——校园二手平台(技术篇2)

    说明:一个人的进步都是点点滴滴的积累起来的.接着总结这次的课外实践. 有时候,想这样,3个Combox,当第一个ComBox选择以后,第二个ComBox会根据第一个的选择结果来显示相对应的内容.其实你 ...

  5. Apache CXF Webservice入门

    1.步骤一览 关于CXF的介绍请移步官网.百科,这里仅供初次使用者入门. 2.步骤详情 2.1.环境准备 apache-cxf-3.0.0.zip下载 jdk1.7.0_51 Eclipse4.3.0 ...

  6. 在Debian下安装LAMP

    准备工作: 1 sudo apt-get install build-essential 第一步:安装Apache 1 sudo apt-get install apache2 第二步:安装MySQL ...

  7. 使用Excel制作万年历(可打印)

    先来看看A4纸打印效果,其他功能后续继续完善中. 年份数据字典(农历节日) 农历节日表 年度 春节 元宵节 龙抬头 端午节 六月六 七月七 七月十五 仲秋节 除夕 2010年02月14日 2010年0 ...

  8. 创建Activiti项目

    1.创建项目 2.导入Activiti的jar包 项目上右击创建lib文件夹 将jar包复制进lib文件夹 3.导入数据库连接jar包 4.使用代码创建Activiti用来存放流程数据的23张表 pa ...

  9. ubuntu安装gitlab

    #安装所有的依赖包 sudo apt-get install -y build-essential git-core sudo apt-get install -y zlib1g-dev libyam ...

  10. Reservoir Sampling 蓄水池抽样算法,经典抽样

    随机读取数据,如何保证真随机是不可能的,因为计算机的随机函数是伪随机的. 但是在不考虑计算机随机函数的情况下,如何保证数据的随机采样呢? 1.系统提供的shuffle函数 C++/Java都提供有sh ...