Objective-C对象初始化 、 实例方法和参数 、 类方法 、 工厂方法 、 单例模式
1 重构Point2类
1.1 问题
本案例使用初始化方法重构Point2类,类中有横坐标x、纵坐标y两个属性,并且有一个能显示位置show方法。在主程序中创建两个Point2类的对象,设置其横纵坐标,并将它们显示出来。
1.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:定义类Point2
由于是对Point2类的重构,所以在Day02工程中新添加Point2.h文件用于定义新的类Point2。
代码如下所示:
- @interface Point2 : NSObject
- {
- }
- @end
步骤二:在Point2类中添加属性
在Point2类中添加两个属性,它们为横坐标x,为纵坐标y。
- #import <Foundation/Foundation.h>
- @interface Point2 : NSObject
- {
- }
- @property int x, y;
- @end
步骤三:在Point2类中添加初始化方法
首先,在类Point2的声明中添加无参初始化方法和有参初始化方法的声明。
代码如下所示:
- #import <Foundation/Foundation.h>
- @interface Point2 : NSObject
- {
- }
- @property int x, y;
- -(id)init;
- -(id)initWithX:(int)x andY:(int)y;
- @end
上述代码中,以下代码:
- -(id)init;
是无参初始化方法,该方法返回一个id类型的变量。id类型是Objective-C中的一种万能指针,相当于C语言中的void*这种数据类型。
上述代码中,以下代码:
- -(id)initWithX:(int)x andY:(int)y;
是有参初始化方法,该方法返回一个id类型的变量,同时具有两个形参,一个是整型变量x,另一个是整型变量y。
然后,在类Point2的实现部分,即在Point2.m文件中,添加无参初始化方法和有参初始化方法的实现。
代码如下所示:
- #import "Point2.h"
- @implementation Point2
- -(id)init
- {
- if (self = [super init])
- {
- _x = 10;
- _y = 20;
- }
- return self;
- }
- -(id)initWithX:(int)x andY:(int)y
- {
- if (self = [super init])
- {
- _x = x;
- _y = y;
- }
- return self;
- }
- @end
上述代码中,以下代码:
- if (self = [super init])
是首先发消息[super init]调用基类中的init方法获得self值。
步骤四:在Point2类中添加show方法
show方法用于在控制台上显示Point2类中的两个实例变量的值。
首先,在类Point2的声明中添加show方法的声明。
代码如下所示:
- #import <Foundation/Foundation.h>
- @interface Point2 : NSObject
- {
- }
- @property int x, y;
- -(id)init;
- -(id)initWithX:(int)x andY:(int)y;
- -(void)show;
- @end
然后,在类Point2的实现部分,即在Point2.m文件中,添加show方法的实现。
代码如下所示:
- #import "Point2.h"
- @implementation Point2
- -(id)init
- {
- if (self = [super init])
- {
- _x = 10;
- _y = 20;
- }
- return self;
- }
- -(id)initWithX:(int)x andY:(int)y
- {
- if (self = [super init])
- {
- _x = x;
- _y = y;
- }
- return self;
- }
- -(void)show
- {
- NSLog(@"x=%d,y=%d", _x, _y);
- }
- @end
步骤五:在主程序中使用Point2类
首先在Day02工程中新添加Point2Main.m文件,用于存储主程序,在主程序中定义两个Point2类的对象,同时使用无参初始化方法和有参初始化方法对两个对象的横坐标和纵坐标赋初值,最后打印这两个对象。
- #import "Point2.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- Point2 *p = [[Point2 alloc] init];
- [p show];
- Point2 *p1 = [[Point2 alloc] initWithX:55 andY:77];
- [p1 show];
- }
- return 0;
- }
1.3 完整代码
本案例中,类Point2声明,即Point2.h文件,完整代码如下所示:
- #import <Foundation/Foundation.h>
- @interface Point2 : NSObject
- {
- }
- @property int x, y;
- -(id)init;
- -(id)initWithX:(int)x andY:(int)y;
- -(void)show;
- @end
类Point2实现,即Point2.m文件,完整代码如下所示:
- #import "Point2.h"
- @implementation Point2
- -(id)init
- {
- if (self = [super init])
- {
- _x = 10;
- _y = 20;
- }
- return self;
- }
- -(id)initWithX:(int)x andY:(int)y
- {
- if (self = [super init])
- {
- _x = x;
- _y = y;
- }
- return self;
- }
- -(void)show
- {
- NSLog(@"x=%d,y=%d", _x, _y);
- }
- @end
主程序,即Point2Main.m,完整代码如下所示:
- #import "Point2.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- Point2 *p = [[Point2 alloc] init];
- [p show];
- Point2 *p1 = [[Point2 alloc] initWithX:55 andY:77];
- [p1 show];
- }
- return 0;
- }
2 重构Point2类
2.1 问题
本案例使用工厂方法重构Point2类,类中有横坐标x、纵坐标y两个属性,并且有一个能显示位置show方法。在主程序中创建两个Point2类的对象,设置其横纵坐标,并将它们显示出来。
2.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:定义类Point2
由于是对Point2类的重构,所以在Day02工程中新添加Point3.h文件用于定义新的类Point2。
代码如下所示:
- @interface Point2 : NSObject
- {
- }
- @end
步骤二:在Point2类中添加属性、初始化方法和show方法
首先,在类Point2的声明中添加两个属性,同时再添加无参初始化方法和有参初始化方法的声明和添加show方法的声明。
代码如下所示:
- #import <Foundation/Foundation.h>
- @interface Point2 : NSObject
- {
- }
- @property int x, y;
- -(id)init;
- -(id)initWithX:(int)x andY:(int)y;
- -(void)show;
- @end
然后,在类Point2的实现部分,即在Point3.m文件中,添加无参初始化方法、有参初始化方法和show方法的实现。
- #import "Point3.h"
- @implementation Point2
- -(id)init
- {
- if (self = [super init])
- {
- _x = 10;
- _y = 20;
- }
- return self;
- }
- -(id)initWithX:(int)x andY:(int)y
- {
- if (self = [super init])
- {
- _x = x;
- _y = y;
- }
- return self;
- }
- -(void)show
- {
- NSLog(@"x=%d,y=%d", _x, _y);
- }
- @end
步骤三:在Point2类中添加工厂方法的声明
工厂方法本质上是类的静态方法,其调用是通过类名直接调用的,与实例方法不同,实例方法是通过对象来调用的。
首先,在类Point2的声明中添加无参工厂方法和有参工厂方法的声明。
代码如下所示:
- #import <Foundation/Foundation.h>
- @interface Point2 : NSObject
- {
- }
- @property int x, y;
- -(id)init;
- -(id)initWithX:(int)x andY:(int)y;
- +(id)created;
- +(id)createdWithX:(int)x andY:(int)y;
- -(void)show;
- @end
上述代码中,以下代码:
- +(id)created;
- +(id)createdWithX:(int)x andY:(int)y;
用于对工厂方法的声明,需要注意的是工厂方法以加号“+”开头,而实例方法则以减号“-”开头。
然后,在类Point2的实现部分,即在Point3.m文件中,添加无参工厂方法和有参工厂方法的实现。方法的函数体实际上就是创建一个对象,然后将其返回。
代码如下所示:
- #import "Point3.h"
- @implementation Point2
- -(id)init
- {
- if (self = [super init])
- {
- _x = 10;
- _y = 20;
- }
- return self;
- }
- -(id)initWithX:(int)x andY:(int)y
- {
- if (self = [super init])
- {
- _x = x;
- _y = y;
- }
- return self;
- }
- +(id)created
- {
- Point2 *p = [[Point2 alloc] init];
- return p;
- }
- +(id)createdWithX:(int)x andY:(int)y
- {
- Point2 *p = [[Point2 alloc] initWithX:x andY:y];
- return p;
- }
- -(void)show
- {
- NSLog(@"x=%d,y=%d", _x, _y);
- }
- @end
步骤四:在主程序中使用Point2类
首先在Day02工程中新添加Point3Main.m文件,用于存储主程序,在主程序中创建两个Point2类的对象,一个用无参工厂方法创建,另一个用有参工厂方法创建,最后打印这两个对象。
代码如下所示:
- #import "Point3.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- Point2 *p = [Point2 created];
- [p show];
- Point2 *p1 = [Point2 createdWithX:55 andY:77];
- [p1 show];
- }
- return 0;
- }
2.3 完整代码
本案例中,类Point2声明,即Point3.h文件,完整代码如下所示:
- #import <Foundation/Foundation.h>
- @interface Point2 : NSObject
- {
- }
- @property int x, y;
- -(id)init;
- -(id)initWithX:(int)x andY:(int)y;
- +(id)created;
- +(id)createdWithX:(int)x andY:(int)y;
- -(void)show;
- @end
类Point2实现,即Point3.m文件,完整代码如下所示:
- #import "Point3.h"
- @implementation Point2
- -(id)init
- {
- if (self = [super init])
- {
- _x = 10;
- _y = 20;
- }
- return self;
- }
- -(id)initWithX:(int)x andY:(int)y
- {
- if (self = [super init])
- {
- _x = x;
- _y = y;
- }
- return self;
- }
- +(id)created
- {
- Point2 *p = [[Point2 alloc] init];
- return p;
- }
- +(id)createdWithX:(int)x andY:(int)y
- {
- Point2 *p = [[Point2 alloc] initWithX:x andY:y];
- return p;
- }
- -(void)show
- {
- NSLog(@"x=%d,y=%d", _x, _y);
- }
- @end
主程序,即Point3Main.m,完整代码如下所示:
- #import "Point3.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- Point2 *p = [Point2 created];
- [p show];
- Point2 *p1 = [Point2 createdWithX:55 andY:77];
- [p1 show];
- }
- return 0;
- }
Objective-C对象初始化 、 实例方法和参数 、 类方法 、 工厂方法 、 单例模式的更多相关文章
- Python32之类和对象2(self参数及魔法方法)
一.类方法中的self参数含义 在Python中类的方法都要有self参数,其实质为对类的实例化对象的绑定从而使得在类的实例化对象调用方法时能够确认出是对哪个对象进行操作. 带self的的参数是人家实 ...
- 对象初始化的完整过程(C#)
1.静态构造函数 在引入本文的主题之前,我们先来铺垫一下吧,看看静态构造函数的概念及用途. C#中允许创建无参数构造函数,该函数仅执行一次.它一般被用来初始化静态字段.CLR不能保证在某个特定时刻执行 ...
- python__高级 : 动态添加 对象属性, 类属性, 对象实例方法, 类静态方法, 类方法
给对象添加实例属性,可以直接这样 t.age = 18 ( 假设 t = Test() ) 给类添加类属性 , 也可以直接这样 Test.age = 18 那给对象添加实例方法,可以在类外面 ...
- Objective -C Object initialization 对象初始化
Objective -C Object initialization 对象初始化 1.1 Allocating Objects 分配对象 Allocation is the process by w ...
- C#语法糖之第二篇: 参数默认值和命名参数 对象初始化器与集合初始化器
今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完 ...
- 第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)
一. 语法糖简介 语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方 ...
- jQuery对象初始化的多种传参数形式
jQuery对象初始化的传参方式包括:1.$(DOMElement)2.$('<h1>...</h1>'), $('#id'), $('.class') 传入字符串, 这是最常 ...
- {{jQuery源码分析}}jQuery对象初始化的多种传参数形式
jQuery对象初始化的传参方式包括:1.$(DOMElement)2.$('<h1>...</h1>'), $('#id'), $('.class') 传入字符串, 这是最常 ...
- python-面向对象-09_类属性和类方法
类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...
随机推荐
- 在JSP中使用jQuery的冲突解决(收集整理)
在JSP中使用<jsp:include page="somethingPage.jsp"></jsp>来嵌套页面的时候,会出现jQuery之间的冲突 解决办 ...
- Introduction to Windows 8: The Definitive Guide for Developer
<Windows 8应用开发权威指南>介绍 Introduction to Windows 8: The Definitive Guide for Developer 一.封面设计要求及文 ...
- 如何采集所有QQ群成员?
首先,你需要有一个CHROME浏览器其实,你要装一个叫REGEX SCRAPER的插件 在qun.qzone.qq.com打开你的QQ群页面-查看群成员 点击REGEX 插件, 粘贴上这个代码 tex ...
- linux查找文件命令find
http://blog.csdn.net/ydfok/article/details/1486451 find 路径 -name'文件名' 如:find / -name '*dhcp*'
- 学习记录008-crond和visudo
1.每隔两个小时将/etc/servers文件打包备份到.tmp下(每次名字不同) [root@kaka cc.log]# tar zcvf /server/backup/ccc.log_$(date ...
- [JS]getYear()和getFullYear()方法区别
getFullYear();总是返回4位完整的年份 getYear();当年份在1900-1999时,返回两位数字,如1980返回80,当不在这个范围时,返回同getFullYear(); 注:get ...
- 两天以来对plsqldev操作的记忆
frist,开机后,打开服务,打开服务,打开服务(重要的事情说三遍). and then, 打开plsqldev,输入TEST账户而不是SYS账户,否则你会被许多未接触到的内容淹没你刚刚创建好的表. ...
- 3.5缺少动态连接库.so--cannot open shared object file: No such file or directory
总结下来主要有3种方法:1. 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边 ln -s /where/you/install/lib/*.so /usr/lib sud ...
- 有关嵌入式linux的注意点总结
知识收集和个人学习过程遇到的问题. 仅供参考. 1.sudo apt-get update 一直无法更新 一,查看网络是否连接上 有几种网络连接方式.常用的两种有网桥网络(Bridged)和网络地址翻 ...
- X230 安装win7 sp1
早上起床发现win10歇菜了,死活启动不了只好重装系统 用稳定版本win7比较靠谱. 去msdn上下载 一个win7系统 win7旗舰版本64位 ed2k://|file|cn_windows_7_u ...