面试 (一) : iOS基础篇-2(100题1~20)
2017-04-11 00:00
239 查看
#####1.简述OC中内存管理机制.
1
答:内存管理机制:使用引用计数管理,分为ARC和MRC,MRC需要程序员自己管理内存,ARC则不需要.但是并不是所有对象在ARC环境下均不需要管理内存,子线程和循环引用并不是这样.与retain配对使用的是release,retain代表引用计数+1,release代表引用计数-1,当引用计数减为0时,对象则被系统自动销毁.与alloc配对使用的是dealloc,alloc代表为对象开辟内存空间,dealloc则代表销毁对象的内存空间.
#####2.readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak的作用?
1
答:读写属性:readonly和readwrite; 语义属性:assign/retain/copy; 原子性:nonatomic.
①.readwrite代表可读,可写,即有setter和getter方法,是默认属性.readonly代表只可读,即只有get方法,因为不会生成setter方法,所以它不可以和copy/retain/assign组合使用.
②.weak和assign均是弱引用,assign修饰基本数据类型,weak修饰对象类型.strong和weak用于ARC下(ARC下的代理使用weak,block块使用copy).strong相当于retain.weak相当于assign;assign/retain/copy这些属性用于指定set访问器的语义,也就是说,这些属性决定了以何种方式对数据成员赋值.
assign,直接赋值,引用计数不改变,适用于基本数据类型.
retain,浅拷贝,使用的是原来的内存空间,只能适用于Objective-C对象类型,而不能适用于Core Foundation对象(retain会增加对象的引用计数,而基本数据和Core Foundation对象都没有引用计数).
copy:对象的拷贝,新申请一块内存空间,并把原始内容复制到那片空间.新对象的引用计数为1,此属性只对那些遵循了NSCopy协议的对象类型有效.
③.nonatomic,非原子性访问,不加同步,是异步操作.默认为atomic,原子操作,atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误,而这种机制是消耗系统内存资源的,所以在移动端,都选择nonatomic.
#####3.内存分为5个区,分别是栈区,堆区,全局区,文字常量区,程序代码区.
1
栈区:由编译器自动分配释放,不需要管理内存.
堆区:一般有程序员分配释放.
全局区:存放全局变量和静态变量.
常量区:存放常量字符串.
代码区:存放二进制代码.
#####4.类变量的@protected,@private,@public,@package,声明各有什么含义?
1
@protected 受保护的.本类,子类可见.
@private 私有的,类内可用
@public 公有的,类内,子类,外部均可用
@package 可见度在@protected和@public之间,这个类型最常用于框架类的实例变量.
#####5.线程是什么?进程又是什么?区别和联系.
1
进程:正在运行的程序,负责程序的内存分配.
线程:线程是进程中一个独立执行的控制单元(路径),一个进程至少包含一条线程,即主线程.
创建线程的目的:开辟一条新的执行路径,运行指定的代码,与主线程的代码实现同时执行.
#####6.对多线程开发的理解,iOS中有几种实现多线程的方式.
1
多线程的使用场景:防止卡顿,可以同时完成多个任务,且不影响主线程,把耗时操作放在子线程中执行,但是会消耗内存.
实现多线程的方式:
①.NSThread(内存需要自己管理.触发),
②.NSOperationQueue(不再关注线程,当前可执行任务个数queue.maxConcurrentOperationCount)
③.GCD
④:Theard
#####7.线程同步和异步的区别?ios中如何实现线程的同步?
1
同步:任务顺序执行,下一个任务依赖于上一任务的完成.
异步:任务执行顺序不定,一起执行.
实现:设置依赖:NSOpreationQueue GCD中的串行队列.
#####8.iOS类是否可以多继承,如果没有,怎么实现?
1
不可以多继承.可以通过类目,延展,协议实现多继承.
类目:类目也叫分类,英文category,在没有原类.m文件的基础上,给该类添加方法.类目里不能添加实例变量,不能添加和原始类方法名相同的方法,否则会发生覆盖.一个类可以添加多个类目,类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继承.
延展:Extension,是一种特殊形式的类目,主要是在一个类的.m里面声明与实现.作用:就是给某类添加私有方法或者私有变量.
虽然延展是给一个类定义私有方法,但是OC没有绝对的私有方法,其实还是可以调用的,延展里面声明的变量只能在该类内部使用,外界访问不了.如果是新建文件建的的某类延展.h文件,则不能添加实例变量,如果括号里没有类目名,则认为延展里面的方法为全都必须实现,如果有,则可选实现.
类目写的方法必须实现,延展写的方法非必须.
#####9.栈和堆的区别?
1
栈:内存系统管理(系统开辟,系统释放),先进后出.
堆:内存自己管理(自己开辟,自己释放).先进先出.
#####10.iOS本地数据存储都有几种方式?
1
①.NSkeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码.
②.NSUserDefaults:用来保存应用程序设置和属性,用户保存的数据.用户再次打开程序或者开机后这些数据仍然存在.NSUserDefaults可以存储的数据类型包括:NSData,NSString,NSNumber,NSDate,NSArray.NSDictionary,其他类型的数据需要先行转换.
③.Write写入方式:永久保存在磁盘中.具体:a.获得文件保存的路径.b.生成该路径下的文件,c,往文件中写入数据.d.从文件中读出数据.
④.SQLite:采用SQLite数据库来存储数据,SQLite作为一种轻量级数据库.具体:a.添加SQLite相关的库以及头文件,b.使用数据库存数数据:打开数据库,编写数据库语句,执行,关闭数据库.另:写入数据库,字符串可以采用char方式,而从数据库中取出char类型,当char类型有表示中文字符时,会出现乱码,这是因为数据库默认使用ascII编码方式,所以想要正确从数据库中取出中文,需要使用NSString来接受从数据库取出的字符串.
⑤.CoreData:原理是对SQLite的封装,开发者不需要接触sql语句,就可以对数据库进行操作.
#####11.ios动态类型和动态绑定
1
多态:父类指针指向子类对象.
动态类型:只有在运行期,才能确定其真正类型.
动态加载:根据不同的条件,加载不同的资源.32和64位.
#####12.深拷贝和浅拷贝的理解.
1
深拷贝;拷贝的内容.
浅拷贝:拷贝的指针.
深拷贝如:
NSMutableDictionary * dic = [@{} mutableCopy];
NSMutableArray * ary = [@[] mutableCopy];
#####13.怎么实现一个单例的类.
1
单例是一种设计模式,对象只有一个.缺点:对象不会被释放,如果创建很多的话会占用很多内存,优点:可以当做工具类使用.
#####14.什么是安全释放?
1
先释放再置空.
#####15.RunLoop是什么?
1
事件循环,是线程里面的一个组件.主线程的RunLoop是自动开启的.分为:计时源(timer source),事件源(输入源):input source.防止CPU中断(保证程序执行的线程不会被系统终止).
Runloop提供了一种异步执行代码的机制,并不能并行执行任务,是事件接收和分发机制的一个实现.每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的,需要为RunLoop添加至少一个事件源,然后run它.
一般情况下我们是没有必要去启动线程的RunLoop的,除非你在一个单独的线程中需要长时间的检测某个事件.
RunLoop,正如其名所示,是线程进入和被线程用来响应事件以及调用事件处理函数的地方.
input source传递异步事件,通常是来自其他线程和不同程序的消息.
timer source传递同步事件.
当有事件发生时,RunLoop会根据具体的事件类型通知应用程序作出响应.
当没有事件发生时,RunLoop会进入休眠状态,从而到达省电的目的.
当事件再次发生时,RunLoop会被重新唤醒,处理事件.
一般在开发中很少会主动创建RunLoop,而通常会把事件添加到RunLoop中.
#####16.什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储.
1
序列化和反序列化:归档和反归档,进行本地化,进行数据存储.
CoreData:数据托管.有四种存储方式:xml,sqlite,二进制,内存.
遵循NSCoding协议之后,进行归档即可实现复杂对象的存储.
#####17.写一个标准宏MIN,这个宏输入两个参数并返回较小的一个.
1
#######define MIN(A,B) (A)>(B)?(B):(A)
#####18.iPhone OS 有没有垃圾回收机制,简易阐述一下OC内存管理.
1
木有.引用计数,ARC和MRC,swift(自动引用计数).
#####19.简述应用程序按HOME键进入后台时的生命周期,以及从后台进入前台时的生命周期.
1
前者:
-(void)applicationWillResignActive:(UIApplication *)application
-(void)applicationDidEnterBackground:(UIApplication *)application
后者:
-(void)applicationWillEnterForeground:(UIApplication *)application
-(void)applicationDidBecomeActive:(UIApplication *)application
另:
各个程序运行状态时代理的回调:
-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告诉代理进程启动但还没进入状态保存
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告诉代理启动基本完成程序准备开始运行
-(void)applicationWillResignActive:(UIApplication *)application
当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
-(void)applicationDidBecomeActive:(UIApplication *)application
当应用程序入活动状态执行,这个刚好跟上面那个方法相反
-(void)applicationDidEnterBackground:(UIApplication *)application
当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
-(void)applicationWillEnterForeground:(UIApplication *)application
当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
-(void)applicationWillTerminate:(UIApplication *)application
当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。
-(void)applicationDidFinishLaunching:(UIApplication*)application
当程序载入后执行
在上面8个方法对应的方法中键入NSLog打印。
现在启动程序看看执行的顺序:
启动程序
lifeCycle[40428:11303] willFinishLaunchingWithOptions
lifeCycle[40428:11303] didFinishLaunchingWithOptions
lifeCycle[40428:11303] applicationDidBecomeActive
按下home键
lifeCycle[40428:11303] applicationWillResignActive
lifeCycle[40428:11303] applicationDidEnterBackground
双击home键,再打开程序
lifeCycle[40428:11303] applicationWillEnterForeground
lifeCycle[40428:11303] applicationDidBecomeActive
#####20.ViewController、alloc,loadView,viewDidLoad,viewWillAppear,viewDidUnload,dealloc,init分别是在什么时候调用?在自定义ViewController的时候这几个函数里面应该做什么工作?
1
alloc:申请内存时调用.
loadView:加载视图时调用.
viewDidLoad;视图已经加载后调用.
viewWillAppear:视图将要出现时调用.
dealloc:销毁该视图时调用.
init;初始化该视图时调用.
1
答:内存管理机制:使用引用计数管理,分为ARC和MRC,MRC需要程序员自己管理内存,ARC则不需要.但是并不是所有对象在ARC环境下均不需要管理内存,子线程和循环引用并不是这样.与retain配对使用的是release,retain代表引用计数+1,release代表引用计数-1,当引用计数减为0时,对象则被系统自动销毁.与alloc配对使用的是dealloc,alloc代表为对象开辟内存空间,dealloc则代表销毁对象的内存空间.
#####2.readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak的作用?
1
答:读写属性:readonly和readwrite; 语义属性:assign/retain/copy; 原子性:nonatomic.
①.readwrite代表可读,可写,即有setter和getter方法,是默认属性.readonly代表只可读,即只有get方法,因为不会生成setter方法,所以它不可以和copy/retain/assign组合使用.
②.weak和assign均是弱引用,assign修饰基本数据类型,weak修饰对象类型.strong和weak用于ARC下(ARC下的代理使用weak,block块使用copy).strong相当于retain.weak相当于assign;assign/retain/copy这些属性用于指定set访问器的语义,也就是说,这些属性决定了以何种方式对数据成员赋值.
assign,直接赋值,引用计数不改变,适用于基本数据类型.
retain,浅拷贝,使用的是原来的内存空间,只能适用于Objective-C对象类型,而不能适用于Core Foundation对象(retain会增加对象的引用计数,而基本数据和Core Foundation对象都没有引用计数).
copy:对象的拷贝,新申请一块内存空间,并把原始内容复制到那片空间.新对象的引用计数为1,此属性只对那些遵循了NSCopy协议的对象类型有效.
③.nonatomic,非原子性访问,不加同步,是异步操作.默认为atomic,原子操作,atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误,而这种机制是消耗系统内存资源的,所以在移动端,都选择nonatomic.
#####3.内存分为5个区,分别是栈区,堆区,全局区,文字常量区,程序代码区.
1
栈区:由编译器自动分配释放,不需要管理内存.
堆区:一般有程序员分配释放.
全局区:存放全局变量和静态变量.
常量区:存放常量字符串.
代码区:存放二进制代码.
#####4.类变量的@protected,@private,@public,@package,声明各有什么含义?
1
@protected 受保护的.本类,子类可见.
@private 私有的,类内可用
@public 公有的,类内,子类,外部均可用
@package 可见度在@protected和@public之间,这个类型最常用于框架类的实例变量.
#####5.线程是什么?进程又是什么?区别和联系.
1
进程:正在运行的程序,负责程序的内存分配.
线程:线程是进程中一个独立执行的控制单元(路径),一个进程至少包含一条线程,即主线程.
创建线程的目的:开辟一条新的执行路径,运行指定的代码,与主线程的代码实现同时执行.
#####6.对多线程开发的理解,iOS中有几种实现多线程的方式.
1
多线程的使用场景:防止卡顿,可以同时完成多个任务,且不影响主线程,把耗时操作放在子线程中执行,但是会消耗内存.
实现多线程的方式:
①.NSThread(内存需要自己管理.触发),
②.NSOperationQueue(不再关注线程,当前可执行任务个数queue.maxConcurrentOperationCount)
③.GCD
④:Theard
详解三种实现多线程的方式: GCD: GCD里面包含了串行队列、并行队列、主队列、全局队列。 Dispatch_queue_t q = dispatch_queue_create(“qqq”,DISPATCH_QUEUE_SERIAL);创建一个串行队列 Dispatch_sync(q,^{ });开启同步任务 Dispatch_async(q,^{ });开启异步任务 并行队列:DISPATCH_QUEUE_CONCURRENT 主队列:dispatch_queue_t q = dispatch_get_main_queue(); 全局队列:dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); >>> NSThread 获取当前线程:NSThread * current = [NSThread currentThread]; 获取主线程:NSThread * main = [NSThread mainThread]; 使用NSThread创建线程的两种方式: - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument; + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument; 暂停当前线程: [NSThread sleepForTimeInterval:2]; >>> NSOperationQueue 创建一个操作队列:NSOperationQueue * queue = [[NSOperationQueue alloc]init]; 添加NSOperation到NSOperationQueue中:[queue addOperation:operation]; 添加一组operation:[queue addOperations:operations waitUntilFinished:NO]; 添加一个block形式的operation:[queue addOperationWithBlock:^(){ }]; 添加NSOperation的依赖对象:[operation2 addDependency:operation1]; 设置队列的最大操作数:[queue setMaxConcurrentOperationCount:1]; 等待options完成:[operation waitUntilFinished]; 暂停、继续queue:[queue setSuspended:YES] [queue setSuspend:NO]
#####7.线程同步和异步的区别?ios中如何实现线程的同步?
1
同步:任务顺序执行,下一个任务依赖于上一任务的完成.
异步:任务执行顺序不定,一起执行.
实现:设置依赖:NSOpreationQueue GCD中的串行队列.
#####8.iOS类是否可以多继承,如果没有,怎么实现?
1
不可以多继承.可以通过类目,延展,协议实现多继承.
类目:类目也叫分类,英文category,在没有原类.m文件的基础上,给该类添加方法.类目里不能添加实例变量,不能添加和原始类方法名相同的方法,否则会发生覆盖.一个类可以添加多个类目,类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继承.
延展:Extension,是一种特殊形式的类目,主要是在一个类的.m里面声明与实现.作用:就是给某类添加私有方法或者私有变量.
虽然延展是给一个类定义私有方法,但是OC没有绝对的私有方法,其实还是可以调用的,延展里面声明的变量只能在该类内部使用,外界访问不了.如果是新建文件建的的某类延展.h文件,则不能添加实例变量,如果括号里没有类目名,则认为延展里面的方法为全都必须实现,如果有,则可选实现.
类目写的方法必须实现,延展写的方法非必须.
#####9.栈和堆的区别?
1
栈:内存系统管理(系统开辟,系统释放),先进后出.
堆:内存自己管理(自己开辟,自己释放).先进先出.
#####10.iOS本地数据存储都有几种方式?
1
①.NSkeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码.
②.NSUserDefaults:用来保存应用程序设置和属性,用户保存的数据.用户再次打开程序或者开机后这些数据仍然存在.NSUserDefaults可以存储的数据类型包括:NSData,NSString,NSNumber,NSDate,NSArray.NSDictionary,其他类型的数据需要先行转换.
③.Write写入方式:永久保存在磁盘中.具体:a.获得文件保存的路径.b.生成该路径下的文件,c,往文件中写入数据.d.从文件中读出数据.
④.SQLite:采用SQLite数据库来存储数据,SQLite作为一种轻量级数据库.具体:a.添加SQLite相关的库以及头文件,b.使用数据库存数数据:打开数据库,编写数据库语句,执行,关闭数据库.另:写入数据库,字符串可以采用char方式,而从数据库中取出char类型,当char类型有表示中文字符时,会出现乱码,这是因为数据库默认使用ascII编码方式,所以想要正确从数据库中取出中文,需要使用NSString来接受从数据库取出的字符串.
⑤.CoreData:原理是对SQLite的封装,开发者不需要接触sql语句,就可以对数据库进行操作.
#####11.ios动态类型和动态绑定
1
多态:父类指针指向子类对象.
动态类型:只有在运行期,才能确定其真正类型.
动态加载:根据不同的条件,加载不同的资源.32和64位.
#####12.深拷贝和浅拷贝的理解.
1
深拷贝;拷贝的内容.
浅拷贝:拷贝的指针.
深拷贝如:
NSMutableDictionary * dic = [@{} mutableCopy];
NSMutableArray * ary = [@[] mutableCopy];
#####13.怎么实现一个单例的类.
1
单例是一种设计模式,对象只有一个.缺点:对象不会被释放,如果创建很多的话会占用很多内存,优点:可以当做工具类使用.
static SortDetailsModelDown * single = nil; +(SortDetailsModelDown *)shareSortDetailsModelDown{ @synchronized(self){ if (!single) { single = [[SortDetailsModelDown alloc]init]; } } return single; }
#####14.什么是安全释放?
1
先释放再置空.
#####15.RunLoop是什么?
1
事件循环,是线程里面的一个组件.主线程的RunLoop是自动开启的.分为:计时源(timer source),事件源(输入源):input source.防止CPU中断(保证程序执行的线程不会被系统终止).
Runloop提供了一种异步执行代码的机制,并不能并行执行任务,是事件接收和分发机制的一个实现.每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的,需要为RunLoop添加至少一个事件源,然后run它.
一般情况下我们是没有必要去启动线程的RunLoop的,除非你在一个单独的线程中需要长时间的检测某个事件.
RunLoop,正如其名所示,是线程进入和被线程用来响应事件以及调用事件处理函数的地方.
input source传递异步事件,通常是来自其他线程和不同程序的消息.
timer source传递同步事件.
当有事件发生时,RunLoop会根据具体的事件类型通知应用程序作出响应.
当没有事件发生时,RunLoop会进入休眠状态,从而到达省电的目的.
当事件再次发生时,RunLoop会被重新唤醒,处理事件.
一般在开发中很少会主动创建RunLoop,而通常会把事件添加到RunLoop中.
#####16.什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储.
1
序列化和反序列化:归档和反归档,进行本地化,进行数据存储.
CoreData:数据托管.有四种存储方式:xml,sqlite,二进制,内存.
遵循NSCoding协议之后,进行归档即可实现复杂对象的存储.
#####17.写一个标准宏MIN,这个宏输入两个参数并返回较小的一个.
1
#######define MIN(A,B) (A)>(B)?(B):(A)
#####18.iPhone OS 有没有垃圾回收机制,简易阐述一下OC内存管理.
1
木有.引用计数,ARC和MRC,swift(自动引用计数).
#####19.简述应用程序按HOME键进入后台时的生命周期,以及从后台进入前台时的生命周期.
1
前者:
-(void)applicationWillResignActive:(UIApplication *)application
-(void)applicationDidEnterBackground:(UIApplication *)application
后者:
-(void)applicationWillEnterForeground:(UIApplication *)application
-(void)applicationDidBecomeActive:(UIApplication *)application
另:
各个程序运行状态时代理的回调:
-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告诉代理进程启动但还没进入状态保存
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告诉代理启动基本完成程序准备开始运行
-(void)applicationWillResignActive:(UIApplication *)application
当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
-(void)applicationDidBecomeActive:(UIApplication *)application
当应用程序入活动状态执行,这个刚好跟上面那个方法相反
-(void)applicationDidEnterBackground:(UIApplication *)application
当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
-(void)applicationWillEnterForeground:(UIApplication *)application
当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
-(void)applicationWillTerminate:(UIApplication *)application
当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。
-(void)applicationDidFinishLaunching:(UIApplication*)application
当程序载入后执行
在上面8个方法对应的方法中键入NSLog打印。
现在启动程序看看执行的顺序:
启动程序
lifeCycle[40428:11303] willFinishLaunchingWithOptions
lifeCycle[40428:11303] didFinishLaunchingWithOptions
lifeCycle[40428:11303] applicationDidBecomeActive
按下home键
lifeCycle[40428:11303] applicationWillResignActive
lifeCycle[40428:11303] applicationDidEnterBackground
双击home键,再打开程序
lifeCycle[40428:11303] applicationWillEnterForeground
lifeCycle[40428:11303] applicationDidBecomeActive
#####20.ViewController、alloc,loadView,viewDidLoad,viewWillAppear,viewDidUnload,dealloc,init分别是在什么时候调用?在自定义ViewController的时候这几个函数里面应该做什么工作?
1
alloc:申请内存时调用.
loadView:加载视图时调用.
viewDidLoad;视图已经加载后调用.
viewWillAppear:视图将要出现时调用.
dealloc:销毁该视图时调用.
init;初始化该视图时调用.
相关文章推荐
- 面试 (一) : iOS基础篇-6(100题81~100)
- 面试 (一) : iOS基础篇-4(100题41~60)
- 面试 (一) : iOS基础篇-5(100题61~80)
- 面试 (一) : iOS基础篇-3(100题21~40)
- 笔试、面试100题(1---20)
- 【java 面试100】20.输入一个表示整数的字符串,把该字符串转换成整数并输出
- 10个Objective-C基础面试题,iOS面试必备
- iOS开发者面试必备:10个Objective-C基础面试题
- 【从零单排之微软面试100题系列】20之把字符串转换成整数
- IOS-20-数据库操作之(SQLite第三方封装库FMDB)的基础入门使用及demo源码
- 微软面试100题之20题:输入一个表示整数的字符串,把该字符串转换成整数并输出
- IOS面试基础知识
- ios面试基础
- 面试100题:20.把对应数字字符串转换成整数
- 微软等数据结构+算法面试100题(20)--二叉树公共父节点
- ios面试 笔试基础题
- [答案V0.1版]精选微软等数据结构+算法面试100题 [前20题]
- 微软等面试100题系列--(1-20)
- 黑马程序员——黑马ios入学考试基础视频及面试考到的知识——黑马 ios 技术博客
- 戴维营教育2015年iOS暑期班笔试面试基础考核题