1、自定义构造方法的规范

(1)一定是对象方法,一定以 - 开头

(2)返回值一般是id类型

(3)方法名一般以initWith开头

以Person类为例,初始化姓名和年龄属性

Person.h代码

 1 #import <Foundation/Foundation.h>
 2 @interface Person : NSObject
 3 @property NSString *name;
 4 @property int age;
 5 //初始化_name
 6 - (id)initWithName: (NSString *)name;
 7 //初始化_age
 8 - (id)initWithAge: (int)age;
 9 //同时初始化_name和_age
10 - (id)initWithName: (NSString *)name andAge: (int)age;
11 @end

注意第6 8 10行代码:符合自定义构造方法的规范: 1>以 - 开头; 2>返回值类型为id类型; 3>方法名以 initWith开头

Person.m代码

 1 #import "Person.h"
 2 @implementation Person
 3 - (id)initWithName: (NSString *)name
 4 {
 5     if(self = [super init])
 6     {
 7         _name = name;
 8     }
 9     return self;
10 }
11 - (id)initWithAge: (int)age
12 {
13     if(self = [super init])
14     {
15         _age = age;
16     }
17     return self;
18 }
19
20 - (id)initWithName: (NSString *)name andAge: (int)age
21 {
22     if(self = [super init])
23     {
24         _name = name;
25         _age = age;
26     }
27     return self;
28 }
29 @end

上述代码分别对3种自定义构造方法进行实现。

牢记格式:

1 - (id)initWithName: (NSString *)name andAge: (int)age
2 {
3     if(self = [super init])
4     {
5         _name = name;
6         _age = age;
7     }
8     return self;
9 }

main.m代码

 1 #import <Foundation/Foundation.h>
 2 #import "Person.h"
 3 int main(int argc, const char * argv[])
 4 {
 5     Person *person1 = [[Person alloc] initWithName: @"玲玲"];
 6     Person *person2 = [[Person alloc] initWithAge:20];
 7
 8     Person *person3 =  [[Person alloc] initWithName:@"宁宁" andAge:24];
 9
10     NSLog(@"person1名字:%@", person1.name);
11     NSLog(@"person2年龄:%i", person2.age);
12
13     NSLog(@"person3名字叫:%@, 年龄:%i", person3.name, person3.age);
14     return 0;
15 }

运行,输出结果为:

2、假如在创建一个子类Student

Student.h

