在上一篇博文中,我们有拿一个简单的“汽车模型”来讲解复合关系。在今天的这篇博文中,我们将接着上一次的例子,讲解下存取(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:指示符指定该属性对被赋值对象持有强引用。即:只要该抢引用指向被赋值的对象,那么该对象就不会自动回收

最新文章

  1. 转: 在 Vim 中优雅地查找和替换 (写的很好,排版也是相当的赞)
  2. 高斯混合模型(GMM)
  3. JAVA获取CLASSPATH路径
  4. 给自定义cell设置分隔线的不同做法
  5. dedecms 列表每隔6行输出一个空li
  6. 按照行拆分textarea
  7. 利用Highcharts制作web图表学习(一)
  8. java基础(二章)
  9. StandardContext
  10. Java并发编程阅读笔记-Java监视器模式示例
  11. error while loading shared libraries: libopencv_core.so.3.4: cannot open shared object file: No such file or directory
  12. [Go] golang的select多路选择功能
  13. mysql权限操作(转)
  14. GMA Round 1 函数求值
  15. GitHub下载子目录
  16. 设计模式 笔记 策略模式 Strategy
  17. C++11 std::unique_lock与std::lock_guard区别及多线程应用实例
  18. Asp.net的生命周期应用之IHttpHandler
  19. POJ 1321:棋盘问题
  20. JAVA二叉树递归构造、二叉树普通遍历及递归遍历

热门文章

  1. IPD模式下开展敏捷开发的一些问题汇总
  2. poj 3635/hdu 1676 Full Tank? 车辆加油+最短路
  3. 数据库知识整理&lt;五&gt;
  4. ASP.NET MVC学习之模型绑定(1)
  5. C#函数式编程之递归调用
  6. beetle 2.7海量消息广播测试
  7. 史无前例的Firefox奇怪问题:host中的common名称造成css文件无法加载
  8. C++11 并发指南六(atomic 类型详解三 std::atomic (续))
  9. 第十八章:Android 打包部署
  10. Android中px和dip的区别