IOS中的易混淆的知识点

小鱼儿不才,总结了些易混淆的点,如有错误请联系我或者评论,小鱼儿及时更正QQ:593216709

堆与栈的区别

栈 :是由系统自动分配释放的一块存储空间,存放函数的参数值,、局部变量等(数据类型,以及定义的变量和对象的指针),类似于数据结构中的

堆:一般由程序员自己手动释放,存放OC对象,程序员不手动释放,会到最够关闭程序时对象才会被释放掉,分配方式类似于链表。

instancetype和id的区别

instancetype :返回的指针指向的类型是已知的,不可以当方法的参数使用,只能作为返回值。

id:返回的指针指向的类型是未知,可以当做方法的参数使用,也是可以作为返回值

MRC与ARC的区别

ARC:自动管理内存计数器。不需要程序员管理内存,编译器会在恰当的时候给我们填上reatin、release等代码。
注意:oc中的ARC和JAVa里面的垃圾回收机制不太一样,Java中的垃圾回收机制是系统帮忙干的,而oc中的ARC是编译器干的。

  1. ARC是编译器特性(编译器会在恰当的时候给我们填上reatin、release等代码),不是运行时特性。

MRC:手动管理内存计数器。需要程序要自己恰当的地方自己写上release和retain代码。

野指针和空指针的区别

野指针:表示指针指向了一个被释放的对象,也成“僵尸对象”。只要给野指针发送消息,程序就会报错。

空指针:指向没有储存控件的指针(就是指针设置为nil)。我们一般为了避免给野指针发送消息,当一个对象被释放后我们都将这个对象的指针设置为空指针。给空指针发送消息不会报错

property修饰符

readonly:只读的,修饰的属性只自动生成getter方法
readwrite :可读可写的,修饰的属性可以自动生成getter/setter方法。默认情况下是readwrite

retain:自动帮我们生成getter/setter方法,并且生成的是内存管理代码(引用计数器+1)。
assign:不会自动帮助我们在setter/getter方法中生成内存管理代码,仅仅生成普通的getter与setter方法

getter:可以给getter方法起一个名字
setter:可以给setter方法起一个名字

atomic:原子性,性能比较低,安全性高。(只能执行一条线程)
nonatomic:非原子性,性能比较高,安全性比较差 (可以同时进行多条线程)

+(void)load和+(void)initialize的区别

+(void)load:表示程序开始加载到内存时调用 2.自身未定义,不会沿用父类的方法。3.lei别中的定义全部执行,先执行类自身的实现,再执行类别(Category)中的实现

+(void)initialize:便是该类第一次使用将被调用 2.自身未定义,hui沿用父类的方法。3.类别中的定义,会执行最后一个,并且覆盖类的方法

http://www.cnblogs.com/ider/archive/2012/09/29/objective_c_load_vs_initialize.html

weak和strong assign

strong:强引用,用于OC对象,相当于MRC中的reatin,引用计数器加1
weak:弱引用,用于OC对象,相当于MRC中的assign,引用计数器不加1
assign:用于一般数据类型,和MRC中的assign一样,引用计数器不加1

category的使用

category的声明:
@interface Person (WJPerson)
-(void)goShopping;
@end
category的实现
@implementation Person (WJPerson)
-(void)goShopping
{
NSLog(@"去购物");
}
@end
Person 是对这个类进行分类
WJPerson 是分类的名字

category的使用:
1.category可以在不改变原有类的基础上,给类扩充一些方法
2.可以让庞大的类分模块开发。
3.一个庞大的类进行多人开发,更利于团队合作。

category的注意点:

1.分类不能扩充属性和成员变量,只能给类扩充方法
2.分类里面的@property只能生成setter和getter的声明,并不能生成setter和getter的实现
3.如果分类里面有和类里面相同名字的方法,对象调用的时候回调用分类的方法,不去调用类里面的方法。如果有多个分类里面同名的方法,则会调用最后一个参与编译分类里面的方法

block的存储地址

1.block可以存储在堆中也是可以存储在栈中的。默认是存储在栈中,如果对block经营一次copy操作,block就会转移到堆中存储。
2.如果block在栈中存储时,block访问了外部的对象,那么不会对对象进行retain操作。
3.如果block在堆中存储,block访问了外部对象,那么会对外部对象进行一次retain操作。
4.只要给外部的对象前面加上__block,不管block是堆中还是栈中,都不会对对象进行retain操作

