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 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...
随机推荐
- 详解Jquery和AngularJs,Servlet中jsonp解决跨域问题(转)
众所周知,jsonp可以解决跨域问题,下面是我在查阅资料和实际项目使用后的一些总结. Jquery中jsonp的使用 //myUrl = "http://localhost:8090/api ...
- Zookeeper注册节点的掉线自动重新注册及测试方法
转载:http://www.codelast.com/ 在一套分布式的online services系统中,各service通常不会放在一台服务器上,而是通过Zookeeper这样的东西,将自己的se ...
- Windows API 文件处理
CloseHandle 关闭一个内核对象.其中包括文件.文件映射.进程.线程.安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirect ...
- Hduacm—5497
#include <cstring> #include <cstdio> #include <iostream> using namespace std; type ...
- Android动画效果生动有趣的通知NiftyNotification(Android Toast替代品)
NiftyNotification在github上的项目主页是:https://github.com/sd6352051/NiftyNotification NiftyNotification本身又依 ...
- jQuery中的quickExpr
jQuery 源码中的 quickExpr 是用来检测参数 selector 是否是复杂的 HTML 代码(如“abc<div>”)或 #id,匹配结果存放在数组 match 中 // A ...
- 神奇的Noip模拟试题 T3 科技节 位运算
3 科技节 (scifest.pas/.c/.cpp) [问题描述] 一年一度的科技节即将到来.同学们报名各项活动的名单交到了方克顺校长那,结果校长一看皱了眉头:这帮学生热情竟然如此高涨,每个人都报那 ...
- redis学习(一)
一.redis简介 Redis是基于内存.可持久化的日志型.key-value高性能存储系统.关键字(Keys)是用来标识数据块.值(Values)是关联于关键字的实际值,可以是任何东西.有时候你会存 ...
- 动态加载DLL函数GetProcAddress错误
GetLastError获取错误代码127,指代“找不到指定程序”. 解决: 转自:http://hi.baidu.com/violetwangy/item/c35b3b95ecf5374cf0421 ...