王中周的技术博客

Stay hungry,stay foolish.

CocoaPods 详解之—-更新篇

CocoaPods 大概是 2011 年出现的开源组件管理工具(目前已支持 Objective-C 和 Swift),近年来普及率越来越高,几乎已是所有 Cocoa 开源项目的标配。另外,很多大点的团队会用 CocoaPods 拆分工程,实现项目插件化。

博主曾在 2014 年写过 CocoaPods 详解 系列文章:CocoaPods详解之——使用篇CocoaPods详解之——进阶篇CocoaPods详解之——制作篇,简单介绍了从使用到亲手制作 CocoaPods 开源组件的过程。

然而随着时间的推移,CocoaPods 有些使用方式也发生了变化,比如组件提交方式等。本文将从 Trunk 和私有仓库两个方面介绍自己对 CocoaPods 的新认识。

手动解析CrashLog之—-原理篇

在上篇文章《手动解析CrashLog之——方法篇》里介绍了手动解析CrashLog的方法,接下来再说说dwarfdumpatos等解析工具是如何从符号表文件中获取到崩溃位置信息的。一切还得从.dSYM符号表文件开始说起。

一、.dSYM文件的生成

符号表文件.dSYM实际上是从Mach-O文件中抽取调试信息而得到的文件目录,实际用于保存调试信息的问价是DWARF,其出身可以从苹果员工的文章《Apple’s “Lazy” DWARF Scheme》了解一二。

1、Xcode自动生成

Xcode会在编译工程或者归档时自动为我们生成.dSYM文件,当然我们也可以通过更改Xcode的若干项Build Settings来阻止它那么干。

2、手动生成

另一种方式是通过命令行从Mach-O文件中手工提取,比如:

1
$ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/dsymutil /Users/wangzz/Library/Developer/Xcode/DerivedData/YourApp-cqvijavqbptjyhbwewgpdmzbmwzk/Build/Products/Debug-iphonesimulator/YourApp.app/YourApp -o YourApp.dSYM

该方式通过Xcode提供的工具dsymutil,从项目编译结果.app目录下的Mach-O文件中提取出调试符号表文件。实际上Xcode也是通过这种方式来生成符号表文件。

手动解析CrashLog之—-方法篇

解决崩溃问题是移动应用开发者最日常的工作之一。如果是开发过程中遇到的崩溃,可以根据重现步骤调试,但线上版本就无能为力了。好在目前已经有很多不错的第三方CrashLog搜集平台(如友盟、Crashlytics等)为我们做好了解析工作,甚至在Xcode7里苹果也跟进了解析线上版本崩溃日志的功能,为开发者减轻了不少负担。尽管通常已经不需要我们手工处理CrashLog,了解CrashLog的还原原理和方法还是有必要的。

一、.dSYM

.dSYM(debugging SYMbols)又称为调试符号表,是苹果为了方便调试和定位问题而使用的一种调试方案,本质上使用的是起源于贝尔实验室的DWARF(Debugging With Attributed Record Formats),其在.xcarchive目录中的层次结构为:

1
2
3
4
5
6
.xcarchive
--dSYMs
  |--Your.app.dSYM
    |--Contents
      |--Resources
        |--DWARF

关于DWARF的具体内容以后有机会再说。我们能解析CrashLog全靠.dSYM文件,解析方式见后文。

二、确定符号表和崩溃日志的一致性

有了符号表文件,有了崩溃日志文件,在解析之前一定要确保二者的对应关系,否则就算按照下述步骤解析出内容也肯定是不准确的。二者的对应关系可以通过UUID来确定。

离屏渲染学习笔记

一、概念理解

OpenGL中,GPU屏幕渲染有以下两种方式:

  • On-Screen Rendering

意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。

  • Off-Screen Rendering

意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。

iOS Code Signing 学习笔记

最近看了objc.io上第17期中的文章《Inside Code Signing》对应的中文翻译版《代码签名探析》,收益颇深,对iOS代码签名机制有了进一步的认识。想了解详细内容建议大家还是去看原文好了。

下面是对此文章的理解再结合自己之前对该部分的认识写出的学习笔记。本文的前提是已经对非对称加密有了一定的了解。

一、数字签名(digital signature)

对指定信息使用哈希算法,得到一个固定长度的信息摘要,然后再使用私钥(注意必须是私钥)对该摘要加密,就得到了数字签名。所谓的代码签名就是这个意思。

手动内存管理转ARC项目实战

在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事。我参加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题,每周都安排有人值班用Instruments挨个跑功能,关键是每次都总能检查出来不少。其实不管是菜鸟级还是资深级开发者都避免不了写出内存泄露的代码,规则大家都懂,可是天知道什么时候手一抖就少写了个release?

好在项目决定转成ARC了,下面将自己转换的过程和中间遇到的问题写出来和大家共享,希望能减少大家解决同类问题的时间。

iPhone屏幕知识点解析

iphone5-6

一、屏幕相关知识点

1、屏幕尺寸

在显示器世界里,屏幕尺寸都是由屏幕对角线长度表示的,单位是英寸。比如iPhone4的3.5寸屏就意味着屏幕对角线的长度是3.5英寸。

2、分辨率

分辨率是任何一款手机产品最重要的参数之一。显示屏是由一个个像素组成的,分辨率可以简单理解成屏幕像素的数目。比如iPhone4的屏幕分辨率为640×960,就表示屏幕的横向有640个像素点,纵向有960个像素点。

iOS屏幕旋转学习笔记

一、两种orientation

了解屏幕旋转首先需要区分两种orientation

1、device orientation

设备的物理方向,由类型UIDeviceOrientation表示,当前设备方向获取方式:

1
[UIDevice currentDevice].orientation

该属性的值一般是与当前设备方向保持一致的,但须注意以下几点:

①文档中对该属性的注释:

1
@property(nonatomic,readonly) UIDeviceOrientation orientation;       // return current device orientation.  this will return UIDeviceOrientationUnknown unless device orientation notifications are being generated.

所以更推荐下面这种用法:

WWDC2014之App Extensions学习笔记

wwdc_banner_promo

一、关于App Extensions

extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制。

extension的出现,为用户提供了在其它应用中使用我们应用提供的服务的便捷方式,比如用户可以在Todaywidgets中查看应用展示的简略信息,而不用再进到我们的应用中,这将是一种全新的用户体验;但是,extension的出现可能会减少用户启动应用的次数,同时还会增大开发者的工作量。

WWDC2014之iOS使用动态库

苹果的开放态度

WWDC2014上发布的Xcode6 beta版有了不少更新,其中令我惊讶的一个是苹果在iOS上开放了动态库,在Xcode6 Beta版的更新文档中是这样描述的:

Frameworks for iOS. iOS developers can now create dynamic frameworks. Frameworks are a collection of code and resources to encapsulate functionality that is valuable across multiple projects. Frameworks work perfectly with extensions, sharing logic that can be used by both the main application, and the bundled extensions.

详情见官方文档New Features in Xcode 6 Beta

framework是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用,作为一名Cocoa/Cocoa Touch程序员每天都要跟各种各样的Framework打交道。Cocoa/Cocoa Touch开发框架本身提供了大量的Framework,比如Foundation.framework/UIKit.framework/AppKit.framework等。需要注意的是,这些framework无一例外都是动态库。