GUI程序开发过程中,庞大的View树总每次总令人花费不少时间进行调试。
当然,程序员总能为这个郁闷的过程开发到方便的工具---view hierarchy。
如果你曾经开发过android程序,那么你应该会了解过Hierarchy Viewer(有可能被墙) 这个官方提供的工具。
在iOS下,Apple并没有提供相关工具。不过幸运的是,有其他开发者开发了相关的工具:
glock45/iOS-Hierarchy-Viewer (开源)
Reveal (商业,闭源,beta阶段)
我强烈推荐大家使用Reveal,尽管它是beta阶段,但已经比较成熟,而且其功能完备,GUI界面也相对清晰,另外支持dylib方式加载省心省力。
介绍一下Reveal的使用方法:
1、下载后,放到/Application/ 目录下
2、在 Reveal.app/Contents/SharedSupport 目录下存放了其文档和framework
3、静态库使用方法,该方法有点是可以在真机和模拟器上使用。
将其Reveal.framework 加入到工程中编译,并同时link 以下三个framework
CFNetwork.framework
QuartzCore.framework
CoreGraphics.framework
最后注意需要将Build Settings的Other Linker Flags设置为-ObjC ,以确保编译的时候会强制link相关代码(否则就会因没有被引用而删除掉)
4、dylib使用方法,优点是可以完全不需要改代码,但你必须要有一个执行代码的环境,如debugger或越狱插件。
1)使用函数启动,添加以下函数,并在启动程序后调用:
void vh()
{
void *revealLib = dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 2);
if (revealLib) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:0];
}
else{
char *error = dlerror();
NSLog(@"Reveal dlopen error: %s", error);
}
}
2)使用lldb启动(或attatch 到其他进程上,如模拟器的MobileSafari,粘贴下面的代码:
(lldb)p (void*)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 2)?(void)[[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:0]:(void)NSLog(@"Reveal dlopen error: %s", (char*)dlerror())
5、打开Reveal,查看结果,这里以MobileSafari为例:
最后补充说明一下:上述代码为了方便所以hardcode了dylib的路径,如果需要在真机上使用,需要将dylib复制到真机上并修改路径。