构造方法概念,自定义构造(init)方法的用途, 类工厂方法(就是直接用类名 类调用)
一、 构造方法
构造方法:在OC中init开头的方法, 我们称之为构造方法
构造方法的用途: 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值
// 比如我们定义一个Person的类,然后在类里面定义一个age的变量。如果不使用构造方法,有需求创建5个人,每个人年龄初始化为6,这么我们就需要下面的6句代码。 Person *p = [[Person alloc] init];
// p.age = 6;
NSLog(@"%i", p.age); Person *p2 = [[Person alloc] init];
// p2.age = 6;
NSLog(@"%i", p2.age); Person *p3 = [[Person alloc] init];
// p3.age = 6;
NSLog(@"%i", p3.age); // 如果使用构造方法的话,我们再init方法中将_age 初始化,这样就不用再赋值了,这是最简单的应用。
- (instancetype)init
{
self = [super init]; // self == nil == 0
if (self) {
// 初始化子类
_age = ;
}
return self;
}
需要注意的是重写init方法有固定的格式,如果不按照苹果这个格式来,编译无法通过,记住就行了。
重写init方法, 在init方法中初始化成员变量
注意: 重写init方法必须按照苹果规定的格式重写, 如果不按照规定会引发一些未知的错误
1.必须先初始化父类, 再初始化子类
2.必须判断父类是否初始化成功, 只有父类初始化成功才能继续初始化子类
3.返回当前对象的地址
- (instancetype)init
{
// 1.初始化父类
// 只要父类初始化成功 , 就会返回对应的地址, 如果初始化失败, 就会返回nil
// nil == 0 == 假 == 没有初始化成功
self = [super init];
// 2.判断父类是否初始化成功
if (self != nil) {
// 3.初始化子类
// 设置属性的值
_age = ; }
// 4.返回地址
return self;
}
如果该构造方法需要我们自己自定义,比如,不想一创建出来的年龄是6,而是工程师自己传入的值就需要自定义了,格式也必须是固定的
// 必须以init开头,With必须大写。
- (instancetype)initWithAge:(int)age
{
if (self = [super init]) {
_age = age;
}
return self;
}
如果涉及到继承,比如,Student 继承自 Person,
// Person类中有方法:- (instancetype)initWithAge:(int)age;
// Student中有方法:- (instancetype)initWithAge:(int)age andName:(NSString *)name andNo:(int)no; 继承自父类,但是自己多了name和no(number)属性 // student 继承自 person,我们需要设置以下内容 Student *stu = [[Student alloc] initWithAge: andName:@"lnj" andNo:]; // 那么我们在父类和子类中应该分别写上一下代码,自己的事情自己做,子类别干涉父类的方法 // person 父类方法
- (instancetype)initWithAge:(int)age
// 注意: 自定义构造方法中的init后面的With的W一定要大写
//- (instancetype)initwithAge:(int)age
{
if (self = [super init]) {
_age = age;
}
return self;
} // student 子类方法
- (instancetype)initWithAge:(int)age andName:(NSString *)name andNo:(int)no
{
/* 别这样写,设置父类的代码就让父类来做,自己就设置自己的参数就行了
if (self = [super init]) {
// _age = age;
// 狗拿耗子, 多管闲事
// 自己的事情自己做
[self setAge:age];
[self setName:name];
}
*/
if (self = [super initWithAge:age andName:name]) {
_no = no;
}
return self;
}
二、类工厂方法
// 如果仔细观察,iOS构造方法,一般都会对应一个类工厂方法,方便程序员交流,减少代码量 + (instancetype)person
{
// return [[Person alloc] init];
// 注意: 以后但凡自定义类工厂方法, 在类工厂方法中创建对象一定不要使用类名来创建
// 一定要使用self来创建,这样,如果是person的子类来调用该方法,self就代表子类,不然就是person,不符合我们本意
// self在类方法中就代表类对象, 到底代表哪一个类对象呢?
// 谁调用当前方法, self就代表谁
return [[self alloc] init];
} + (instancetype)personWithAge:(int)age
{
// Person *p = [[Person alloc] init];
Person *p = [[self alloc] init];
p.age = age;
return p;
}
构造方法概念,自定义构造(init)方法的用途, 类工厂方法(就是直接用类名 类调用)的更多相关文章
- 设计模式之工厂方法模式VS简单工厂方法模式
名词解释: 简单工厂:这个实在是没什么解释的,就是一个工厂类,然后有一个方法,根据传递的参数可以通过switch(你也可以是if,或者是使用高端的反射 )来进行对象的创建. 工厂方法:定义一个用于创建 ...
- <创建和销毁对象>经验法则——考虑用静态工厂方法代替公有构造方法
一.引出静态工厂方法 对于java类而言,为了让使用者获取它自身的一个实例化对象,会有以下方法: 1.该类提供一个公有的构造方法.在这种情况下,程序可以通过多个“new 构造方法”语句来创建类的任意多 ...
- oc37--类工厂方法
// // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int ag ...
- Objective-C 工厂方法
类方法用来创建对象的方法就是工厂方法 1.无参工厂方法 创建对象,并给属性一个默认值. //无参工厂方法实现 +(Student*)student{ return [[Student alloc]in ...
- [设计模式]<<设计模式之禅>>工厂方法模式
1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...
- 用到的设计模式总结--单例模式+工厂方法模式+Builder模式
一,工厂方法模式和单例模式 工厂方法模式中有一个抽象的工厂接口和一个抽象的产品接口.然后,具体的工厂实现抽象工厂并负责生产具体的产品.由客户端决定 new 哪个具体的工厂,从而生产哪种产品. 因此,与 ...
- Javascript设计模式理论与实战:工厂方法模式
本文从简单工厂模式的缺点说起,引入工厂方法模式,介绍的工厂方法模式的基本知识,实现要点和应用场景,最后举例进行说明工厂方法模式的应用.在之前的<Javascript设计模式理论与实战:简单工厂模 ...
- oc38--类工厂方法在继承中
// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int age; ...
- 工厂方法(Factory Method),思考
最近看见一个关于如何通过工厂方法来重构代码的提问,发现这方面,自己还没有想得特别明白,所以,稍作总结. 只要有构造的地方,就有是用工厂方法的可能. 如果考虑到单元测试和实现的扩展,就有是用工厂方法的必 ...
随机推荐
- eclipse javaw.exe in your current path问题
问题: 第一次运行eclipse的时候,可能会提醒找不到javaw.exe ******等的问题 很坑的! 解决方案: 无法启动Eclipe,因找不到javaw.exe 还是环境变量的问题!!! 注意 ...
- C++11新特性之右值引用(&&)、移动语义(move)、完美转换(forward)
1. 右值引用 个人认为右值引用的目的主要是为了是减少内存拷贝,优化性能. 比如下面的代码: String Fun() { String str = "hello world"; ...
- [BZOJ]4034: [HAOI2015]树上操作
[HAOI2015]树上操作 传送门 题目大意:三个操作 1:a,b,c b节点权值+c 2:a,b,c 以b为根的子树节点权值全部+c 3:a,b 查询b到根路径的权值和. 题解:树链剖分 操作1 ...
- SEO优化---10分钟学会建立高转化率的网站关键词库
想要优化好一个网站,行业的分析,以及关键词的挖掘是必要的,有一定的关键词排名了,但是转化率和流量方面却很不理想这种情况大部分是只注重了有指数的关键词排名,而忽略了长尾关键词和一些没有指数但是可以带来巨 ...
- Markdown编辑器推荐与语法教程--展示版
---恢复内容开始--- 前言 作为一名高级码农,怎能不知道Markdown的正确打开方式,Markdown现在可以说是无处不在,如果你还不知道简书中的代码块是怎么写出来的,小白无疑了.在此特别推荐一 ...
- Linux C程序操作Mysql 调用PHP采集淘宝商品
还是继续这个项目. 在上一篇Linux下利用Shell使PHP并发采集淘宝产品中,采用shell将对PHP的调用推到后台执行,模拟多线程. 此方法有一致命缺点,只能人工预判每个程序执行时间.如果判断时 ...
- React组件性能优化总结
性能优化的思路 影响网页性能最大的因素是浏览器的重排(repaint)和重绘(reflow). React的Virtual DOM就是尽可能地减少浏览器的重排和重绘. 从React渲染过程来看,如何防 ...
- 关于sea.js的笔记
首先,引入sea.js:(注意要直接写在Script标签里,不要写在jquery的页面加载事件里) seajs.config({ base: "./" //seajs的基础路径(组 ...
- Ubuntu apt-get卸载小记
过sudo apt-get install xxxx 安装软件后,总是无法卸载干净,这里以Apache 为例,提供方法:首先sudo apt-get remove apache2再sudo apt-g ...
- selenium新的定位方法,更简洁很方便
亲测是可以的 self.driver.find_element('id','kw').send_keys(u"凯宾斯基")