Objective-C 构造方法的定义和声明规范

news2024/9/30 15:35:16

总目录 iOS开发笔记目录 从一无所知到入门

文章目录

    • 源码中 NSArray 的构造方法与命名规律
    • 自定义类的构造方法命名
      • 截图
      • 代码
      • 输出

源码中 NSArray 的构造方法与命名规律

在这里插入图片描述

@interface NSArray<ObjectType> (NSArrayCreation)

+ (instancetype)array;
+ (instancetype)arrayWithObject:(ObjectType)anObject;
+ (instancetype)arrayWithObjects:(const ObjectType _Nonnull [_Nonnull])objects count:(NSUInteger)cnt;
+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
+ (instancetype)arrayWithArray:(NSArray<ObjectType> *)array;

- (instancetype)initWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
- (instancetype)initWithArray:(NSArray<ObjectType> *)array;
- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;

/* Reads array stored in NSPropertyList format from the specified url. */
- (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url error:(NSError **)error  API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
/* Reads array stored in NSPropertyList format from the specified url. */
+ (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)) NS_SWIFT_UNAVAILABLE("Use initializer instead");

@end

可以看出,一个类型中,用于返回一个该类型对象的方法(不止是构造方法)的命名规律为以下(其中Xxx表示具体的类名):

  • 方法的返回值可以从 (Xxx *) 变成 (instancetype) ,其中instancetype在该类中表示该类的实例类型。加nullable表示方法的返回值可为空。
  • +开头的类方法的命名:xxx xxxWithArg1: arg2: arg3...
  • -开头的对象方法的命名:initWithArg1: arg2: arg3...

自定义类的构造方法命名

按照上述规律,自定义类,代码如下:

截图

Person类定义:
在这里插入图片描述
main方法调用部分:
在这里插入图片描述

代码

//
//  main.m
//  构造方法
//
//  Created by wuyujin1997 on 2023/2/23.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject {
    @public
    NSString* name;
    int age;
}
+ (instancetype) person;
+ (instancetype) personWithName:(NSString*)name age:(int)age;
- (instancetype) initWithName:(NSString*)name age:(int)age;
@end

@implementation Person
+ (instancetype) person {
    return [Person new];
}
+ (instancetype) personWithName:(NSString*)name age:(int)age {
    Person* person = [Person new];
    person->name = name;
    person->age = age;
    return person;
}
- (instancetype) initWithName:(NSString*)name age:(int)age {
    self->name = name;
    self->age = age;
    return self;
}
// description方法用于改写打印本类对象时的输出内容格式,类似于 Java 中的 toString() 。
- (NSString *)description {
    return [NSString stringWithFormat:@"<%@:%p> name:%@ age:%d", [self class], self, self->name, self->age];
}
@end

int main(int argc, const char * argv[]) {
    NSArray* arr1 = [NSArray new];
    NSArray* arr2 = [NSArray array];
    NSArray* arr3 = [NSArray arrayWithArray:arr1];
    
    Person* p1 = [Person new];
    Person* p2 = [Person person];
    Person* p3 = [Person personWithName:@"wuyujin1997" age:26];
    NSLog(@"%@", p1);
    NSLog(@"%@", p2);
    NSLog(@"%@", p3);
    [p1 initWithName:@"测试赋值" age:22];   // 已有对象,只是调用 initXxx 方法去做属性值的赋值/初始化而已。
    NSLog(@"%@", p1);
    return 0;
}

输出

2023-02-26 20:02:19.759434+0800 构造方法[29043:905161] <Person:0x6000002033a0> name:(null) age:0
2023-02-26 20:02:19.759661+0800 构造方法[29043:905161] <Person:0x600000203400> name:(null) age:0
2023-02-26 20:02:19.759684+0800 构造方法[29043:905161] <Person:0x600000203460> name:wuyujin1997 age:26
2023-02-26 20:02:19.759704+0800 构造方法[29043:905161] <Person:0x6000002033a0> name:测试赋值 age:22
Program ended with exit code: 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud Alibaba全家桶(二)——微服务组件Nacos注册中心

