okeyang's blog

Xcode8新增Debug方法

| Comments

今年的WWDC介绍了不少新的调试方法,可以更加快捷便利的定位问题、分析问题、解决问题,下面就简单介绍一下。

循环布局检测

当你进入某个界面或点击某个按钮后,发现屏幕不再响应事件,然后进入无限等待,debug下可以看到CPU满负荷,RAM也不断增加,那么有可能就进入了循环布局状态。

举个栗子

先说一个简单的循环布局的case,如下图所示。

最底下的subview A在layout时更新superview B的bounds,B因为不在layout状态,所以会使superview B调用其superview C的setNeedsLayout()方法,然后进入layout状态,此时C重置B的bounds,B又使A再次layout。因为对B的bounds设置不一致,导致循环下去。

《深入解析Mac OS X & iOS操作系统》读书笔记

| Comments

本书对OS XiOS的底层细节讲的非常详细,各方面都有所涉及,对于深入了解OS XiOS有很大帮助。对于一般App开发人员来说,我感觉本书内容并不太适合,所以完全以扩充知识面的目标读完本书,以下是以我所关心的内容整理的读书笔记,希望对大家有所帮助。另附亚马逊购买地址方便感兴趣的朋友:)

第一章 达尔文主义:OS X的进化史

  1. OS X是Mac OS ClassicNeXTSTEP的融合。
  2. Darwin是操作系统的类UNIX核心,由kernel、XNU和运行时组成,是OS X和iOS的重要组成部分,OS X的Darwin是开源的,除OS X10.0对应Darwin 1.3.x之外,其他版本都符合:if (OSX.version == 10.x.y) Darwin.version = (4+x).y
  3. 从10.3(Panther)开始,苹果开发了Safari替代IE for Mac;从10.4.4(Tiger)开始,支持Intel x86架构;10.5(Leopard)有了Objective-C 2.0;10.6(Snow Leopard)开始完整支持64位,提供GCD,完全抛弃PPC架构
  4. iOS和OS X对比:
    • iOS基于ARM架构,而OS X基于Intel i386x86_64
    • iOS内核代码依然闭源,OS X内核XNU则是开源的。
    • iOS内核的编译稍有不同,关注的是嵌入式特性和一些新的API。
    • iOS的系统GUI是SpringBoard,OS X为Aqua
    • iOS的内存管理要紧凑得多,因为移动设备没有几乎无穷的交换空间可以使用。
    • iOS应用程序不允许访问底层UNIX API(即Darwin),也没有root访问权限,而且只能访问自己的目录内数据。

Alfred配置

| Comments

一直使用Alfred这款神器,为了将效率更提升一步,最近一狠心,买了的Powerpack,对于每项配置的具体介绍推荐读一下这篇文章:丢掉鼠标-Mac神软Alfred使用手册1。下面重点说一下我的Web SearchWorkflows配置。

Web Search

尽可能把会使用到的搜索地址添加进来,这样就可以尽可能使用Alfred作为入口,提升效率,以下是我自行添加的搜索地址URL

iproxy-通过USB使用SSH连接iOS设备

| Comments

越狱之后用到SSH时需要通过Wi-Fi来连接,输入命令时反应比较慢,还容易掉线,尤其是在越狱开发时,有时会有砸设备、砸Mac的冲动,当然我砸不起,只是想想。

如果能通过USB连接就好了,既不需要依赖Wi-Fi,而且速度非常快,感谢开源社区的大牛们,usbmuxd开源库就顺带实现了这个功能。

ARC与非ARC下的Weak-Strong Dance

| Comments

ARC

在使用block过程中,经常会遇到retain cycle的问题,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (void)dealloc
{
  [[NSNotificationCenter defaultCenter] removeObserver:_observer];
}

- (void)loadView
{
  [super loadView];
          
  _observer = [[NSNotificationCenter defaultCenter] addObserverForName:@"testKey"
                                                                object:nil
                                                                 queue:nil
                                                            usingBlock:^(NSNotification *note) {
      [self dismissModalViewControllerAnimated:YES];  
  }];
}

在block中用到了self,self会被block retain,而_observer会copy一份该block,就是说_observer间接持有self,同时当前的self也会retain _observer,最终导致self持有_observer,_observer持有self,形成retain cycle

xCode下自动打包为ipa文件

| Comments

最近经常给测试发包,用老办法的话总是先生成app文件,然后拖到iTunes下生成ipa文件,虽然说过程简单,但重复做这么件事总会觉得麻烦。因此用xCode命令行工具提供的xcrun工具写成shell,然后再添加到xCode的工程下,这样就很方便的在每次build之后就能生成相应的ipa文件。shell如下: