初级

OC中创建线程的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
   //创建线程的第一种方式
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"universe"];

[thread start];
//创建线程的第二种方式,NSThread类方法
[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"yuzhou"];
//创建线程的第三种方法 NSObject方法
[self performSelectorInBackground:@selector(run:) withObject:@"nsobject thread"];
//创建线程的第四种方式
NSOperationQueue *oprationQueue = [[NSOperationQueue alloc] init];
[oprationQueue addOperationWithBlock:^{
//这个block语句块在子线程中执行
NSLog(@"oprationQueue");
}];
//第五种创建线程的方式
NSOperationQueue *oprationQueue1 = [[NSOperationQueue alloc] init];
oprationQueue1.maxConcurrentOperationCount = 1;//指定池子的并发数

//NSOperation 相当于java中的runnable接口,继承自它的就相当一个任务
NSInvocationOperation *invation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run:) object:@"invation"];
[oprationQueue1 addOperation:invation];//将任务添加到池子里面,可以给池子添加多个任务,并且指定它的并发数
//第二个任务
NSInvocationOperation *invation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run2:) object:@"invocation2"];
invation2.queuePriority = NSOperationQueuePriorityHigh;//设置线程优先级
[oprationQueue1 addOperation:invation2];
//---------------------GCD----------------------支持多核,高效率的多线程技术
//创建多线程第六种方式
dispatch_queue_t queue = dispatch_queue_create("name", NULL);
//创建一个子线程
dispatch_async(queue, ^{
// 子线程code... ..
NSLog(@"GCD多线程");

//回到主线程
dispatch_sync(dispatch_get_main_queue(), ^{//其实这个也是在子线程中执行的,只是把它放到了主线程的队列中
Boolean isMain = [NSThread isMainThread];
if (isMain) {
NSLog(@"GCD主线程");
}
});
});

ARC的实现原理

Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化。

ARC并不是垃圾收集,而且,引用计数也没有消失,只是变成自动而已。
当采用ARC后,代码只要这样写:
NSObject *obj = [[NSObject alloc] init];
ARC会自动将它变成:
NSObject *obj = [[NSObject alloc] init]; [obj release]; // **Added by ARC**
ARC 会自动帮助你添加 retain 和release/autorelease语句。

self.bounds 与 self.frame 是什么区别

浅析frame与bounds

category是什么 实现了什么功能

深入理解Objective-C:Category

UITableView的insertRowAtIndexPaths怎么用

1
2
3
4
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:insertion withRowAnimation:UITableViewRowAnimationNone];
//更新数据源
[self.tableView endUpdates];

dequeueResuableCellWithIdentifier 与 dequeueResuableCellWithIdentifier forIndexPath 什么区别

直接看官方解释吧

  • (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.
  • (id)dequeueReusableCellWithIdentifier:(NSString )identifier forIndexPath:(NSIndexPath )indexPath NS_AVAILABLE_IOS(6_0); // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered

UITableView的estimateRowHeight是什么意思 起什么作用

参考优化UITableViewCell高度计算的那些事中的estimatedRowHeight

7、UIViewContentMode都有什么 分别什么意思
8、NSUserdefault如何存对象 NSUserdefault的同步机制是什么
9、iOS应用程序的生命周期
10、UIViewController的生命周期

property都有哪些关键字,都是什么意思

找了半天,这篇最详细@property属性关键字详解

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

区分 #include 与#include “x.h”的作用
“#include “:它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件.
“#include “x.h””:用户自定义的文件用双引号引用,编译器首先会在用户目录下查找,然后到安装目录中查找,最后在系统文件中查找。
在使用#include的时候要注意处理重复引用(这也是objc中#include与#import的区别)
例如:ClassA 与 ClassB同时引用了ClassC,不做重复引用处理的时候在ClassD中同时引用ClassA,ClassB编译会提示对ClassC重复引用的错误.
我们可以:

1
2
3
4
#ifndef _CLASSC_H   
#define _CLASSC_H
#include "ClassC"
#endif

这样处理在编译时就不会有重复引用的错误出现(在objc中#import解决了这个问题,这是它们的区别)
“#import” 大部分功能和#include是一样的,但是他处理了重复引用的问题,我们在引用文件的时候不用再去自己进行重复引用处理.

@class与#import
二者的区别在于:
1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。
2.在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。
3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。
4.如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。
所以,一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.

中级

setValueForKey 与 setObjectForKey 什么区别

setValue和setObject的区别

两个应用之间怎么通讯

问题问的不好,想要的答案是URL Scheme

说一下block内存管理

首先看这篇关于block使用的5点注意事项
详情参考《iOS高级编程 多线程和内存管理》

4、NSLayoutContraint包含哪些属性

InterfaceBuilder中的约束如何在代码中修改

可以连线获得NSLayoutConstraint对象,也可以通过
- (NSArray *)constraints NS_AVAILABLE_IOS(6_0);
这个属性来遍历
6、UITextView UITextField 有什么区别

autolayout如何做动画

http://sxiaojian.com/2015/08/28/autolayout/
8、copy 与muteblecopy 什么区别
9、block copy 是什么意思 string copy 是什么意思
10、如何封装一个下拉刷新
11、OC中如何实现线程安全
http://www.cnblogs.com/GarveyCalvin/p/4212611.html
12、iOS中的手势都是什么 手势类叫什么名字 手势间相互影响怎么解决
13、UIView的 alpha 与 opaque 是什么区别 根hidden有什么区别
UIView中hidden、alpha、clear color与opaque的区别

ios7增加了哪些api ios8增加了哪些api ios9

这个纯粹看积累

遍历NSArray中的对象都有什么方法

ios中集合遍历方法的比较和技巧
16、如何通过cell找到tableview 如何知道cell在哪个controller
17、UITableView的继承链 uibutton的继承链

高级

1、说一下OC的runtime特性
2、响应者链是什么 touch事件如何传递 成为第一响应者要满足条件
3、NSRunloop是什么 都有哪些模式

content hugging priority content compression resistance priority是什么意思

http://sxiaojian.com/2015/08/28/autolayout/
5、category是什么 实现了什么功能

一些第三方库不用添加代码就能起作用 原理是什么

在load方法里,自动就执行了,不需要调用

加载静态库中的category
8、UIScrollView的 decelerationRate flashScrollIndicators tracking dragging scrollsToTop 都是什么意思

上机题

如何删除array1[@1,@2,@3]中 array2[@1,@2] 有的对象

方法一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    NSMutableArray *array = @[@1,@2,@3,@4,@5].mutableCopy;
NSArray *array2 = @[@1,@2,@5];
NSMutableIndexSet *indexes = [[NSMutableIndexSet alloc] init];
for (int i = 0; i < array.count; i++) {
for (NSNumber *num in array2) {
if ([array[i] isEqual:num]) {
[indexes addIndex:i];
}
}
}
[array removeObjectsAtIndexes:indexes];
NSLog(@"%@",array);

```

方法二
NSMutableArray *array = @[@1,@2,@3,@4,@5].mutableCopy;
NSArray *array2 = @[@1,@2,@5];
[array removeObjectsInArray:array2];
NSLog(@"%@",array);

```
2、修改InterfaceBuilder中已添加约束的view的frame

3、等宽子视图