因为自己现在大四了,而且今年也发生了挺多的事情,第一次有想写总结的想法。所以就趁着 2016 年的尾巴来写一篇总结。

前几天在看响应者链条的时候,看到 UIResponder 有两个很有用的属性,但是自己不熟悉,就是 inputViewinputAccessoryView。原来自己练手的时候,需要这样的功能,但是自己不知道这两个属性,导致自己花费了很多时间。所以,就写下这篇,算是对不知道的知识的补充。

响应者链条在刚学 iOS 的时候有学过,但是平常开发也很少去仔细思考,也没有发生过很大的错误,所以就更加不会去考虑 What Under The Hood。

在实习的时候要做自定义 transition。我在 UITransitionView 上添加了一个 subview 作为背景 view,点击这个背景的 view,要 dismiss 掉 present 的 ViewController,给背景的 view 添加了一个 UITapGestureRecognizer,但是背景的 view 就是死活不响应点击。来来回回折腾了好久才找出原因:事件根本就没有传递给背景的 view 😭😭。

我们知道 iOS App 有五种状态:not running/inactive/active/background/suspended,当用户按下 Home 键的时候,App 就会进入 background 状态,随后进入 suspended 状态。在 suspended 状态下,我们没有办法对 App 进行任何操作。所以,我们会尽量在 background 状态下就做好 App 的一些清理等操作,来使 App 有进入 suspended 的准备。但是,iOS 系统分配给 App 的 background 状态下的时间是有限的,我们需要做一些自定义的操作来向 iOS 系统申请更多的后台时间,或者直接常驻后台。例如一些音乐类 App,当我们退出这类 App,我们还是可以听到 🎵 的播放,这些 App 就属于常驻后台的 App。

这一篇介绍如何将 Autolayout 应用到 UIScrollView 上。

在 [UIScrollView Tutorial: Getting Started][2] 这篇文章中的 Scrolling and Zooming a Large Image 这节中,给 UIScrollView 添加 top/bottom/leading/trailing 的约束,确定 UIScrollView 的 frame。再给 UIScrollView 中的 UIImageView 添加 constant 为 0 的 top/bottom/leading/trailing 约束,运行之后,UIScrollView 中的 contentSize 就是图片的大小,可以滚动查看所有内容。

申明:以下知识点均来自网络,来源均在每节最前面给出,侵删。
感谢愿意分享知识的人 🙏🙏,是他们让我们学习了更多更好的知识。

前一段时间准备百度面试总结的一些知识点,虽然面试没过 😭😭 把这些东西记录下来,也方便自己以后查看。

The Main Function

每个基于 C 语言的程序的入口都是 main 函数,iOS App 也没有区别。开发 iOS 你不需要自己编写 main 函数,Xcode 的模版项目会自动实现,一般情况下你不需要修改 main 函数。main 函数会将控制权交给 UIKit framework。UIApplicationMain 函数会创建应用的核心对象,从 SB 文件中加载 UI 界面,启动 App 的 runloop 等等。

#import "AppDelegate.h"
 
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

关于在 Main 函数之前发生了什么,可以看这个 [iOS 程序 main 函数之前发生了什么][2]。

这一篇主要是总结自己在看 App Programming Guide for iOS 的一些收获。大部分内容都是来自 App Programming Guide for iOS。

Xcode 创建的新项目能直接运行在真机和模拟器上,但是你需要做一些自定义才能提交到 App Store 和给用户提供好的体验。

背景:今天百度面试被问到线性链表的反转,哈哈哈哈哈 不会,数据结构算法之类的永远是心中的伤痛,自己慢慢想啊想,还是想出了一个比较 low 的解决方法,回到家自己上网搜了一下解决方法,有四种解决方法之多:

在我年少无知的时候其实就已经写过一篇关于 GCD 的文章,自己现在拿出来看觉得有点羞愧,发现自己对 GCD 的认识基本上还是停留在一年前的水平,所以自己开始慢慢补上 GCD 的知识。

将以前写的东西拿出来充字数提醒自己。

在 StackOverflow 上看到 [这篇讨论][1] 的时候,让我发现了自己的盲区,所以写下这篇文章记录一下。

有一次在项目中使用的 enumerateObjectsUsingBlock 遍历数组的时候,使用了 return,当时没有多想,在 code review 的时候被同事指出,当时觉得不妥就改掉了,今天突然想起就去搜了一下。项目中好像没有直接跳出方法,而是执行到循环外面(这里的需求是当遍历到最后一个直接跳出循环,return 在 enumerateObjectsUsingBlock 相当于 continue,所以项目中会造成直接跳出循环)。

UITableView 应该是 iOS 开发中最重要的控件,当我们要展示多个相似的模型数据的时候,毫无疑问 UITableView 是最好的选择,Apple 已经将 UITableView 的优化做到非常极致了,满足我们简单的模型数据展示基本上是没有问题的。但是很多时候,我们展示的不是简简单单的文字数据,还有其他对性能消耗很大的数据,例如:图片等。在数据不多的情况下,遵循 UITableView 的标准使用方式就能满足要求。像 Twitter / Weibo 这样的数据模型很复杂,数量也很多的情况下,我们就需要通过各种手段来优化 UITableView 的滚动流畅度。

PS:翻译水平有限,推荐看原文

下载 Playgroung 文件

原文链接.

因为 Swift 的强类型和不可变性,所以就有规则防止你在一个对象完全初始化之前访问属性。

我不喜欢在一个函数体内做太多的事情,所以我会将初始化函数分成多个函数,这样问题就来了。

在利用 Objective-C 的开发中,我们需要创建许多的类,类包括成员变量和成员方法/类方法 (Objective-C 中没有类成员变量)。但是大部分 Obj-C 的类文件中都看不到成员变量的申明,我们更多看到的是形如: @property (nonatomic, copy) NSString *name; 。这是因为当我们这样写之后,Xcode 会自动为我们添加成员变量,并生成相应成员变量的存取方法。