iOS知识合集

一、多线程开发的理解以及iOS中有几种实现多线程的方法?

好处:

1、使用线程可以把程序中占据时间长的任务放到后台去处理,如图片、视频的下载;

2、发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好。

缺点:

1、大量的线程降低代码的可读性;

2、更多的线程需要更多的内存空间;

3、当多个线程对同一个资源出现争夺的时候要注意线程安全的问题。

iOS有三种多线程编程的技术:

1、NSThread(两种创建方式)[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];

[myThread start];

2、NSOperationQueue

NSOperationQueue *oprationQueue = [[NSOperationQueue alloc] init];

oprationQueue addOperationWithBlock:^{

//这个block语句块在子线程中执行

}

3、Grand Central Dispatch (GCD)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

// 耗时的操作

dispatch_async(dispatch_get_main_queue(), ^{

    // 更新界面

});

});

不显示的创建线程的方法:用NSObject的类方法 performSelectorInBackground:withObject: 创建一个线程:[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];

二、线程同步和异步的区别?IOS中如何实现多线程的同步?

同步:一个线程要等待上一个线程执行完之后才能执行当前的线程。

异步:同时去做两件或者多件事。比如边听歌边看报。

实现:原子操作(atomic)、加锁(NSLock、NSRecursive、NSConditionLock)、@synchronized GCD串行队列,GCD当中的屏障,NSOperationQueue设置最大并发数为1

三、iOS本地数据存储都有哪几种方式?iOS如何实现复杂对象的存储?

NSKeyedArchiver(归档)采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。

1.NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。

2.Write写入方式:永久保存在磁盘中。

3.SQLite(FMDB、CoreData)

NSCoding + NSKeyedArchiver实现复杂对象的存储。

四、怎样实现一个singleton的类?

//第一种方式

static LOSingleton * shareInstance;

+( LOSingleton *)sharedInstance{

@synchronized(self){//这个东西其实就是一个加锁。如果self 其他线程访问,则会阻塞。这样做一般是用来对单例进行一个死锁的保护

    if (shareInstance == nil) {

        shareInstance = [[super allocWithZone:NULL] init];

    }

}

return shareInstance;

}

//第二种方式

  • (LOSingleton *) sharedInstance

{

static  LOSingleton *sharedInstance = nil ;

static  dispatch_once_t onceToken;  // 锁

dispatch_once (& onceToken, ^ {     // 最多调用一次

    sharedInstance = [[self  alloc] init];

});

return  sharedInstance;

}

五、什么是安全释放?

在对象release之后把指针置为nil。

六、简述你对UIView、UIWindow和CALayer的理解

UIView继承于UIResponder, UIResponder继承于NSObject,UIView可以响应用户事件。CALayer继承于NSObject,所以CALayer不能响应事件。UIView构建界面,UIView侧重于对内容的管理,CALayer侧重于对内容的绘制。UIView是用来显示内容的,可以处理用户事件;CALayer是用来绘制内容的,对内容进行动画处理,依赖与UIView来进行显示,不能处理用户事件。

七、什么是Protocol?什么是代理?写一个委托的interface?委托的property声明用什么属性?为什么?

协议提供了一组方法,但是并不负责实现,如果一个类遵循了某个协议,并且实现了协议里面的方法,那么我们称这个类就是遵循了某个协议的代理。属性的声明使用assign,防止出现循环引用的问题。

八、分别描述类别(categories)和延展(extensions)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?

category类目:在不知道源码的情况下为一个类扩展方法;

extension:为一个类声明私有方法和变量。继承是创建了一个新的类,而类别只是对类的一个扩展,还是之前的类。类目的作用就是为已知的类添加方法。

九、Objective-C有私有方法么?私有变量呢?如多没有的话,有没有什么代替的方法?

objective-c – 类里面的方法只有两种, 静态方法和实例方法.

@private来修饰私有变量

OC中所有的实例变量默认都是私有的,所有的实例方法默认都是公有的。

十、objc中的减号与加号代表什么?

+静态方法,也叫类方法,-实例方法

十一、对于语句NSString* testObject = [[NSData alloc] init];testObject 在编译时和运行时分别是什么类型的对象?

编译的时候是NSString类型,运行的时候是NSData类型

十二、OC中是所有对象间的交互是如何实现的?

函数指针实现

十三、#import和#include的区别是什么?#import<> 跟 #import""有什么区别?

