iOS中几个小知识点整理

一、NSString用copy还是strong

首先看下copy修饰可变变量与不可变变量的区别:

copy修饰可变变量:在赋值指针的同时,也会复制指针指向的内存区域,是深拷贝。
copy修饰不可变变量:等同于strong,增加引用计数,是浅拷贝。

同理,属性NSString,

  1. 当源字符串是NSString时,不管是strong还是copy,属性的对象都是指向源对象,copy操作是浅拷贝。
  2. 当源字符串是NSMutableString时,strong修饰 增加了源字符串的引用计数,而copy修饰string字符串则是对源字符串进行了深拷贝,产生了新对象,且copy属性对象指向这个新的对象,这个copy属性的类型始终为NSString,是不可变的,因为声明的属性类型是NSString。

当我们声明NSString属性时,不希望它中途改变,所以大多数情况下我们用copy修饰,避免因为源字符串是可变字符串时对其进行修改。所以当用copy时,源字符串是可变字符串时,源字符串改变,copy属性不随之改变(它是一个新的对象,新的内存地址)。

二、assign和weak的区别

assign:只进行简单的赋值,没有其他操作。当assign指向的内存被释放时,不会自动赋值为nil,会发生野指针问题
weak:arc模式下属性修饰符,当属性所指向的内存被释放时,自动置为nil,避免野指针的发生。
arc模式下,指针变量一定要用weak修饰,基本数据类型及结构体类型用assign修饰。

三、单例相关

优点:只会创建一个对象,节约内存。并且很容易被外界访问。
缺点:

  1. 一个类只有一个对象,可能会造成责任过多,违背了面向对象的单一职责原则。
  2. 单例没有抽象层,所以扩展困难
  3. 不能过多创建单例,因为单例从创建到程序关闭会一直存在,过多的单例会影响性能,浪费资源。

代码示例:

+(instancetype)sharedInstance
{
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once,^{
 sharedInstance = [[self alloc] init];
});
return sharedInstance;
}

代码解析:
sharedInstance声明为静态变量,静态变量所在的方法返回时,静态变量不会被释放。sharedInstance变量的初始值是nil,当程序第一次执行sharedInstance方法时会创建一个对象,并将新创建的对象的地址赋值给sharedInstance变量。再次执行sharedInstance方法时,无论多少次sharedInstance变量仍然会指向最初那个创建的对象。因为指向对象的sharedInstance变量是强引用的,并且程序永远不会释放该变量,所以sharedInstance变量指向的对象也不会释放。

线程安全:dispatch_once保证程序在运行过程中只会被运行一次,如果线程1执行了sharedInstance方法,创建了一个实例变量,线程2就不会再去执行dispatch_once里面的代码了,从而保证程序只会创建一个实例对象。

四、ARC和MRC

MRC环境下编程时属性用retain和assign修饰,ARC时引入了strong和weak。
ARC下,不显式指定任何属性关键字时,默认的关键字是atomic,readwrite,strong(对象),assgin(基本数据类型)。
ARC/MRC分别都是如何进行内存管理的?

程序在运行过程中会创建大量的对象,在ObjC中对象存储在堆中,系统并不会自动释放堆中的内存,基本类型是由系统自己管理的,放在栈上。如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存,内存的积累使得系统卡顿,甚至被app杀死(发生crash)。

1.MRC环境下:谁创建,谁释放,谁持有,谁释放,减少了各个模块的逻辑耦合。与变量相关的内存管理有retain,release和autorelease。retain和release方法操作的是引用记数,当引用记数为零时,便自动释放内存。并且可以用NSAutoreleasePool对象,对加入自动释放池(autorelease调用)的变量进行管理,当drain时回收内存。

与属性相关的修饰符有标识符@property (nonatomic/atomic,retain/assign/copy, readonly/readwrite) Number* num;

  • nonatomic/atomic,表示该属性是否是对多线程安全的,是不是使用线程锁,默认为atomic,
  • retain/assign/copy,是有关对该属性的内存管理的。retain和copy都需要手动释放,assign不会引起引用计数的变化,因为它是直接赋值,两个变量将指向同一个内存地址,另一个变量在使用的时候,该变量不能进行释放。如果其中一个变量释放了,另一个变量将引起野指针问题。如果是基本数据类型,使用assign不会有问题。

2.ARC环境下:变量修饰符常用的是__strong和__weak。block中解决循环引用问题时常用这对修饰符。
属性修饰符有property (nonatomic/atomic, assign/retain/strong/weak/unsafe_unretained/copy,readonly/readwrite)
强引用strong增加对象的引用计数,如果是弱引用,则将内存对象在系统中建立映射表,一旦内存对象的引用计数为0,则将该内存对象的所有弱引用对象指针置为nil。

五、KVO和KVC

KVO的使用,就三步:

1.注册需要观察的对象的属性addObserver:forKeyPath:options:context:
2.实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用
3.取消注册观察removeObserver:forKeyPath:context:

KVC:键值编码,是一种间接访问实例变量的机制(不通过存取方法,访问对象的实例变量),有两个方法:setValue:forKey,valueForKey
KVO:键值观察,使用观察者模式,可以使对象获取其他对象属性变化的通知。

KVO是利用isa-swizzling(类型混合指针机制)实现的,得益于Runtime的动态能力,isa指针在运行时被修改,指向一个中间类,而不是原来实例变量真正的类。这个中间类是被监听对象的派生类,重写了setter方法,在setter方法中加入了通知机制,这样当使用KVC修改属性值时,就会发送通知,从而实现了KVO。

键值观察通知依赖于NSObject的两个方法:willChangeValueForKey:和 didChangevlueForKey: 这两个方法分别在属性被修改之前和之后调用,属性被修改的代码是setValue: forKey: 所以只有在使用KVC命令约定时KVO才可以使用 isa 混写来做到修改属性时触发通知机制。

参考:

链接:http://www.jianshu.com/p/7486ebfcd93b

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容