Object-C自定义对象NSLog输入信息

http://blog.cnrainbird.com/index.php/2012/07/19/object-c_zi_ding_yi_dui_xiang_nslog_shu_ru_you_yong_xin_xi/

继续昨天的故事关于Object-C面向对象开发
自定义完对象以后,想查看对象的信息,于是我们直接NSLog:

NSLog(@"%@",_LocalVideo);

结果输出的是一个内存地址,这肯定不是我们想要的。

2012-07-19 09:37:46.933 umiwiForTest[2463:17803] <LocalVideo: 0x7cc3a9b0>

之前的时候有被同事问到这种情况怎么能输出这个对象的所有信息,我还一本正经的说自已写个循环挨个输出呗,哎,基础不牢害死人。今天自已遇到这个问题了。google一下,很快找到了答案:在自定义的类里实现- (NSString *)description;这个方法就可以了。

#pragma mark - description
- (NSString *)description{
  return [NSString stringWithFormat:
          @"{\n    title = %@,\n subtitle = %@\n}",
          self.title,self.subTitle];
}

运行后的输出

2012-07-19 10:07:13.326 umiwiForTest[2951:17803] {
    title = 邓峰:双向交流做好了,才能提高执行力,
 subtitle = 时长: 00:02:35  点播: 4163日期: 2010-05-07 17:18:00
}

上面看着还不错,可是当我把这个类搁到一个数组里,然后输出数组的时候,还是乱了。

2012-07-19 10:06:22.595 umiwiForTest[2927:17803] (
    "{\n    title = \U9093\U5cf0\Uff1a\U53cc\U5411\U4ea4\U6d41\U505a\U597d\U4e86\Uff0c\U624d\U80fd\U63d0\U9ad8\U6267\U884c\U529b,\n subtitle = \U65f6\U957f: 00:02:35  \U70b9\U64ad: 4163\U65e5\U671f: 2010-05-07 17:18:00\n}",
    "{\n    title = \U674e\U5f00\U590d\Uff1a\U79fb\U52a8\U4e92\U8054\U7f51\U5728\U519c\U6751\U7684\U53d1\U5c55,\n subtitle = \U65f6\U957f: 00:02:14  \U70b9\U64ad: 12064\U65e5\U671f: 2010-04-16 12:42:00\n}",
    "{\n    title = \U674e\U5f00\U590d\Uff1a\U79fb\U52a8\U4e92\U8054\U7f51\U5728\U519c\U6751\U7684\U53d1\U5c55,\n subtitle = \U65f6\U957f: 00:02:14  \U70b9\U64ad: 12064\U65e5\U671f: 2010-04-16 12:42:00\n}",
    "{\n    title = \U674e\U5f00\U590d\Uff1a\U79fb\U52a8\U4e92\U8054\U7f51\U5728\U519c\U6751\U7684\U53d1\U5c55,\n subtitle = \U65f6\U957f: 00:02:14  \U70b9\U64ad: 12064\U65e5\U671f: 2010-04-16 12:42:00\n}",
    "{\n    title = \U674e\U5f00\U590d\Uff1a\U79fb\U52a8\U4e92\U8054\U7f51\U5728\U519c\U6751\U7684\U53d1\U5c55,\n subtitle = \U65f6\U957f: 00:02:14  \U70b9\U64ad: 12064\U65e5\U671f: 2010-04-16 12:42:00\n}"
)

作为有洁癖的人(看到xcode有Warning就要解决掉),这种实在看着不爽,于是查资料找到一个解决办法:

#1: Interestingly, if I make my class a subclass of NSArray then NSDictionary calls descriptionWithLocale:indent: and it formats correctly. Sounds like NSDictionary is "cheating" and testing isKindOfClass rather than respondsToSelector, or else is just prejudiced against non-NS stuff.

It‘s kind of ugly to have to subclass NSArray, though, in terms of acquiring a lot of behaviors I don‘t want to mimic, and carrying extra unused data. Etc

#2: Another option is to convert the escaped string back to its original. This takes a 31-line procedure to handle the basics (\n, \t, \", and \). The up-side is that I don‘t need to subclass NSArray. The main downside is that this routine must be inserted in any NSLog call that could display my class. Another minor downside is that the escaped strings were wrappered with quote characters I can‘t eliminate, but that‘s hardly noticeable.

上面说,要么重新NSArray重新实现description,要么去掉这些特殊字符的转义。想想为了输全一个自已写的类要重新NSArray有点大题小作,而去掉这些特殊字符的转义也不是我想要的,因为我就是格式化出来,方便查看嘛,罢了,罢了,看来是无解,就此搁下。

