gpt4 book ai didi

objective-c - Xcode 中的 NSObject 描述和自定义摘要

转载 作者:太空狗 更新时间:2023-10-30 03:33:45 25 4
gpt4 key购买 nike

我重写了对象的 -(NSString*)description 但是 Xcode 总是在变量 View 的摘要字段中显示 error: summary string parsing error

我目前的实现如下:

- (NSString*)description {
return [NSString stringWithFormat:@"<%@ %p> x=%f, y=%f", self.class, self, _x, _y];
}

如果我在控制台中键入 po objectName,LLDB 会按预期显示良好的输出,但是 Xcode 和命令 p objectName 总是指示错误,那么正确的调试描述格式是什么使汇总字段工作?值得注意的是,“p”命令的输出与您在 Xcode 中看到的基础类实例的摘要消息相同。

更新:

据我从“Xcode 中的 WWDC 2012 session 调试”中可以看出,自定义摘要只能使用自定义 python 脚本来实现。 -(NSString*)description-(NSString*)debugDescription 方法无论如何都不会连接到摘要消息。我以为它们是因为我显示了错误,但它似乎是没有自己的格式化程序的类的标准消息。

最佳答案

我至少建议:

- (NSString*)description {
return [NSString stringWithFormat:@"%@; x=%f, y=%f", [super description], _x, _y];
}

这样您就不会手动复制 NSObject 默认值,从而阻止您的父类(super class)可能选择包含的任何非默认行为。

除此之外,“摘要字符串解析错误”是一个 lldb 错误。它仅由调试器报告。每its documentation , po 对于 Objective-C 对象是正确的; p 用于 C 或 C++ 对象。所以你不必理会那个错误——它实际上只是告诉你你使用了错误的 lldb 命令。

编辑:就其值(value)而言,CFArray 使用的方法是 open source看起来像:

static CFStringRef __CFArrayCopyDescription(CFTypeRef cf) {
CFArrayRef array = (CFArrayRef)cf;
CFMutableStringRef result;
const CFArrayCallBacks *cb;
CFAllocatorRef allocator;
CFIndex idx, cnt;
cnt = __CFArrayGetCount(array);
allocator = CFGetAllocator(array);
result = CFStringCreateMutable(allocator, 0);
switch (__CFArrayGetType(array)) {
case __kCFArrayImmutable:
CFStringAppendFormat(result, NULL, CFSTR("<CFArray %p [%p]>{type = immutable, count = %u, values = (%s"), cf, allocator, cnt, cnt ? "\n" : "");
break;
case __kCFArrayDeque:
CFStringAppendFormat(result, NULL, CFSTR("<CFArray %p [%p]>{type = mutable-small, count = %u, values = (%s"), cf, allocator, cnt, cnt ? "\n" : "");
break;
}
cb = __CFArrayGetCallBacks(array);
for (idx = 0; idx < cnt; idx++) {
CFStringRef desc = NULL;
const void *val = __CFArrayGetBucketAtIndex(array, idx)->_item;
if (NULL != cb->copyDescription) {
desc = (CFStringRef)INVOKE_CALLBACK1(cb->copyDescription, val);
}
if (NULL != desc) {
CFStringAppendFormat(result, NULL, CFSTR("\t%u : %@\n"), idx, desc);
CFRelease(desc);
} else {
CFStringAppendFormat(result, NULL, CFSTR("\t%u : <%p>\n"), idx, val);
}
}
CFStringAppend(result, CFSTR(")}"));
return result;
}

与上面的其他评论一样,我敢打赌答案是:Xcode 的调试器在任何意义上都不聪明,而且绝对不够聪明,无法使用正确的 po 方法获得 Objective-C 描述;如果您的对象是未变形的 Objective-C 对象,那么调试器将无法弄清楚。

关于objective-c - Xcode 中的 NSObject 描述和自定义摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18090580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com