【问题标题】:Debuging problems - Values are hidden调试问题 - 值被隐藏
【发布时间】:2015-05-04 08:23:35
【问题描述】:

我需要一些关于他可能导致我的问题的想法。我有一个源代码,我想对其进行一些调试,但我看不到变量。

例如:

NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
NSLog(@"The content of oldSavedArray is%@",oldSavedArray);

我明白了:

2015-05-04 11:06:28.275 MobilePocket[59803:12619613] The content of oldSavedArray is(
    "<MPCheckedCurrency: 0x7f9903b21090>",
    "<MPCheckedCurrency: 0x7f9903b20fc0>",
    "<MPCheckedCurrency: 0x7f9903b21130>",
    "<MPCheckedCurrency: 0x7f9903b21170>",
    "<MPCheckedCurrency: 0x7f9903b21510>",
    "<MPCheckedCurrency: 0x7f9903b21190>"
)

或为此:

 NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
    NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:currencyCheckedArrayKey];

我得到这样的东西:

(lldb) po dataRepresentingSavedArray
<62706c69 73743030 d4010203 0405064d 4e582476 65727369 6f6e5824 6f626a65 63747359 24617263 68697665 72542474 ...etc

可能是这个问题:

@implementation MPCheckedCurrency

@synthesize currencyCode;
@synthesize currencyValue;

- (void)encodeWithCoder:(NSCoder *)coder;
{
    [coder encodeObject:currencyCode forKey:currencyCheckedCodeKey];
    [coder encodeObject:currencyValue forKey:currencyCheckedValueKey];
}

- (id)initWithCoder:(NSCoder *)coder;
{
    self = [super init];
    if (self != nil)
    {
        self.currencyCode = [coder decodeObjectForKey:currencyCheckedCodeKey];
        self.currencyValue = [coder decodeObjectForKey:currencyCheckedValueKey];
    }
    return self;
}

如何查看数组的内容? 任何帮助将不胜感激!

【问题讨论】:

  • NSLog上打个断点,之后就可以查看数组中的内容了。
  • 您的数组包含 MPCheckedCurrency 的对象
  • 好的,我该怎么做才能看到这些值?

标签: ios objective-c debugging nscoder nsarchiving


【解决方案1】:

您正在为每个对象使用[NSObject description] 方法,该方法返回一个字符串,其中包含在此上下文中使用时可能有用的任何内容。有时它根本没有用。

要解决此问题,请在 MPCheckedCurrency 对象中实现 description

- (NSString *)description
{
    return [NSString stringWithFormat:@"[currenyCode=%@, currencyValue=%@]", currencyCode, currencyValue];
}

(您可能还需要在currencyCodecurrentValue 对象中实现description

【讨论】:

    【解决方案2】:

    当你使用NSLog时,它会调用description方法。

    所以不是确切的代码,但您需要执行以下操作;

    @implementation MPCheckedCurrency
    
    @synthesize currencyCode;
    @synthesize currencyValue;
    
    - (void)encodeWithCoder:(NSCoder *)coder;
    {
        [coder encodeObject:currencyCode forKey:currencyCheckedCodeKey];
        [coder encodeObject:currencyValue forKey:currencyCheckedValueKey];
    }
    
    - (id)initWithCoder:(NSCoder *)coder;
    {
        self = [super init];
        if (self != nil)
        {
            self.currencyCode = [coder decodeObjectForKey:currencyCheckedCodeKey];
            self.currencyValue = [coder decodeObjectForKey:currencyCheckedValueKey];
        }
        return self;
    }
    
    -(NSString*)description{
         return [NSString stringWithFormat:@"code: %d, value : %f",currencyCode,currencyValue];
    }
    

    【讨论】:

      【解决方案3】:

      @Adina - 您的问题是您正在 NSLog 上打印完整的对象(数组)。相反,您需要在数组中循环并打印实际的对象值,如下所示:

      for(objmpcheckcurrency in oldsavedarray)
      {
             NSLog(@"The content of oldSavedArray is %@ %@",objmpcheckcurrency.currencyCode, objmpcheckcurrency.currencyValue);
      }
      

      【讨论】:

        猜你喜欢
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        • 1970-01-01
        • 2021-02-15
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        相关资源
        最近更新 更多