NSLog 和 NSLogv 之间的区别

2023-11-27

谁能解释一下 NSLog 和 NSLogv 之间的区别?我知道NSLog用于在控制台打印数据。但什么是NSLogv?


假设你想写一个函数如同NSLog,除了记录消息之外,它还将消息保存到数组中。你会如何实施这个?

如果你写一个可变参数函数 void MySpecialLog(NSString *format, ...),有人可以像 NSLog 一样调用你的函数 -MySpecialLog(@"Hello %@!", name);- 但访问额外参数的唯一方法formata va_list。没有splat操作符在 C 或 Obj-C 中,允许您将它们直接传递给函数内的 NSLog。

NSLogv 通过一次接受所有附加参数来解决这个问题va_list。它的签名是void NSLogv(NSString *format, va_list args)。你可以用它来建立你自己的NSLog 包装器。

Obj-C

void MySpecialLog(NSString *format, ...)
  NS_FORMAT_FUNCTION(1, 2)
    // The NS_FORMAT_FUNCTION attribute tells the compiler to treat the 1st argument like
    // a format string, with values starting from the 2nd argument. This way, you'll
    // get the proper warnings if format specifiers and arguments don't match.
{
    va_list args;
    va_start(args, format);

    // Do something slightly more interesting than just passing format & args through...
    NSString *newFormat = [@"You've called MySpecialLog()! " stringByAppendingString:format];

    NSLogv(newFormat, args);

    va_end(args);
}

您甚至可以使用相同的技术用 Obj-C 方法包装 NSLog。 (并且自从-[NSString initWithFormat:]有一个类似的变体称为-initWithFormat:arguments:,你也可以把它包起来。)

- (void)log:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2)
{
    // Similarly to the above, we can pass all the arguments to -initWithFormat:arguments:.
    va_list args;
    va_start(args, format);
    NSString *message = [[NSString alloc] initWithFormat:format arguments:args];
    va_end(args);

    // Why not both?
    va_start(args, format);
    NSLogv(format, args);
    va_end(args);
}

Swift

在 Swift 中,您可以使用接受的可变参数函数来做到这一点CVarArg...:

