Logging the class name of all UIViewControllers in a project
The answer is to swizzle the methods! Here is what we came up with:
#import "UIViewController+Logging.h"
#import <objc/runtime.h>
@implementation UIViewController (Logging)
-(void)swizzled_viewDidAppear:(BOOL)animated
{
NSLog(@"Current View Class: %@", NSStringFromClass(self.class));
[self swizzled_viewDidAppear:animated];
}
+ (void)load
{
Method original, swizzled;
original = class_getInstanceMethod(self, @selector(viewDidAppear:));
swizzled = class_getInstanceMethod(self, @selector(swizzled_viewDidAppear:));
method_exchangeImplementations(original, swizzled);
}
@end
viewWillAppear
log
Here is a solution to print the current view controller class name when it appears, in the console:
- Create a Symbolic Breakpoint in Xcode
- for Symbol, add
-[UIViewController viewWillAppear:]
- for Action, add a Debugger Command and this expression:
expr -- (void) printf("ð %s\n", (char *)object_getClassName($arg1))
- check Automatically continue after evaluating actions.
This has helped me a lot whenever I got lost in the project!
deinit
log
You can also add a log to see when your view controllers deinit
is called:
- Create another Symbolic Breakpoint
- for Symbol, add
-[UIViewController dealloc]
- for Action, add a Debugger Command and this expression:
expr -- (void) printf("ð %s\n", (char *)object_getClassName($arg1))
- check Automatically continue after evaluating actions.
This one is very handy to make sure the view controller gets released from memory and also a good indicator for catching the retain cycles.
I don't suggest using swizzling as it might risk your code being less maintainable.
Here is solution for this
In your .pch file include this
#define UIViewController MyViewController
#import "MyViewController.h"
Create your new UIViewController sub class as
.h file
#import <UIKit/UIKit.h>
#ifdef UIViewController
#undef UIViewController
#endif
@interface MyViewController : UIViewController
@end
#ifndef UIViewController
#define UIViewController MyViewController
#endif
And .m file
#import "MyViewController.h"
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"Current View Class: %@", NSStringFromClass(self.class));
}
@end