iOS的主要框架介绍

iOS为应用程序开发提供了许多可使用的框架,并构成IOS操作系统的层次架构,分为四层,从上到下依次为:Cocoa Touch Layer(触摸UI层)、MediaLayer(媒体层)、Core Services Layer(核心服务层)、Core OS Layer(核心OS层)。

在iOS中框架是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像、声音文件等其他资源。共享资源库定义应用程序可以调用的函数和方法。低层次框架提供IOS的基本服务和技术,高层次框架建立在低层次框架之上用来提供更加复杂的服务和技术,较高级的框架向较低级的结构提供面向对象的抽象。

iOS中的主要框架如下

Read More
Share Comments

常用Git命令

  • 分支操作
  • 暂存操作
  • 回退操作
  • 标签操作

Read More
Share Comments

MLeaksFinder:精准iOS内存泄漏检测工具

背景

平常我们都会用 Instrument 的 Leaks / Allocations 或其他一些开源库进行内存泄露的排查,但它们都存在各种问题和不便,我们逐个来看这些工具的使用和存在的问题。

Leaks

先看看 Leaks,从苹果的开发者文档里可以看到,一个 app 的内存分三类:

  • Leaked memory: Memory unreferenced by your application that cannot be used again or freed (also detectable by using the Leaks instrument).
  • Abandoned memory: Memory still referenced by your application that has no useful purpose.
Read More
Share Comments

如何优化App的启动耗时?

导语

本文介绍了如何优化 iOS App 的启动性能,分为四个部分:

  • 第一部分科普了一些和App启动性能相关的前置知识
  • 第二部分主要讲如何定制启动性能的优化目标
  • 第三部分通过具体项目的优化过程,分享一些有用的经验
Read More
Share Comments

深入研究Block捕获外部变量和__block实现原理

前言

Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能“Blocks”。从那开始,Block就出现在iOS和Mac系统各个API中,并被大家广泛使用。一句话来形容Blocks,带有自动变量(局部变量)的匿名函数。


END

Author: lei-wen
FinishTime: 2019.03.27

Share Comments

iOS缓存策略之NSCache

NSCache 是苹果官方提供的缓存类,用法与 NSMutableDictionary 的用法很相似,在 AFNetworking 和 SDWebImage 中,使用它来管理缓存.

  • NSCache 在系统内存很低时,会自动释放一些对象
    • 备注:这句话源自苹果的官方文档,不过在模拟器中模拟内存警告时,缓存不会做清理动作
    • 为了确保接收到内存警告时能够真正释放内存,最好调用一下 removeAllObjects 方法
Read More
Share Comments

iOS的内存分配

iOS中的内存大致可以分为代码区,全局/静态区,常量区,堆区,栈区。

1.代码区
代码段是用来存放可执行文件的操作指令(存放函数的二进制代码),也就是说是它是可执行程序在内存种的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作——它是不可写的。

2.全局/静态区
全局/静态区存放的是静态变量,静态全局变量,以及全局变量。初始化的全局变量,静态变量,静态全局变量存放在同一区域,未初始化的变量存放在相邻的区域。程序结束后由系统释放。

3.常量区
常量区存放的就是字符串常量,int常量等这些常量。

4.栈区
这块区域是由编译器自动分配并释放的,栈区存放的是函数的参数及自动变量。栈是向低地址扩展的一块连续的内存区域。分配在栈上的变量,当函数的作用域结束,系统就会自动销毁变量。

Read More
Share Comments

loadView、viewDidLoad以及viewDidUnload的关系

标题中所说的3个方法,都是UIViewController的方法,跟UIViewController的view属性的生命周期息息相关。下面我们来阐述它们的作用以及它们之间的联系。

一、loadView

1.什么时候被调用?
每次访问UIViewController的view(比如controller.view、self.view)而且view为nil,loadView方法就会被调用。

2.有什么作用?
loadView方法是用来负责创建UIViewController的view。

3.默认实现是怎么样的?
默认实现即[super loadView]里面做了什么事情。

Read More
Share Comments

iOS应用程序启动时所有方法的调用顺序

一个应用程序的启动过程要包括代理的创建,控制器的加载和控制器view的加载,这其中有很多关于生命周期的方法,每个方法都是有先后顺序的,如果调用顺序拿不准,或者某段代码写的方法不恰当,就会遇到各种奇葩问题。

首先看一下应用程序的启动过程:

  1. 先加载Main函数.

  2. 在Main函数里的 UIApplicationMain方法中,创建Application对象创建Application的Delegate对象.

Read More
Share Comments

NSObject中的load和initialize方法

Objective-C中有两个神奇的方法: +load和 +initialize,这两个方法位于根类NSObject的头文件NSObject.h中,在类被使用时会自动调用。但是两个方法的不同点会导致应用层面上性能的显著差异。

概述

Objective-C作为一门面向对象语言,有类和对象的概念。编译后,类相关的数据结构会保留在目标文件中,在运行时得到解析和使用。在应用程序运行起来的时候,类的信息会有加载和初始化过程。

就像Application有生命周期回调方法一样,在Objective-C的类被加载和初始化的时候,也可以收到方法回调,可以在适当的情况下做一些定制处理。而这正是load和initialize方法可以帮我们做到的。
+ (void)load;
+ (void)initialize;

可以看到这两个方法都是以”+”开头的类方法,返回为空。通常情况下,我们在开发过程中可能不必关注这两个方法。如果有需要定制,我们可以在自定义的NSObject子类中给出这两个方法的实现,这样在类的加载和初始化过程中,自定义的方法可以得到调用。

从如上声明上来看,也许这两个方法和其它的类方法相比没什么特别。但是,这两个方法具有一定的”特殊性”,这也是这两个方法经常会被放在一起特殊提到的原因。详细请看如下几小节的整理。

Read More
Share Comments