1 #import "Person.h"
2 @interface Student : Person
3 @property int no;//学号
4 //同时初始化姓名 年龄 学号
5 - (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no;
6 @end

Student.m

 1 #import "Student.h"
 2 @implementation Student
 3 - (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
 4 {
 5     //将name age传递到父类方法中进行初始化
 6     if(self = [super initWithName:(NSString *)name andAge:(int)age])
 7     {
 8         _no = no;
 9     }
10     return self;
11 }
12 @end

这里值得注意的是第6行,我们将name age传递给父类方法进行初始化,而不是在子类中初始化。以后要尽量这么写,体会编程思想。

3、总结

(1)牢记规则:

  1>一定是对象方法,一定以 - 开头

   2>返回值一般是id类型

  3>方法名一般以initWith开头

1 //初始化_name
2 - (id)initWithName: (NSString *)name;
3 //初始化_age
4 - (id)initWithAge: (int)age;
5 //同时初始化_name和_age
6 - (id)initWithName: (NSString *)name andAge: (int)age;

(2)构造方法的结构

1 - (id)initWithName: (NSString *)name andAge: (int)age
2 {
3     if(self = [super init])
4     {
5         _name = name;
6         _age = age;
7     }
8     return self;
9 }

(3)父类中存在的属性,尽量传递给父类方法来初始化。

转载于:https://www.cnblogs.com/xdl745464047/p/4002259.html

06-自定义构造方法相关推荐

  1. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  2. 七:构造方法与自定义构造方法

    一.构造方法 1.在OC中构造方法是init开头的方法, 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值. 构造方法属于对象方法,以"-"开头 例如:在创建对象的时候 ...

  3. 不写默认无参构造方法,调用自定义构造方法时报错No constructor found in com...

    如果在实体类里面自定义构造方法,没有写默认无参构造方法,然后初始化类的对象,调用自定义构造方法的时候,就会报如下错误: 解决办法是:在实体类中加入无参数构造方法即可,如下图

  4. 06 类与对象、封装、构造方法

    更多文章请见:黑马Java基础笔记大纲 第1章 面向对象思想 1.1 面向对象思想概述   Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下, 使 ...

  5. 自定义依赖注解无效_关于Apt注解实践与总结【包含20篇博客】

    超详细!安卓巴士开发者大会嘉宾及主题介绍 目录介绍 00.注解系列博客汇总 01.什么是apt 02.annotationProcessor和apt区别 03.项目目录结构 04.该案例作用 05.使 ...

  6. oc35--自定义构造方法

    // // Person.h#import <Foundation/Foundation.h>@interface Person : NSObject@property int age; ...

  7. id、构造方法、Category 分类、类的本质、description方法、SEL

    1.id: 万能指针id :id对象不能用点语法.id对象本身已经有 * 了 因此变量名不能有 * . 可以吧id理解为 NSObject * 类型数据! int main() { @autorele ...

  8. 杨校老师课堂之Java类与对象、封装、构造方法

    杨校老师课堂之Java类与对象.封装.构造方法 本篇文章内容如下: 面向对象 类与对象 三大特征--封装 构造方法 教学目标 能够理解面向对象的思想 能够明确类与对象关系 能够掌握类的定义格式 能够掌 ...

  9. Android 系统(264)---android进阶——自定义View

    android进阶--自定义View 软件架构 01.自定义View简介 - onMeasure,onDraw,自定义属性  https://www.jianshu.com/p/48944aad200 ...

最新文章

  1. SAP 操作,弹出报错 - 已根据规则拒绝服务器触发的操作,是否要查看上个通讯步骤中触发的操作列表 -
  2. 组件化开发和模块化开发概念辨析
  3. 从硬件到框架,30+巨头参与的AI基准竞争结果公布(第一回合)
  4. 水晶报表自定义函数(替换并截取特殊字符后内容)
  5. 知道Google map上面街景怎么来的吗?-相当强大
  6. 在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
  7. python excel数据框_python – 熊猫数据框到Excel表
  8. 详细分析 Sonlogger 任意文件上传漏洞 (CVE-2021-27964)
  9. markdown与latex:书写单边大括号左边或右边即在没有括号的一端加点
  10. BigInteger简单使用及方法总结
  11. 【设计模式】适配器模式
  12. 花书《深度学习》代码实现:01 线性代数:基本概念+代码实现基本运算
  13. python显示实时时间校对_Python实现系统时间自动校正
  14. PMP考纲解读 |【人】任务3—支持团队绩效(二)
  15. java的try后面跟括号
  16. Java设计模式之装饰器模式 (转)
  17. 使用tree生成目录树结构
  18. hdu4489 The King’s Ups and Downs
  19. 小猿圈python之练习小例子
  20. Python Cerberus

热门文章

  1. python总结简短_Python简单的基础总结
  2. python 手机自动化脚本_iOS python自动化出包脚本
  3. html点击计数器的实现,点击计数器_Servlet 教程_w3cschool
  4. HTML画笔移出画布停止,html5 canvas画布无法清除
  5. 电脑电池修复_笔记本电脑充不进去电如何修复
  6. 微信小程序选择框问题 小程序picker点击显示object range-key=这里写要显示的字段
  7. element tree树组件default-expand-all属性设置默认展开的节点
  8. vue中使用原始html插值,VUE.JS中的插值表达式、v-cloak、v-text、v-html、v-bind:、v-on:...
  9. shell正则表达式截取字符串_从CVE20208816聊聊shell参数扩展
  10. c++ string 数组_PHP数组与字符串之间相互转换的方法