前言 本文为微服务组件Nacos注册中心相关知识&#xff0c;下边将对什么是 Nacos&#xff0c;Nacos注册中心&#xff08;包括&#xff1a;注册中心演变及其设计思想、核心功能&#xff09;&#xff0c;Nacos Server部署&#xff08;包括&#xff1a;单机模式、集群模式&#xff…

常见的开发模型和测试模型

软件的生命周期软件开发阶段的生命周期需求分析->计划->设计->编码->测试->运维软件测试阶段的生命周期需求分期->测试计划->测试设计与开发->执行测试->测试评估开发模型瀑布模型可以看到,这个模型和我们上面的软件开发生命周期很相似采用的是线性…

[LeetCode周赛复盘] 第 334 场周赛20230226

[LeetCode周赛复盘] 第 334 场周赛20230226 一、本周周赛总结二、 [Easy] 6369. 左右元素和的差值1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6368. 找出字符串的可整除数组1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6367. 求出最多标记下标1. 题目描述2. 思路分析3…

软件测试面试项目问答怎么回答才能让面试官认可?

四、项目4.1 简单介绍下最近做过的项目根据自己的项目整理完成&#xff0c;要点&#xff1a;1&#xff09;项目背景、业务、需求、核心业务的流程2&#xff09;项目架构&#xff0c;B/S还是C/5&#xff0c;数据库用的什么? 中间件用的什么&#xff1f;后台什么语言开发的&…

vue3+rust个人博客建站日记1-框架开发环境配置。

背景 阅读了陈皓老师《左耳听风》栏目后&#xff0c;更觉个人知识体系停留在“知道”的阶段&#xff0c;真正动起手来&#xff0c;处处制肘。故决定重新上路&#xff0c;按照《左耳听风》的路线&#xff0c;锻炼一下自己。 个人博客建站&#xff0c;主要是为了熟悉一门前端与…

springboot+vue结合,后端学习前端(三)(前端拦截器+后端拦截器)未登录访问其他页面,直接进入登陆界面

前端拦截器后端拦截器处理#号问题使用 History 模式前端部署到后端项目里&#xff08;tomcat版本由8.5.23需要提高到9.0.56了&#xff09;默认的错误页面后端登录拦截器LoginController添加sessionLoginInterceptor拦截器配置到项目里Vuex 与前端登录拦截器下载 Vuex引入Vuex修…

我继续问了ChatGPT关于SAP顾问职业发展前景的问题,大家感受一下

目录 SAP 顾问 跟其他IT工作收入情况相比是怎么样的&#xff1f; 如何成为SAP FICO 优秀的顾问 要想成为SAP FICO 优秀的顾问 &#xff0c;需要ABA开发技能吗 SAP 顾问中哪个类型收入最多&#xff1f; 中国的ERP软件能够取代SAP吗&#xff1f; SAP 顾问 跟其他IT工作收入情…

java+springboot+vue高校学生医疗保险管理系统

医保管理系统是对与职工健康息息相关的档案进行的系统化、自动化的管理&#xff0c;主要是对职工办理的医疗保险的管理&#xff0c;本系统能够很好的适应社会的需求&#xff0c;最大化的为城镇职工提供服务。医疗保险是国家社会保障体系的重要组成部分&#xff0c;也是社会保险…

【Linux】零成本在家搭建自己的私人服务器解决方案

我这个人自小时候以来就特喜欢永久且免费的东西&#xff0c;也因此被骗过&#xff08;花巨款买了永久超级会员最后就十几天&#xff09;。 长大后骨子里也是喜欢永久且免费的东西&#xff0c;所以我不买服务器&#xff0c;用GitHubPage或者GiteePage搭建自己的静态私人博客&…

Python控制CANoe使能TestCase

