-
查看内存段的简单方法
目录 objc查看所属内存段int age = 18;int main(int argc, const char * argv[]) { @autoreleasepool { int a = 10; NSLog(@"数据区:age %p",&age); NSLog(@"栈区: a %p",&a); NSLog(@"堆区: Obj %p",[[NSObject alloc]init]);...…
-
Crash分析(三):crash文件符号化
参考文章:iOS实录14:浅谈iOS Crash(一) 参考文章:crash文件符号化攻略 参考文章:Xcode崩溃日志分析工具symbolicatecrash用法目录 文件准备与验证 符号化 atos简单使用 symbolicatecrash使用文件准备与验证符号化需要有dSYM(符号表)文件,crash文件。我们创建一个Person类,在.h文件内声明-(void)test;方法,但并不实现。执行下面代码Person * person = [[Person alloc]...…
-
Crash分析(二):crash文件
参考文章:iOS实录14:浅谈iOS Crash(一) 参考文章:crash文件符号化攻略 参考文章:Xcode崩溃日志分析工具symbolicatecrash用法目录 什么是crash文件 crash文件的结构 crash文件的UUID什么是crash文件当程序运行崩溃的时候,系统会把运行的最后时刻的运行信息记录下来,存储到一个文件中,这个文件就是Crash文件。如何获得crash文件?1、将出错的手机连接Xcode,xcode->Window->Devices...…
-
Crash分析(一):dSYM文件
参考文章:iOS 使用dSYM分析友盟错误日志 参考文章:iOS crash解析目录 什么是dSYM文件 dSYM文件的作用 dSYM文件的UUID什么是dSYM文件Xcode编译项目后,我们会看到一个同名的dSYM文件,dSYM是保存16进制函数地址映射信息的中转文件(符号表),我们调试的symbols都会包含在这个文件中,并且每次编译项目的时候都会生成一个新的dSYM文件。我们可以从两个地方找到dSYM文件: 1、在release环境下,工程编译完成后,在下面目录下...…
-
copy与mutableCopy
目录 copy与mutableCopy copy修饰符 自定义对象实现copy方法copy与mutableCopy浅拷贝:简单的指针拷贝,不会产生新的对象。 深拷贝:内容拷贝,会产生的新对象。代码段一:NSString * str1 = [NSString stringWithFormat:@"test"];NSString * str2 = [str1 copy];//浅拷贝NSMutableString * str3 = [str1 mutableCopy];//深拷贝[s...…
-
自动释放池
参考:iOS-自动释放池AutoreleasePool 参考:iOS 内存管理(四): 自动释放池详解目录 自动释放池介绍 自动释放池查看 autorelease 对象在什么时候释放 autorelease 对象详解自动释放池介绍一、介绍以下摘自苹果官方文档: 在引用计数(相对于垃圾回收)环境中,自动释放池包含了接受autorelease消息的对象, 当池子倾倒的时候,会对里面的每一个对象发送release消息。 因此对一个对象发送autorelease消息而不是...…
-
TaggedPointer
目录 TaggedPointer NSNumber NSString 源码TaggedPointer从64bit开始,iOS引⼊了Tagged Pointer技术,用于优化 NSNumber、NSDate、NSString等小对象的存储。在没有使⽤用Tagged Pointer之前, NSNumber等对象需要动态分配内存、维护引⽤计数等,NSNumber指针存储的是堆中NSNumber对象的地址值使用Tagged Pointer之后,NSNumber指针里⾯存储的数据变成了:Ta...…
-
内存分布
参考文章:(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)目录 内存分布 代码演示内存分布一 内存分布图如下二 分段说明text段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。data段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存...…
-
定时器封装
目录 定时器封装定时器封装MJTimer.h文件#import <Foundation/Foundation.h>@interface MJTimer : NSObject+ (NSString *)execTask:(void(^)(void))task start:(NSTimeInterval)start interval:(NSTimeInterval)interval repeats:(BOOL)repeats ...…
-
定时器存在的问题
目录 定时器的循环引用 定时器的偏差问题定时器的循环引用一、如何产生了循环引用@interface ViewController ()@property (nonatomic, strong) NSTimer * timer;@property (strong, nonatomic) CADisplayLink *link;@end@implementation ViewController- (void)viewDidLoad{ [super viewDidLoad]; ...…
-
锁
目录 NSLock NSCondition SemaphoreNSLockself.countLock = [[NSLock alloc] init];- (void)__countMinus {[self.countLock lock];[super __countMinus];[self.countLock unlock];}NSConditionself.countLock = [[NSCondition alloc] init];- (void)__countMinus {[...…
-
线程保活封装
目录 线程保活线程保活MJPermenantThread.h文件#import <Foundation/Foundation.h>typedef void (^MJPermenantThreadTask)(void);@interface MJPermenantThread : NSObject/** 开启线程 *///- (void)run;/** 在当前子线程执行一个任务 */- (void)executeTask:(MJPermenantThreadTask)task;...…
-
NSThread
目录 基本使用 创建线程 线程保活基本使用//获取当前线程NSThread * currentThread = [NSThread currentThread];NSLog(@"currentThread = %@",currentThread);//获取主线程NSThread * mainThread = [NSThread mainThread];NSLog(@"mainThread=%@",mainThread);//查看是否是主线程BOOL isMain = [NSThrea...…
-
NSOperation
目录 同步 异步 其它NSOperation 底层是GCD,比GCD多了一些简单实用的功能,使用更加面向对象。同步在当前线程执行任务//invocationOperationNSInvocationOperation * operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(_test) object:nil];[operation start];//blockOperati...…
-
GCD2
目录 sync相关Demo async相关Demo group相关Demo dispatch_barrier_(a)sync相关Demo perform相关Demo interviewsync相关Demo先看队列是串行并行,再看执行时同步异步 放在串行队列里的任务一定是一个执行完再取下一个,是有顺序的 同步执行一定是整个任务块执行完再返回的总结1: 只要在主线程执行 dispatch_sync(dispatch_get_main_queue(), ^{}); 必定...…
-
GCD
目录 概念介绍 同步 异步 线程组 其它 barrier semaphore dispatch_source概念介绍旨在替代NSThread等线程技术,充分利用设备的多核。首先先看几个概念: 同步:在当前线程执行任务,不具备开启新线程的能力dispatch_sync 异步:在新线程中执行任务,具备开启新线程的能力dispatch_async串行队列:在队列里的多个任务按先后顺序,一个一个取出。dispatch_queue_t serialQueue = disp...…
-
线程
目录 进程线程的相关概念 多线程 锁进程线程的相关概念一、进程与线程介绍1、进程系统中正在运行的一个应用程序 每个进程独立 每个进程运行在自己独立的内存空间内2、线程 进程的基本执行单元 一个进程所有的任务都在线程中执行 进程至少要有一条线程 同进程中的不同线程可以共享数据,但拥有自己的栈空间和独立的执行序列3、根本区别 进程是操作系统进行资源分配的基本单位,线程是操作系统进行任务调度的基本单位二、线程相关如果线程数非常多,CPU会在N个线程之间切换,消耗大量的CPU...…
-
参考:线程同步(二)
参考书籍 《多线程编程指南》 原著:Apple Inc. 翻译:謝業蘭 【老狼】目录 使用锁 使用条件使用锁 使用POSIX互斥锁 为了锁住和解锁一个互斥锁,你可以使用 pthread_mutex_lock 和 pthread_mutex_unlock 函数。 当你用完一个锁之后,只要简单的调用 pthread_mutex_destroy 来释放该锁的数据结构。 使用NSLock类 //应确保不同的线程使用的是同一把锁。否则保护会失效self.money...…
-
参考:线程同步(一)
参考书籍 《多线程编程指南》 原著:Apple Inc. 翻译:謝業蘭 【老狼】 参考文章:多线程、线程安全和锁目录 同步工具 同步的成本和性能 线程安全和信号量 线程安全设计的技巧 使用原子操作应用程序里面多个线程的存在引发了多个执行线程安全访问资源的潜在问题。两 个线程同时修改同一资源有可能以意想不到的方式互相干扰。 但涉及到线程安全时,一个好的设计是最好的保护。避免共享资源,并尽量减少 线程间的相互作用,这样可以让它们减少互相的干扰。同步工具 原子操作 ...…
-
参考:线程管理
参考书籍 《多线程编程指南》 原著:Apple Inc. 翻译:謝業蘭 【老狼】目录 线程成本 创建一个线程 配置线程属性 编写你线程的主体入口点 中断线程每个应用程序启动时候都是一个线程,它执行程序的 main 函数。 应用程序可以生成额外的线程,其中每个线程执行一个特定功能的代码。 每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片。 一个线程可以和其他线程或其他进程通信,执行 I/O 操作,甚至执行任何你想要它完成的任务。 因为它们处于相同的进程空间,所以一个独立...…