(NSDictionary *)labelAttrs = 0x00000001

时间:2013-03-19 16:06:00

标签: ios objective-c

做一些调试我打印出一个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

enter image description here

以下是它在Xcode中的外观:

enter image description here

然后当我走过来时:

enter image description here

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

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?

3 个答案:

答案 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。