(NSDictionary*)labelAttrs = 0x00000001

Sno*_*ash 5 objective-c ios

做一些调试我打印出一个NSDictionary变量的描述,它给出了:

(NSDictionary *) labelAttrs = 0x00000001
Run Code Online (Sandbox Code Playgroud)

有人可以澄清为什么会这样1吗?

我理解nil或对象指针,但为什么1

UPDATE

代码:

NSDictionary *labelAttrs = @{NSForegroundColorAttributeName:[UIColor darkGrayColor]};
Run Code Online (Sandbox Code Playgroud)

它在iOS5上运行时崩溃但不是iOS6但是这样:

新对象文字是否向后兼容iOS 5?

似乎说你可以使用iOS5的新文字(只要你针对iOS6构建并使用Xcode> = 4.5并使用最新的LLVM进行编译 - 例如看屏幕抓取).而且,根据Apple的说法,我应该可以使用它们:https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/ObjCAvailabilityIndex/index.html

在此输入图像描述

以下是它在Xcode中的外观:

在此输入图像描述

然后我走过去:

在此输入图像描述

注意:这给了我同样的崩溃:

NSDictionary *labelAttrs = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor darkGrayColor], NSForegroundColorAttributeName, [UIFont fontWithName:CUSTOMFONT size:size], NSFontAttributeName, [NSNumber numberWithInt:0], NSStrokeWidthAttributeName, nil];
Run Code Online (Sandbox Code Playgroud)

删除此(以及以下2行代码)意味着应用程序运行时不会崩溃.但显然没有归因于字符串.

更新:已解决.在iOS5上无法使用归因字符串(至少对于UILabel而言):在iOS 6之前NSAttributedString是否可用?

Hot*_*cks 3

问题是NSAttributedString UIKit 添加直到 iOS 6 才可用。这意味着常量 NSForegroundColorAttributeName 等未定义。因此,字典的创建在尝试引用这些内容时失败了。

(调试此方法的方法 - 无需检查错误 iOS 版本的引用 (;)) - 是分解语句:

UIColor* value1 = [UIColor darkGrayColor];
NSString* key1 = NSForegroundColorAttributeName;
UIFont* value2 = [UIFont fontWithName:CUSTOMFONT size:size];
NString* key2 = NSFontAttributeName;
NSNumber* value3 = [NSNumber numberWithInt:0];
NSString* key3 = NSStrokeWidthAttributeName;

NSDictionary *labelAttrs0 = [NSDictionary dictionaryWithObjectsAndKeys:nil];
NSDictionary *labelAttrs1 = [NSDictionary dictionaryWithObjectsAndKeys:value1, key1, nil];
NSDictionary *labelAttrs2 = [NSDictionary dictionaryWithObjectsAndKeys:value2, key2, nil];
NSDictionary *labelAttrs3 = [NSDictionary dictionaryWithObjectsAndKeys:value3, key3, nil];
Run Code Online (Sandbox Code Playgroud)

然后看看什么地方失败了。在这种情况下,您可能会在分配 labelAttrs1 时失败。如果您随后使用 NSLog value1 和 key1,您会在 key1 上收到错误。)