Xcode6

忘掉 Reveal,使用 Xcode6 来进行视图层次调试

Xcode 6 提供了许多新特性,视图层次调试(Debug View Hierarchy)便是其中很便捷的特性之一。之前调试视图层次,我们需要借助 Reveal、Spark Inspector 等商业软件,如今 Xcode 引入了这一功能,着实令人兴奋。

Debug View Hierarchy

使用也很简单,在 Xcode 中以调试模式运行程序(模拟器、真机均可),然后就可以在 Xcode 底部调试区域找到 Debug View Hierarchy 的按钮(在跳出和模拟位置中间):

Debug View Hierarchy button

或者,也可以在菜单中找到:Debug -> View Debugging -> Capture View Hierarchy。

点击后稍等就会生成视图层次,同时进程会暂停。用鼠标拖动探索一下吧

视图左下方的滑块可以调整层次间的距离,右下角的滑块可以调整显示的层数,下方的按钮可以控制是否显示 clipped 的内容、是否显示 constraints、放大缩小还原等。当然,如果需要诸如 live 修改等高级功能,还是需要借助 Reveal,但 Xcode 中提供的这些基本功能,大多数情况下也足够了。

PS. 如果你在调试区域找不到那个按钮,菜单中的“Capture View Hierarchy” 也是灰色的,可能是你使用的调试设备为 64 位设备(iPhone 5 以上的模拟器或真机),但你的工程属性中并不支持 64 位的原因。可以尝试使用 iPhone 4S 模拟器,那个按钮应该就会出现了。

Cannot locate compiling with Xcode6

正式推出的 iOS8 中,定位服务分为了 使用应用程序期间始终 两种权限,这导致了一些变化。之前的工程若用 Xcode5 编译,并在 iOS8 上运行,会向用户请求始终获取位置的权限。若用 Xcode6 编译,会发现程序不会向用户请求权限,同时导致无法定位。

解决方法并不复杂,只需在 Info.plist 中加入请求定位权限时显示给用户的提示信息即可:

-Info.plist
1
2
<key>NSLocationWhenInUseUsageDescription</key>
<string>写上为什么要在程序运行时获取位置</string>


-Info.plist
1
2
<key>NSLocationAlwaysUsageDescription</key>
<string>写上为什么要始终获取位置</string>

避免使用 description 等作为属性名

自 Xcode 6 起,继承于 NSObject 的类一定要避免使用 description 等作为属性的名字,否则会被认为是 NSObject 中的 description 属性。

警告内容:

Auto property synthesis will not synthesize property 'description' because it is 'readwrite' but it will be synthesized 'readonly' via another property.

如果在代码中执行了 setDescription,则程序会崩溃,错误信息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AnObject setDescription:]: unrecognized selector sent to instance 0x79e8b260'

如果在代码中试图取 description 的值,则会得到 NSObject 的 description 属性,即该对象的指针,如 <AnObject: 0x7c97f870>

其实本就该避免,只不过之前不会出问题而已。