1、#import能避免头文件被重复包含的问题

2、一般来说,导入objective c的头文件时用#import,包含C/C++头文件时用#include。

3、#import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。

4、#import<> 包含iOS框架类库里的类,#import""包含项目里自定义的类。

5、#import比起#include的好处就是它避免了重复引用的问题。所以在OC中我们基本用的都是import。

十四、Category是什么?扩展一个类的方式用继承好还是类目好?为什么?

Category是类目。用类目好,因为继承要满足a is a b的关系,而类目只需要满足a has a b的关系,局限性更小,你不用定义子类就能扩展一个类的功能,还能将类的定义分开放在不同的源文件里, 用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

十五、类实例(成员)变量的@protected,@private,@public声明各有什么含义?

@protected:受保护的,该实例变量只能在该类和其子类内访问,其他类内不能访问。

@private:私有的,该实例变量只能在该类内访问,其他类内不能访问。

@public:共有的,该实例变量谁都可以访问。

十六、id声明的对象有什么特性?

1、没有 * 号

2、动态数据类型

3、可以指向任何类的对象(设置是nil),而不关心其具体类型

4、在运行时检查其具体类型

5、可以对其发送任何(存在的)消息

十七、内存管理的几条原则是什么?按照默认法则,哪些关键字生成的对象需要手动释放?哪些情况下不需要手动释放,会直接进入自动释放池?

内存管理的原则是:谁创建,谁释放;谁引用,谁管理。

遵循Cocoa Touch的使用原则;

内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。

1、当使用new、alloc或copy方法创建一个对象时,该对象引用计数器为1。如果不需要使用该对象,可以向其发送release或autorelease消息,在其使用完毕时被销毁。

2、如果通过其他方法获取一个对象,则可以假设这个对象引用计数为1,并且被设置为autorelease,不需要对该对象进行清理,如果确实需要retain这个对象,则需要使用完毕后release。

3、如果retain了某个对象,需要release或autorelease该对象,保持retain方法和release方法使用次数相等。

4、使用new、alloc、copy关键字生成的对象和retain了的对象需要手动释放。设置为autorelease的对象不需要手动释放,会直接进入自动释放池。

十八、属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?

assign用于简单数据类型,如NSInteger,double,bool;

retain和copy用于对象;

readwrite是可读可写特性;需要生成getter方法和setter方法时;

readonly是只读特性 只会生成getter方法 不会生成setter方法 ,不希望属性在类外改变;

assign是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;

retain表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;

copy表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时;

nonatomic非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic。

十九、Objective-C如何对内存管理的,说说你的看法和解决方法?

Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。

二十、那些关键字生成的对象 需要手动释放?

关键字alloc 或new 生成的对象需要手动释放

二十一、如何对iOS设备进行性能测试?

Profile-> Instruments ->Time Profiler

二十二、Category是什么?重写一个类的方式用继承好还是分类好?为什么?

Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

二十三、Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?

线程创建有三种方法:使用NSThread创建、使用 GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是 performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone

二十四、什么是Notification?什么时候用delegate,什么时候用Notification?

观察者模式,controller向defaultNotificationCenter添加自己的notification,其他类注册这个notification就可以收到通知,这些类可以在收到通知时做自己的操作(多观察者默认随机顺序发通知给观察者们,而且每个观察者都要等当前的某个观察者的操作做完才能轮到他来操作,可以用NotificationQueue的方式安排观察者的反应顺序,也可以在添加观察者中设定反映时间,取消观察需要在viewDidUnload 跟dealloc中都要注销)。

delegate针对one-to-one关系,并且reciever可以返回值给sender,notification 可以针对one-to-one/many/none,reciever无法返回值给sender.所以,delegate用于sender希望接受到reciever的某个功能反馈值,notification用于通知多个object某个事件。

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

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • 37.cocoa内存管理规则 1)当你使用new,alloc或copy方法创建一个对象时,该对象的保留计数器值为1...
    如风家的秘密阅读 827评论 0 4
  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 4,967评论 0 13
  • 转:http://www.cocoachina.com/programmer/20151019/13746.htm...
    Style_伟阅读 1,291评论 0 3
  • 小的时候,躺在房顶上和月亮说话,叫它月亮姐姐。会蹲在山间,和会虫子说话。晚上睡觉时,会打开想象力,编故事,编着编着...
    LOVE玲媛阅读 245评论 0 1