protocol(协议)和继承的区别

protocol 就是保存一些方法的声明,没有方法的实现。只要遵循了这个协议,就拥有了协议声明的方法
1。继承是可以继承父类的方法和实现的。而遵守protocol后,只拥有了协议里面的声明的方法,但没有协议声明方法的实现
2.相同的类型的类可以使用继承,但是不同的类只能使用protocol。
3.protocol可以用于存储方法的声明,可以将多个类中共同的方法抽取出来,以后让这些类遵守协议即可,(遵守了协议的类,就拥有了协议声明的方法)

protocol的关键字@required @optional的区别
@required
// 如果声明的方法使用required的修饰,说明此方法是必须实现的,如果遵循的类,没有实现,则会有警告,并且默认声明的方法否是required修饰
-(void)palyBaseBall;
@optional
//如果声明的方法使用optional修饰,说明此方法可以不实现,遵循协议的类及时不实现此方法,也不会报警告
-(void)palyBasketBall;

#import和#include的区别,@class代表什么?

import和#include指令都是用于包含头文件的,前者是保证只会包含一次,不会重复包含;后者是c语言中原来就有的包含头文件的指令,在objc开发中,若是c文件,一件会使用#include指令来包含头文件,为了防止重复包含,通常会加上条件编译
@class 就是告诉编译器,后面的是一个类。但是无法知道类里面的方法和属性。很好的解决了引用循环的问题。

nil NULL 和Nil的区别

nil 针对对象,指向OC中对象的空指针。
Nil 针对类,指向OC中类的空指针。
NULL 针对其他数据类型,指向其他类型的空指针。如基本数据类型为空。

#define定义的宏和const定义的常量有什么区别?

  • define定义宏的指令,程序在预处理阶段将用#define所定义的内容只是进行了替换。因此程序运行时,常量表中并没有用#define所定义的宏,系统并不为它分配内存,而且在编译时不会检查数据类型,出错的概率要大一些
  • const定义的常量,在程序运行时是存放在常量表中,系统会为它分配内存,而且在编译时会进行类型检查

常见的出现内存循环引用的场景有哪些

  • 定时器(NSTimer):NSTimer经常会被作为某个类的成员变量,而NSTimer初始化时要指定self为target,容易造成循环引用(self->timer->self)。 另外,若timer一直处于validate的状态,则其引用计数将始终大于0,因此在不再使用定时器以后,应该先调用invalidate方法
  • block的使用:block在copy时都会对block内部用到的对象进行强引用(ARC)或者retainCount增1(非ARC)。在ARC与非ARC环境下对block使用不当都会引起循环引用问题, 一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.someBlock = Type var{[self dosomething];或者self.otherVar = XXX;或者_otherVar = …};出现循环的原因是:self->block->self或者self->block->_ivar(成员变量)
  • 代理(delegate):在委托问题上出现循环引用问题已经是老生常谈了,规避该问题的杀手锏也是简单到哭,一字诀:声明delegate时请用assign(MRC)或者weak(ARC),千万别手贱玩一下retain或者strong,毕竟这基本逃不掉循环引用了!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • Objective-C 1. import的用法 拷贝文件内容可以自动防止文件的内容被重复拷贝(#define宏定...
    马文涛阅读 5,326评论 3 17
  • 又是一个五彩缤纷的周末。朋友圈里各种晒。有两个同事的孩子差不多大,不同的是其中一个每个周末都去上早教课,另一个就每...
    漫缦阅读 120评论 0 0
  • 朋友项目中有个需求控件是文字和图片共存的,一般情况下同时显示图片文字,用UIButton就能够实现,但是他的需求比...
    皮乐皮儿阅读 422评论 0 4
  • 1.意想不到,晚上打做的时候,不由自主的身上出汗了,有点不舒服,腿也麻了,看了看时间半个小时了,就不继续了,伸腿缓...
    云少nn阅读 180评论 0 0
  • 此刻回顾我一天的时间和所有的事情,来监视和自我监督, 今天的情绪不是很好,一个上午都感觉心不静,整理工作记录也无法...
    京海家园阅读 140评论 0 2