《objective-c基础教程》学习笔记(七)—— 存取方法
2014-11-26 23:36
106 查看
在上一篇博文中,我们有拿一个简单的“汽车模型”来讲解复合关系。在今天的这篇博文中,我们将接着上一次的例子,讲解下存取(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的存取方法:
由于,tire有四个子集,所以这里还添加了一个atIndex参数,表示第几个轮子。接下来,实现Car中定义的存储方法:
为了传入的index参数不符合条件,使得超出数组,我们做了简单的判断。最后,我们修改main主函数:
这时,我们发现:之前在Car中定义的init初始化方法,这边移除掉了。由于Car现在自己定义了访问engine和tires变量的方法。所以,不需要init方法来创建。而是直接在主函数中创建Engine和Tire。
运行结果和之前的没有区别:
通过这个简单修改的例子,希望大家对Cocoa框架中的存取方法的使用方法有更深的了解。
2014.12.07 后续更新部分
在这几天的学习中,发现Objective-C在实际的使用了,很多都是用合并存取方法来实现。所有,这里,我想扩展给大家一起分享下。
让系统自动合并setter和getter只要两个步骤:
(1). 在类接口部分使用@property指令定义属性。
(2). 在类实现的部分使用synthesize指令声明该属性即可。
所有,上面例子中定义Engine的存取方法我们可以修改成以下代码:
原来的setter方法和getter方法可以合并改成:
实现方法只要这样:
在使用@property指令的时候,后面会带上一些参数,具体的作用这边大致介绍下。要想深入了解,可以之后自己百度之。
atomic(nonatomic):指定合成的存储方法是否为原子操作。即:主要指是否线性安全。aomic可以保证对象数据完整性,但是线程的安全性降低。nonatomic可以提高存储方法的访问性能。
copy:当调用setter方法对成员变量赋值的时候,会将被赋值的对象复制成一个副本,再将该副本赋值给成员变量。copy指令可以避免当计数器的值为0的时候,对象被清除。
readonly:指示系统只合成getter方法,不再合成setter方法。即:定义的方法只读,不能给赋值。
readwrite:是默认值,指示系统需要合成setter,getter方法。
retain:当把某个对象赋值给该属性时,该属性原来所引用的对象的引用数减1,被赋值对象的引用数加1。(ARC内存机制中用到)
retainCount:获取引用的对象的引用数。
weak:指示符指定该属性对被赋值对象持有弱引用。即:即使该弱引用指向被赋值的对象,该对象也可能被回收。
strong:指示符指定该属性对被赋值对象持有强引用。即:只要该抢引用指向被赋值的对象,那么该对象就不会自动回收。
存取方法分为两种: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[4]; //四个轮子,定义一个四个数的数组。 } -(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<0 || index>3) { NSLog(@"bad index(%d) in setTire:atIndex", index); exit(1); } tires[index] = tire; } -(Tire *) tireAtIndex:(int) index { if(index<0 || index>3) { NSLog(@"bad index(%d)in tireAtIndex:", index); exit(1); } return (tires[index]); } -(void) drive{ NSLog(@"%@",engine); NSLog(@"%@",tires[0]); NSLog(@"%@",tires[1]); NSLog(@"%@",tires[2]); NSLog(@"%@",tires[3]); } @end
为了传入的index参数不符合条件,使得超出数组,我们做了简单的判断。最后,我们修改main主函数:
int main(int argc, const char * argv[]) { Car *car = [Car new]; Engine *engine = [Engine new]; [car setEngine:engine]; for(int i=0;i<4;i++) { Tire *tire = [Tire new]; [car setTire:tire atIndex:i]; } [car drive]; return 0; }
这时,我们发现:之前在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[4]; //四个轮子,定义一个四个数的数组。 } @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基础教程》学习笔记(六)—— 复合方法
- 《objective-c基础教程》学习笔记(五)—— 继承方法
- Objective-C 基础,类和对象,方法和消息,已声明的属性和存取方法,块对象,协议和范畴类,预定义类型和编码策略
- objective-c(六)文件分离,合成存取方法,方法多参数,局部变量,self使用(未完成)
- Objective-C中的存取方法
- Objective-C边学边记-4:OOP之 复合、存取方法
- Objective-C学习笔记(十一)——break和continue的使用方法
- Objective-C 合成存取器方法
- 《Objective-C基础教程》学习笔记第八章
- Objective-C 基础,类和对象,方法和消息,已声明的属性和存取方法,块对象,协议和范畴类,预定义类型和编码策略
- Objective-C中继承中方法调度和组合的存取方法
- 【IOS 开发学习总结-OC-12】★objective-c面向对象之——合成存取方法与点语法
- 《objective-c基础教程》学习笔记(九)—— Foundation框架介绍
- objective-c(六)文件分离,合成存取方法,方法多参数,局部变量,self使用
- Objective-C 基础,类和对象,方法和消息,已声明的属性和存取方法,块对象,协议和范畴类,预定义类型和编码策略
- Objective-C中的property介绍 (合成存取方法)
- 《objective-c基础教程》学习笔记(十一)—— 类别
- Objective-C中属性的简单使用(存取方法)
- 《Objective-C基础教程》学习笔记第十一-十三章
- Objective-C类-Objective-C 合成存取器方法