【问题标题】:[NSObject description][NSObject description]
【发布时间】:2012-08-04 21:42:14
【问题描述】:

你好,能不能给我举例说明一下这个方法的使用方法

+(NSString *)description

我是否将描述与 NSObject(任何类型的对象)或 NSString 的实例一起使用?

还是我不用实例直接使用 NSObject(任何类型的对象)或 NSString?

【问题讨论】:

  • 请注意,除了调试或日志记录之外,切勿将description 方法用于任何目的。

标签: objective-c ios c foundation


【解决方案1】:

实例的描述为您提供了有关您创建的特定实例的信息。

- (NSString *)description;

NSString *string = [NSString alloc] initwithString:@"aString"]];
[string description];

为您提供有关此实例的信息(内存中的位置等)

另一边:

+ (NSString *)描述;

[NSString description];

为您提供有关 NSString 类的信息。

相同的规则适用于所有 NSObject 子类和其他符合 NSObject 协议的类,例如 NSArrayNSDictionary *NSProxy* 等

【讨论】:

  • 实际上,-description 是任何实现NSObject 协议 的类的必需方法。这包括 NSObject 子类,但也包括不是 NSObject 子类但会影响协议的类,例如 NSProxy。
  • 感谢您的出色回答。和我想的一样。
  • @GeorgeSach 哇太棒了!可惜我只能投票一次!
  • 我的问题是NSObject如何调用[NSObject description];因为NSStringNSObject的子类,NSObject如何返回一个字符串?我知道类转发将如何覆盖协议,但是描述类方法如何工作?
【解决方案2】:

假设我们有:

@interface randomObject : NSObject
{
    NSString  *yourString;
}

在某处:

yourString = [[NSString alloc] initWithString:@"random text"];

那么我们可以像这样覆盖randomObject...

- (NSString *)description
{
  return [NSString stringWithFormat:@"%@", yourString];
}

完成此操作后,我们可以使用 NSObject 调用 NSLog:

-(void)viewDidLoad {
    randomObject *ourObj;

    ourObj = [[randomObject alloc] init];

    NSLog(@"%@", ourObj); //  this will output "random text"
}

【讨论】:

    【解决方案3】:

    您似乎主要对类和实例方法之间的区别感到困惑。

    NSObject 声明了 类方法 +[NSObject description],正如文档告诉您的那样,“返回一个表示接收类内容的字符串。”。如果您将消息description 发送到类对象,如下所示:

    [NSArray description];
    [NSNumber description];
    [[someObject class] description];
    

    这个方法会被调用,你会得到这个类用来描述自己的字符串。

    另一方面,NSObject protocol 声明了一个必需的实例方法 -[id<NSObject> description],它将返回“描述接收者内容的字符串”。当你把它发送到一个实例时,你会得到一个代表它的字符串:

    NSNumber * n = [NSNumber numberWithInt:10];
    [n description];
    NSArray * arr = [NSArray arrayWithObjects:@"Lemon", @"curry", @"?", nil];
    [arr description];
    NSDicitonary * d = [NSDictionary dictionaryWithObject:arr forKey:n];
    [d description]; 
    

    NSObject 的所有子类都继承了这两个方法,并且它们可以像任何其他方法一样被覆盖。例如,请注意 NSDictionaryNSArray 自行格式化并将 description 发送到它们包含的对象。

    还应注意,当使用NSLog() 时,%@ 格式说明符会导致description 被发送到其参数(无论是类对象还是实例)。

    【讨论】:

    • 您好,感谢您的回答。当我使用类方法[NSArray描述];它给了我预期的表达错误。
    • 你的方法或函数中有这个吗?
    • 您好,如果您能给我一个 [NSArray description]; 的正确用法示例,我将不胜感激。
    • 我上面给出的代码是正确的;它需要在方法或函数的主体中。如果您编写的某些代码有特殊问题,您应该随时将其作为问题发布。
    【解决方案4】:

    实际上最常用的调用

    - (NSString *)description;
    

    它用于通常的实例,而不是类。它可以在自定义类中被覆盖以提供有关对象的详细信息。如果你试图以字符串的形式访问一个类,描述方法将被自动调用。

    NSLog(@"array: %@", array);               //Identical
    NSLog(@"array: %@", [array description]); //Identical
    

    你可以像你说的那样在课堂上使用它

    [NSArray description];
    

    【讨论】:

    • “尝试将类作为字符串访问”是什么意思?
    • Objective-C 具有动态类型的含义,在运行时,您可以访问任何类的变量作为另一个类的成员。这是该语言的一个强大且通常有害的方面。
    • %@ 格式说明符不会“将类作为字符串访问”——它会将 description 发送到参数。
    • @JamesPaolantonio 我不确定我是否关注你。无论如何,“%@”格式说明符可以接受任何 Objective-C 对象,而不仅仅是字符串。当您将 array 作为参数传递给 NSLog 并使用包含“%@”的格式字符串时,description 确实会被调用,但不是因为您试图以某种方式“访问”array“作为字符串” .
    【解决方案5】:
    +(NSString *)description
    

    主要用于调试,由实例使用。它允许打印对象的描述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 2014-09-16
      • 2019-08-30
      • 1970-01-01
      相关资源
      最近更新 更多