Objective-C description 自定义对象的打印格式/输出的字符串 类似于Java 中的 toString 方法

news/2024/4/24 18:21:42/文章来源:https://blog.csdn.net/wuyujin1997/article/details/129231032

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

文章目录

    • Intro
    • NSObject 源码
    • 测试类
      • 截图
      • 测试代码
      • 输出

Intro

在 Java 中,对于自定义类一般会重写集成自Object类的toString方法,这样在打印该类的对象时,打印出的字符串就是我们在 toString() 方法中返回的字符串值。
而在 Objective-C 中,也有这样的方法。
descriptiondebugDescription

当执行NSLog(@"%@", obj)时候,等效于NSLog(@"%@", [obj description]),该方法的大致实现为:

- (NSString *)description {return [NSString stringWithFormat:@"<%@:%p>", [self class], self];
}

因此,你随意自定义一个类,然后直接打印该类的对象,会看到对象输出为 <Person: 0x6000002033e0> 的格式。

对于自定义类,我们可以重写两个方法:

- (NSString *)description;
- (NSString *)debugDescription;

其中:
description 会在使用%@打印某对象时自动调用,显式调用也可以:[obj description]
debugDescription 要么显式调用[obj debugDescription],要么在Xcode中debug模式下,使用命令po 对象名可以看到重写后的debugDescription返回值( 操作图见后)。

NSObject 源码

在这里插入图片描述

删除一些暂时不需要关注的代码,只关注结构和description相关的成员:

@protocol NSObject
// ...
@property (readonly, copy) NSString *description;
@optional
@property (readonly, copy) NSString *debugDescription;
@end@interface NSObject <NSObject> {Class isa  OBJC_ISA_AVAILABILITY;
}
// ...
+ (NSString *)description;
+ (NSString *)debugDescription;
@end

有两个description相关属性,以及两个description相关的类方法。
【怎么是类方法,不是对象方法?这个问题等暂时不研究。】

在 NSString 源码中搜索 description:
在这里插入图片描述
在 NSArray 源码中搜索:
在这里插入图片描述

测试类

截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试代码

//
//  main.m
//  CSDN-copy
//
//  Created by wuyujin1997 on 2023/2/25.
//
#import <Foundation/Foundation.h>@interface Person : NSObject {@publicNSString* name;int age;Boolean married;
}
+ (instancetype) personWithName:(NSString*)name age:(int)age married:(Boolean)married;
@end@implementation Person
+ (instancetype) personWithName:(NSString*)name age:(int)age married:(Boolean)married {Person* person = [Person new];person->name = name;person->age = age;person->married = married;return person;
}
// NSLog打印对象会调用 description 方法。
- (NSString *)description {return [NSString stringWithFormat:@"<%@:%p> description: name:%@ age:%d married:%d", [self class], self, self->name, self->age, self->married];
}
// Debug模式下,在 lldb 工具中可以查看到对象的字符串描述信息。
- (NSString *)debugDescription {return [NSString stringWithFormat:@"<%@:%p> debug-desc:  name:%@ age:%d married:%d", [self class], self, self->name, self->age, self->married];
}
@endint main(int argc, const char * argv[]) {Person *person = [Person personWithName:@"wuyujin" age:26 married:false];NSLog(@"%@", person);   // 等效于打印 [person description]NSLog(@"%@", [person description]);NSLog(@"%@", [person debugDescription]);NSLog(@"%@", [person classDescription]);return 0;
}

输出

2023-02-26 20:39:13.389500+0800 CSDN-copy[30374:938647] <Person:0x6000002033e0> description: name:wuyujin age:26 married:0
2023-02-26 20:39:13.389725+0800 CSDN-copy[30374:938647] <Person:0x6000002033e0> description: name:wuyujin age:26 married:0
2023-02-26 20:39:13.389751+0800 CSDN-copy[30374:938647] <Person:0x6000002033e0> debug-desc:  name:wuyujin age:26 married:0
2023-02-26 20:39:13.390055+0800 CSDN-copy[30374:938647] (null)
Program ended with exit code: 0

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle Apex 21.2 安装过程

什么是 Oracle APEX&#xff1f; Oracle APEX 是广受欢迎的企业级低代码应用平台。借助该平台&#xff0c;您可以构建功能先进的可扩展安全企业应用&#xff0c;并在任何位置&#xff08;云或内部部署&#xff09;部署这些应用。 使用 APEX&#xff0c;开发人员可快速开发并部…

数据结构入门DAY1

力扣刷题合集&#xff1a;力扣刷题_Sunlightʊə的博客-CSDN博客217.存在重复元素相关题目链接&#xff1a;力扣 - 存在重复元素题目重现给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返…

大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——ReduceTask工作机制

1、ReduceTask工作机制 ReduceTask工作机制&#xff0c;如下图所示。 &#xff08;1&#xff09;Copy阶段&#xff1a;ReduceTask从各个MapTask上远程拷贝一片数据&#xff0c;并针对某一片数据&#xff0c;如果其大小超过一定阈值&#xff0c;则写到磁盘上&#xff0c;否则直…

Active Directory 05 - 初识 AD CS 证书服务

写在最前 如果你是信息安全爱好者&#xff0c;如果你想考一些证书来提升自己的能力&#xff0c;那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里&#xff1a; https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助&#xff0c;并分享学习和实践过程…