func mySpecialLog(_ format: String, _ args: CVarArg...) {
    withVaList(args) {
        NSLogv("You've called mySpecialLog()! " + format, $0)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSLog 和 NSLogv 之间的区别 的相关文章

  • Swift 3 错误:[_SwiftValue pointSize] 无法识别的选择器发送到实例

    我刚刚将我们的项目迁移到 swift 3 发现由于一个问题导致大量崩溃 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 SwiftValue pointSize 发送到实例的无法识别的选择器 该
  • 如何使用正则表达式将字符串分成相同字符的组?

    我有一个这样的字符串 var string AAAAAAABBBCCCCCCDD 并喜欢将字符串分割成这种格式的数组 same characters gt same group 使用正则表达式 Array AAAAAAA BBB CCCCC
  • iOS 11 安全区域布局指南向后兼容性

    启用安全区域布局指南是否与 iOS 11 以下版本兼容 我设法使用新的安全区域布局指南并保持与 iOS 9 和 iOS 10 的向后兼容性 编辑 正如 NickEntin 的评论所指出的 此实现将假定存在状态栏 但在 iPhone X 的横
  • 如何检测Retina高清显示屏?

    UIScreen有一个新的 nativeScaleiOS 8 中的属性 但文档没有提及它 property nonatomic readonly CGFloat nativeScale 还有一个scale属性 但文档说它是 2 用于视网膜显
  • 在另一种语言中使用 dateFormatter [重复]

    这个问题在这里已经有答案了 我正在运行一段返回的代码nil在具有不同语言设置的 iPhone 上运行时 代码示例如下所示 let dateFormatter DateFormatter dateFormatter dateFormat MM
  • Swift 3.0 Pin 颜色注释在 MapView 中没有改变

    我有兴趣根据案例场景更改注释的图钉颜色 在一个函数中 我发送了一个数组 用于确定引脚注释的颜色 到目前为止 我已经设置了一个名为 ColorPointAnnotation 的子类 它将确定 pinColor 然后 在 switch 语句中
  • 为什么我的 tableView 函数运行了 3 次?

    我有一个 UITableView 并且有执行它所需的方法之一 func tableView tableView UITableView numberOfRowsInSection section Int gt Int println sec
  • 线程 1:信号 SIGABRT - AppDelegate.h

    main m Journey Created by Julian Buscema on 2014 07 13 Copyright c 2014 Julian Buscema All rights reserved import
  • 我可以知道 requireGestureRecognizerToFail 到底会做什么吗?

    谁能告诉我下面的代码行到底会做什么 我已经提到过Apples https developer apple com library ios documentation uikit reference UIGestureRecognizer C
  • 使用 Storyboard 时获取 NSManagedObjectContext

    目标是获取当前的 NSManagedObjectContext 以便使用 Core Data 在 iOS 4 3 中 我将 UINavigationController 的委托设置为 AppDelegate 如下所示 在 AppDelega
  • 在 swift 中获取 NSImage 的 PNG 表示

    嘿 我在获取 NSImage 对象的 PNG 表示时遇到了一些问题 这就是我正在做的 var imgData NSData coverImgView image TIFFRepresentation var bitmap NSBitmapI
  • Objective-C 中 typedef 枚举语句在哪里?

    我担心的一个基本问题 以下代码有效 并且 typedef 枚举被识别 但我收到一条警告消息 空声明中无用的存储类说明符 我在这里做错了什么吗 这是放置 typedef 枚举的最佳位置吗 import
  • Swift - 预期 '{' 启动 setter 定义

    我正在关注高级 swift WWDC 2014 视频 使用类上的下标来委托给类属性 但使用与视频中相同的语法时出现错误 enum Direction case North South East West class Place Thing
  • ARC 可以与 Core Graphics 对象一起使用吗?

    我最近开始了一个使用自动引用计数 ARC 的新项目 当我分配 CALayer 的内容时 UIView view UIImage image view layer contents image CGImage 我收到一个错误 ARC 不允许将
  • 快速将阴影绘制到 uibezierpath

    我有一个奇怪的问题 尽管我确实阅读了很多有关如何执行此操作的教程 但最终结果仅显示贝塞尔线 而不显示任何阴影 我的代码非常简单 let borderLine UIBezierPath borderLine moveToPoint CGPoi
  • iOS 以编程方式将 AVI 转换为 MP4 格式

    我的应用程序中有一个查询 因为我想将 AVI 格式的视频转换为 MP4 电影格式 所以有没有什么方法可以以编程方式执行此操作 任何代码片段将不胜感激 你需要使用AVAssetExportSession将视频转换为 mp4格式 下面方法转换
  • 使用 Objective-C 进行 Windows 开发

    最近读了一篇关于 Objective C 的文章 我觉得它是一门相当简洁的语言 具有很多很酷的功能 我无意进行任何 iPhone 开发 但是我了解 GCC 能够编译 Objective C 代码 所以我想知道 Objective C 是 W
  • Switch 语句,其中 value 为 Int 但 case 可以包含数组 [重复]

    这个问题在这里已经有答案了 我想将我的值数组作为 switch 语句的案例 我有一个值数组 let intValues 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 100 我想使用
  • 如何在 xcode 中使用相同的 nib 文件创建多个窗口

    我有一个使用表格视图作为界面的 iPhone 应用程序 每次用户点击其中一个表格单元格时 我想向用户显示另一个窗口 然而 我推入导航控制器的窗口的用户界面非常相似 因此 我决定制作一个 通用 nib 文件 以便在该通用 nib 文件的文件所
  • Swift 中的字典是否应该转换为类或结构?

    我正在开发一个本机 iOS 应用程序 该应用程序从我们也可以控制的 Web 服务接收 JSON 格式的数据 该计划是在大约 18 个月内更换后端数据库 以支持不同的平台 考虑到这一点 我们希望确保 iOS 应用程序能够相对容易地适应新的数据

随机推荐

  • 应用 AWS IAM 策略后我应该等待多长时间才能生效?

    我以编程方式添加和删除 AWS IAM 用户策略 但应用这些策略时得到的结果不一致 例如 这可能会成功 也可能不会成功 我使用的是 Java 1 6 6 SDK 从可以从特定存储桶读取数据的用户开始 清除用户策略 列出策略 然后为每一项调用
  • EXCEL VBA - 将工作簿导出到受密码保护的 ZIP 文件

    无论如何 是否可以修改 Ron De Bruin 的代码以将当前工作簿导出到密码保护zip 文件 我已经环顾了一段时间 但不知道如何启用这样的选项 代码在这里 http www rondebruin nl win s7 win001 htm
  • 为什么 CanRead 和 CanWrite 在 C# 中对于具有重写访问器的属性返回 false?

    当尝试从派生属性获取属性访问器或使用 CanRead CanWrite 时 由于某种原因 不考虑基本自动属性 CanRead and CanWrite仅基于派生类型返回值 也GetMethod and SetMethod不包含基类型的方法
  • 使用 php 设置 mp3 的专辑封面

    我正在寻找使用 PHP 设置 mp3 专辑艺术的最佳或任何方法 建议 专辑封面是根据 ID3v2 规范标识为 附加图片 的数据框 并且 getID3 现在只是用纯 PHP 在 ID3v2 中写入所有可能的数据帧的一种方法 看这个来源 htt
  • 将文件加载到 RichTextBox 时,某些超链接不会触发 LinkClicked 事件

    在 NET 4 7 中的一个简单的 Windows 窗体应用程序中 我只有一个RichTextBox在我的表格上 我正在从本地加载在 MS Word 2016 中创建的 rtf 文件 超链接已在 Word 中设置 问题是并非所有链接都会触发
  • 标签如何与非循环语句一起使用?

    根据ECMAScript 5 1 规范 第 12 12 节 任何语句都可以被标记 在简短的测试中 我的浏览器接受了任何语句之前的标签 该规范还规定标签仅用于break and continue语句 快速测试显示 如果这些语句引用的标签未引用
  • 使用 addEventSource 时出现 FullCalendar v.2.2.6 'hasTime' 未定义错误

    我目前正在尝试测试FullCalendar 版本2 2 6 addEventSource button click function calendar fullCalendar removeEventSource cal events 1
  • 没有 GPL 许可证的 Android PDF 查看器库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在寻找一个没有 GPL 许可证的 Android PDF 查看器库 有人知道是否有可用的免费许可证库吗 因为我一直在闲逛 发现一些开源库 如 MuPDF Android PDF
  • 执行wait()后,如果一个线程没有得到其他线程的通知,它会等待多长时间?

    在下面的示例中 由于主线程没有收到子线程的通知 因此它应该永远等待 但是主线程正在执行 下面示例的输出是 c l total 19900 为什么主线程会被执行 public class ThreadX extends Thread stat
  • 如何在 Java 中向 XML 输出添加回车符

    在 Java 中 如何在生成的 XML 文件中输出回车符 以便所有内容都不在一行上 DocumentBuilderFactory docFactory DocumentBuilderFactory newInstance DocumentB
  • 是否有用于排序方法的 Visual Studio 2010 扩展?

    StyleCop要求对 C 文件的内容采用特定的排序顺序 例如 字段应在方法之前声明 公共声明应在私有声明之前 如果有一个 Visual Studio 扩展可以自动将这些内容移至该顺序 将会非常有用 Does a good为此存在扩展名 我
  • 排除 s3cmd 同步的文件夹

    我正在使用 s3cmd 我想知道如何排除存储桶中的所有文件夹并仅同步存储桶根 例如 bucket folder two folder two file jpg get jpg 通过同步 我只希望它同步 get jpg 并忽略文件夹及其内容
  • 呼叫操作员 & 的命令是什么?

    I used ls alias 并试图找到 然而 不在输出中 什么是 是不是以下的组合Invoke Command and Invoke Expression 是否有其他操作员在 PowerShell 中没有 cmdlet 呼叫接线员 允许
  • 如何处理 DataGridViewCell 中的 KeyEvent?

    有没有Keydown事件一DataGridViewCell 我想做的是 当用户在特定单元格中键入内容时 他可以按 F1 来获取该特定列的帮助 并且会弹出一些表格 这是什么事件 I found this在论坛中编写代码 并且有效 privat
  • 消息“警告:函数的隐式声明”

    我的编译器 GCC 向我发出警告 警告 函数的隐式声明 为什么它会来 您正在使用编译器尚未看到其声明的函数 原型 yet 例如 int main fun 2 21 The compiler has not seen the declarat
  • 托管 C++ 中的数组初始化

    我希望声明并初始化一个一维托管项目数组 如果是C 代码 我会这样写 VdbMethodInfo methods new VdbMethodInfo new VdbMethodInfo Method1 new VdbMethodInfo Me
  • 如何在命令行中编译多个java源文件

    我知道跑步javac file1 java产生file1 class if file1 java是唯一的源文件 那么我只能说java file1运行它 但是 如果我有 2 个源文件 file1 java and file2 java 那么我
  • Hibernate - 唯一列约束被忽略

    我有一个 MySQL 表来保存标签 即像 Stack Overflow 上使用的标签一样 它只有一个 id pk 和一个用于保存标签本身的标签列 我的标签实体的带注释的 get 方法如下所示 Id GeneratedValue strate
  • 将 YCbCr 颜色空间映射到 RGB

    我正在尝试使用 python 进行 JPEG 压缩 我加载 tiff 图像并将其存储为 numpy uint8 RGB 数组 我这样做是为了颜色映射 def rgb2ycbcr im cbcr np empty like im r im 0
  • NSLog 和 NSLogv 之间的区别

    谁能解释一下 NSLog 和 NSLogv 之间的区别 我知道NSLog用于在控制台打印数据 但什么是NSLogv 假设你想写一个函数如同NSLog 除了记录消息之外 它还将消息保存到数组中 你会如何实施这个 如果你写一个可变参数函数 vo