为了保证线程安全,可能会需要进行加锁,常见的锁机制大概有这么几种
NSLock;
NSConditionLock;
dispatch_semaphore_t;
@synchronized (self) {
}
关于空间的描述
- 1、栈区(stack) 临时变量,局部变量(自动分配内存)
- 2、堆区(heap) alloc new malloc calloc(程序员手动分配的内存, 在非ARC的时候,由程序员手动释放, ARC模式(注意对象不被循环引用,系统就会自动释放 (对象引用计数器)))在CoreFoundation框架中我们也是需要自己去释放的。栈内存分配运算内置于处理器的指令集,效率很高,但是分配的内存容量有限
- 3、全局区(静态变量, 全局变量,在我们编译的时候就分配空间了,程序结束后,由自动释放)
- 4、常量区(常量 const,在我们编译的时候就分配空间了,程序结束后,由自动释放)
- 5、代码区(存放代码的区域)
当我们在程序中如果去使用[[UIApplication alloc] init]; 再去创建UIApplication对象会崩溃,因为这个对象是单例只允许有一个。如果我们把init去掉,我们会发现程序没有崩溃
这就说明这个异常应该是在init方法中被抛出的。
我们可以自己去模拟在alloc方法中判断单例对象存不存在,如果存在就抛出异常。如果我们子类继承了这个重写了下面的alloc方法的类的话,子类也是无法创建的。因为默认会去调用[super alloc]方法。
+ (instancetype)alloc{
if (singleInstance) {
NSException *exception = [NSException exceptionWithName:@"error" reason:@"无法创建" userInfo:nil];
[exception raise];
}
return [super alloc];
}
在这里再补充下断言的知识,只在Debug版本下有效果,Xcode 已经默认将release环境下的断言取消了。