前面介绍了多种CANoe配置下的dbc文件添加,常见的配置我们能够常用的就是testcase的使能和环境变量的设置,针对于环境变量的问题,我们下次再进行详聊,今天主要聊一下测试脚本的使能。在做这块之前,我们第一步就需要了解我们的测试脚本的层级是都包含有哪些? 一、测试脚本结…

Mysql 数据库版本升级V1.0

序号版本描述修改审查11.0mysql升级描述&#xff1a;甲方安全审计&#xff0c;发现数据库漏洞&#xff0c;或者定期排查数据库漏洞环境&#xff1a; linux系统准备&#xff1a;第一步下载mysql 安装包https://downloads.mysql.com/archives/community/https://dev.mysql.com/do…

【华为OD机试模拟题】用 C++ 实现 - 新员工座位安排系统(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明新员工座位安排系统题目输入输出示例一输入输出示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 …

产业链金风控基本逻辑

产业链金风控基本逻辑 产业链金融平台作为一个助贷平台&#xff0c;很大程度上是为银行等金融机构进 行引流&#xff0c;贷款的审批本质上还是依赖金融机构的风控。那么&#xff0c;产业链金融 平台是否还有必要建设自己的风控模型呢?笔者给出的答案是肯定的。 一方面&#x…

《高性能MySQL》——MySQL基准测试(笔记)

文章目录二、MySQL基准测试2.1 为什么需要基准测试2.2 基准测试的策略2.2.1 测试何种指标2.3 基准测试方法2.3.1设计和规划基准测试2.3.2 基准测试应该运行多长时间2.3.3 获取系统性能和状态2.3.4 获得准确的测试结果2.3.5 运行基准测试并分析结果2.3.6 绘图的重要性2.4 基准测…

量化学习(一)数据获取

试验环境 windows10 AnacondaPyCharm&#xff08;小白参考文章&#xff1a;https://coderx.com.cn/?p14&#xff09; VM中安装MySQL5.7&#xff08;设置utf8及相应配置优化&#xff09; 关于复权 小白参考文章&#xff1a;https://zhuanlan.zhihu.com/p/469820288 数据来源 AK…

轻量级网络模型ShuffleNet V2

在学习ShuffleNet V2内容前需要简单了解卷积神经网络和MobileNet,以及Shuffnet V1的相关内容&#xff0c;大家可以出门左转&#xff0c;去看我之前的几篇博客MobileNet发展脉络&#xff08;V1-V2-V3&#xff09;&#xff0c;轻量级网络模型ShuffleNet V1&#x1f197;&#xff…

Python—for循环

&#xff08;1&#xff09;for 循环&#xff1a; for循环格式&#xff1a; for 零时变量 in 可迭代对象:   重复执行的代码1   重复执行的代码2   … 代码实例&#xff1a; str_data 12345 # for 提取容器里面的所有数据输出 循环做某个事情# 循环的运行次数和字符串…

【RabbitMQ笔记07】消息队列RabbitMQ七种模式之Publisher Confirms发布确认模式

这篇文章&#xff0c;主要接收消息队列RabbitMQ七种模式之Publisher Confirms发布确认模式。 目录 一、消息队列 1.1、发布确认模式 1.2、案例代码 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;编写生产者【消息确认--单条确认】 &#xff08;3&#xf…

Log4j2基本使用

文章目录1. Log4j2入门2. Log4j2配置3. Log4j2异步日志4. Log4j2的性能Apache Log4j 2是对Log4j的升级版&#xff0c;参考了logback的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带 来了一些重大的提升&#xff0c;主要有&#xff1a; 异常处理&#xff0c…

ubuntu/linux系统知识(36)linux网卡命名规则

文章目录背景命名规范系统默认命名规则优势背景 很久以前Linux 操作系统的网卡设备的传统命名方式是 eth0、eth1、eth2等&#xff0c;属于biosdevname 命名规范。 服务器通常有多块网卡&#xff0c;有板载集成的&#xff0c;同时也有插在PCIe插槽的。Linux系统的命名原来是et…