1029 旧键盘 C++中find函数的使用

题目链接&#xff1a; 一、自己的想法&#xff1a;&#xff08;弱化版双指针&#xff09; 思路为用两个“指针”i, j分别指向原来字符串和实际输入字符串的第一个字符&#xff0c;然后判断i&#xff0c;j所指字符是否一致&#xff0c;若是则i, j同时&#xff0c;若否则将i所指…

【5G RRC】5G系统消息SIB3介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

Windows下命令执行绕过技巧总结(渗透测试专用)

一、连接符1、双引号不要求双引号闭合举例&#xff1a;"who"a"mi" //闭合的 "who"a"mi //不闭合的2、圆括号必须在两边&#xff0c;不能包括中间的字符。举例&#xff1a;((whoami))3、^符号&#xff08;转译符号&#xff09;不可以在结尾&…

Go项目(商品微服务-1)

文章目录简介建表protohandler商品小结简介 商品微服务主要在于表的设计&#xff0c;建哪些表&#xff1f;表之间的关系是怎样的&#xff1f; 主要代码就是 CURD表和字段的设计是一个比较有挑战性的工作&#xff0c;比较难说清楚&#xff0c;也需要经验的积累&#xff0c;这里…

【机器学习笔记】Python基础笔记

目录基础语法加载数据&#xff1a;pd.read_csv查看数据大小&#xff1a;shape浏览数据行字段&#xff1a;columns浏览少量数据&#xff1a;head()浏览数据概要&#xff1a;describe()输出&#xff1a;to_csv基础功能语法缺省值去除缺失值&#xff1a;dropna按行删除&#xff1a…

Paddle配置

目录&#xff1a; 1.激活环境 2.版本选择 突发情况&#xff1a;ModuleNotFoundError: No module named paddle 检验是否安装成功 1.激活环境 Anaconda&#xff1a; conda remove -n paddle --all conda activate paddle 2.版本选择 打开链接&#xff1a;https://www.pa…

基于企业微信应用消息的每日早安推送

基于企业微信应用消息的每日早安推送 第一步&#xff1a;注册企业微信 企业微信注册地址&#xff1a;https://work.weixin.qq.com/wework_admin/register_wx 按照正常流程填写信息即可&#xff0c;个人也可以注册企业微信&#xff0c;不需要公司 注册完成后&#xff0c;登录…

Google Guice 4:Bindings(2)

4 Scopes (实例的作用域&#xff09; 4.1 默认规则&#xff1a;unreuse instance 到目前为止&#xff0c;通过bind().to()和Provides定义的binding&#xff0c;每次需要注入实例对象时&#xff0c;Guice都会创建一个新的实例 // 修改DatabaseTransactionLog&#xff0c;使其打…

Ncvicat 打开sql文件方法

Nacicat打开sql文件时&#xff0c;有比较多的文章介绍可以直接打开&#xff0c;方法介绍的比较多&#xff0c;但是我遇到了一个坑&#xff0c;就是如何配置环境都无法打开。 本机环境&#xff1a; windows10 mysql 5.7.40 Navicat12.1 一、遇到问题情况 1.1、通过navicat…

【python量化】大幅提升预测性能,将NSTransformer用于股价预测

写在前面 NSTransformer模型来自NIPS 2022的一篇paper《Non-stationary Transformers: Exploring the Stationarity in Time Series Forecasting》。NSTransformer的目的主要是为了解决其他方法出现过平稳化处理的问题。其通过提出序列平稳化以及去平稳化注意力机制可以使得模型…

2023年三月份图形化二级打卡试题

活动时间 从2023年3月1日至3月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

【尚硅谷MySQL入门到高级-宋红康】数据库概述

1、为什么要使用数据库 数据的持久化 2、数据库与数据库管理系统 2.1 数据库的相关概念 2.2 数据库与数据库管理系统的关系 3、 MySQL介绍 MySQL从5.7版本直接跳跃发布了8.0版本 &#xff0c;可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强&a…

CXL技术分析

CXL&#xff0c;全称Compute Express Link&#xff0c;该技术由Intel牵头开发用于高性能计算、数据中心&#xff0c;主要解决处理器、加速器和内存之间的cache一致性问题&#xff0c;可消除CPU、专用加速器的计算密集型工作负载的传输瓶颈&#xff0c;显著提升系统性能。 一、…

python的装饰器与设计模式中的装饰器模式

相信很多人在初次接触python中的装饰器时&#xff0c;会跟我一样有个疑问&#xff0c;这跟设计模式中的装饰器模式有什么区别吗&#xff1f;本质上是一样的&#xff0c;都是对现有对象&#xff0c;包括函数或者类的一种扩展。这篇文档将进行对比分析。 python的装饰器 装饰器…

duboo+zookeeper分布式架构入门

分布式 dubbo Zookeeper 分布式系统就是若干独立计算机的集合&#xff08;并且这些计算机之间相互有关联&#xff0c;就像是一台计算机中的C盘F盘等&#xff09;&#xff0c;这些计算对于用户来说就是一个独立的系统。 zookeeper安装 下载地址&#xff1a;Index of /dist/z…

【数据库系统概论】基础知识总结

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…