What is the Objective-C equivalent for "toString()", for use with NSLog?
Asked Answered
S

6

176

Is there a method that I can override in my custom classes so that when

      NSLog(@"%@", myObject) 

is called, it will print the fields (or whatever I deem important) of my object? I guess I'm looking for the Objective-C equivalent of Java's toString().

Serai answered 9/7, 2009 at 15:44 Comment(0)
M
258

It is the description instance method, declared as:

- (NSString *)description

Here's an example implementation (thanks to grahamparks):

- (NSString *)description {
   return [NSString stringWithFormat: @"Photo: Name=%@ Author=%@", name, author];
}
Marv answered 9/7, 2009 at 15:49 Comment(2)
Note if you're using CoreData, the description property is reserved ...and will provide useful debugging information! In that case you'll need to come up with your own unique method name.Klemens
Is debugDescription also reserved? Although I think DebugDescription is supposed to be used by a debugger like LLDB.Xenos
P
37

Add this to the @implementation of your Photo class:

- (NSString *)description {
   return [NSString stringWithFormat:@"Photo: Name=%@ Author=%@",name,author];
}
Partlow answered 9/7, 2009 at 15:57 Comment(0)
S
25

You can override the description method of NSObject:

- (NSString *)description

On the subject of logging I recommend this blog post for better logging in Objective-C.

Spindrift answered 9/7, 2009 at 15:46 Comment(2)
Isn't this a static method? I'd like this to operate on objects rather than the class. For example, if I have a "Photo" class, with fields "name" and "author", I'd like NSLog to print those fields as they are assigned in the object.Serai
Yes - well spotted - I pressed the wrong key. I clearly should pay more attention when proof reading my answers. Thankfully someone had their eye on the ball :-)Spindrift
X
13

There are two functions that you can use.

- (NSString*)description

This will be displayed when you put your object as, I.E. a parameter for NSLog. The other description function is:

- (NSString*)debugDescription

This will be called when you do po anInstanceOfYourClass in the debug command window. If your class doesn't have a debugDescription function, then just description will be called.

Note that the base class NSObject does have description implemented, but it is fairly bare-bones: it only displays the address of the object. This is why I recommend that you implement description in any class you want to get info out of, especially if you use the description method in your code. If you do use description in your code, I suggest you implement debugDescription as well, also making debugDescription more verbose.

Xenos answered 18/1, 2013 at 1:15 Comment(0)
M
1

This will output the available voices:

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
Malinda answered 12/2, 2014 at 7:4 Comment(0)
P
0

I think comment from @Nuthatch of overriding "description" with CoreData (i.e classes inheriting NSManagedObject) should be emphasized

https://developer.apple.com/documentation/coredata/nsmanagedobject?language=objc

Avoid overriding description—if this method fires a fault during a debugging operation, the results may be unpredictable.

Phosphorate answered 11/12, 2020 at 10:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.