做一些调试我打印出一个NSDictionary变量的描述,它给出了:
(NSDictionary *) labelAttrs = 0x00000001
有人可以澄清为什么这是1
?
我理解nil
或对象指针,但为什么1
?
更新
代码:
NSDictionary *labelAttrs = @{NSForegroundColorAttributeName:[UIColor darkGrayColor]};
在iOS5上运行但在iOS6上运行时崩溃但是:
Are the new object literals backwards compatible with 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];
删除此代码(以及以下2行代码)意味着应用程序运行时不会崩溃。但显然没有归因于字符串。
更新:已解决。 iOS5上不提供归因字符串(至少对于UILabel而言):Is NSAttributedString available before iOS 6?
答案 0 :(得分:3)
问题是在iOS 6之前NSAttributedString UIKit additions不可用。这意味着未定义常量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];
然后看看失败了。在这种情况下,您可能会在分配labelAttrs1时失败。如果您接着是NSLog value1和key1,那么您将在key1上遇到错误。)
答案 1 :(得分:0)
0x00000001表示内存地址无效。您使用的是什么版本的Xcode?您可能需要从lldb切换到gdb
答案 2 :(得分:0)
当我踩到这样的代码时,我在lldb中看到了0x00000001:
labelAttrs = [self someMethod];
如果在评估-someMethod之前打印labelAttrs,那么它将被分配给0x00000001。