参考资料:
NSLog – Making an NSObject return useful info
Overriding NSObject Description Method
Print Instances of NSObject’s Sub-class Friendly By Overriding NSObject Description Method
Auto Description Category for NSObject (any object)
NSDictionary `description` formatting problem — treats structure like char data

时间: 2025-01-08 22:37:34

Object-C自定义对象NSLog输入信息的相关文章

利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能

利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能1.在界面上添加几个checkbox和一个接收动态添加div的容器 <div> 功能区域 <br /> <input id="1" type="checkbox" value="新闻" name="11" />新闻 <input id="2" type="checkbox"

自定义对象内容及实例,适合初学者

[自定义对象] 1.基本概念 ①对象是拥有一系列无序属性和方法的集合: ②键值对,对象中的数据,是以键值对的形式存在,对象的每个属性和方法,都对应一个键名,以键取值. ③属性:描述对象特征的一系列变量,称为属性. ④方法,描述对象行为的一系列函数,称为方法. 2.对象的声明 var obj ={ key1:value1, key2:value2, func1:function(){ } } 对象中的数据以键值对的形式存储,键与键值之间用:分隔,多个键值对之间用,分隔 对象中的键,可以是出了数组,

JS自定义对象,正则表达式,JQuery中的一些知识点

一:自定义对象 1.基本概念:①对象:包含一系列无序属性和方法的集合.②键值对:对象中的数据是以键值对的形式存在的,以键取值.③属性:描述对象特征的一系列变量.[对象中的变量]④方法:描述对象行为的一系列方法.[对象中的函数] 2. 对象的声明: ①字面量声明:var obj={}: ②new 关键字:var lisi = new Object(); 3.对象中属性和方法的读写方式: ①通过.运算符:对象内部:this.属性名 this.方法名(); 对象外部:对象名.属性名 对象名.方法名.

【Android基础】Android SQLite存储自定义对象

Android SQLite存储自定义对象 在SQLite数据库中可存储的数据类型有NULL.INTEGER.REAL(浮点型).TEXT.BOOL,一共是五种数据类型.在Android开发中,我们存储数据的一般的作法是数据库的属性就是类的成员变量,比如: 要存储一个人的姓名和年龄,在类中的是将它们定义为两个成员变量 class Person{ private String name; private int age; } 数据库中是将它们存储为两个字段 - name TEXT - age IN

第5章分布式系统模式 Data Transfer Object(数据传输对象)

正在设计一个分布式应用程序,为了满足单个客户端请求,您发现自己对一个远程接口发出了多个调用,而这些调用所增加的响应时间超出了可接受的程度. 影响因素 在与远程对象通信时,请考虑下列需要权衡的因素: 远程调用(那些必须跨越网络的调用)速度缓慢.虽然许多远程调用框架可以隐藏进行远程调用的复杂性,但是它们不能消除发生通信所需的步骤.例如,必须先找到 远程对象位置,而且建立与远程计算机的连接,然后才能将数据串行化为字节流,然后可能进行加密,最后才能将其传输到远程计算机. 在 考虑网络性能时,必须同时考虑

计算机视觉-自定义对象检测器

1.模板匹配 运行指令:python template_matching.py --source 3.jpg --template 2.jpg import argparse import cv2 ap = argparse.ArgumentParser() ap.add_argument("-s", "--source", required=True, help="Path to the source image") ap.add_argume

IOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档

1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒应用沙盒的文件系统目录,如下图所示(假设应用的名称叫Layer)模拟器应用沙盒的根路径在: (apple是用户名, 8.0是模拟器版本)/Users/apple/Libra

jQuery基础(常用插件 表单验证,图片放大镜,自定义对象级,jQuery UI,面板折叠)

1.表单验证插件--validate   该插件自带包含必填.数字.URL在内容的验证规则,即时显示异常信息,此外,还允许自定义验证规则,插件调用方法如下: $(form).validate({options}) 其中form参数表示表单元素名称,options参数表示调用方法时的配置对象,所有的验证规则和异常信息显示的位置都在该对象中进行设置.     2.表单插件--form 通过表单form插件,调用ajaxForm()方法,实现ajax方式向服务器提交表单数据,并通过方法中的option

Exchange 2013 PowerShell创建自定义对象

PowerShell是一个基于对象的Shell,在写一行程序,脚本和函数时,給了我们很大的灵活性.当生成详细的报告时,我们需要从代码中自定义我们的数据输出,或者可以通过管道输送到其它的命令.我们还需要能够控制和定制代码的输出,这样我们可以合并来自多个源的数据到一个单独的对象.在这一节中,我们将学习下基本的构建定制的对象 首先我们要做的时创建一个邮箱对象的集合,将用来作为一组新的自定义对象的数据源: $mailboxes = Get-Mailbox 可以添加自定义的属性用于后续整个管道的对象属性,