ios面试题大全

一 C语言方法的知识

  1: const  static  voilite 修辞变量各代表什么意思?

   const  修辞的变量为常量,常量是不容许修改。

    static  修辞的变量为静态变量,在内存中只被创建一次(如UItableView 中创建Cell的代理方法 用会用到静态变量标识Cell)

   Volatile定义变量为一个共享变量

  2: static 的作用

  在类中 static  修饰的变量属于整个类的所有,对类的所有对象共享一份

  在类中static   修辞的方法属于这个类所有,该方法不能通过this来访问  只能通过类来访问该方法。

         在函数体 static修辞的变量 在内存中只被分配一次,多次调用函数体都是调用内存中的同一份。

二   OC中内存方面。

1 :OC 中内存管理方式

   当对象调用  alloc /retain /copy 的方法时,对象的引用计数器会加1 ,当对象不在使用的时候要调用release/Autorelease将其释放。

2 :release和Autorelease的区别。

    当对象调用release的时候 对象的引用计数器减1.

    当对象调用Autorelease 对象引用计数器会被系统放在最新的一个自动释放池中,当程序执行作用域外 自动释放池就会被释放此时对象的引用计数会被减1.

3:readwrite  readonly   assign  retain  copy  atomic  nonatomic的属性作用

   readwrite  readonly是设置属性访问级别。

   assgin  是直接赋值 系统默认的

   retain   该类想一直持有属性,对象属性计数器会加1

   copy   对象的拷贝 (当属性是NSString 是对象拷贝时浅拷贝 ,当对象时NSMutableString  对象时深拷贝)

   atomic nonatomic 线程访问  nonatomic是非原子访问,不加同步。

    4: 深拷贝和浅拷贝的区别。

    浅拷贝是指针拷贝对象引用计数加1(如NSString对象调用copy是浅拷贝)

     深拷贝在原有对象基础上拷贝出一个新的对象(如NSMutableString对象调用copy是深拷贝)

5: OC中如何管理内存

    有2种  第一 手动管理方式   第二 ARC 自动管理方式。

三  OC中面向对象

1: 什么是多态

    多态   子类的指针可以指向父类,调用相同的方法 实现不同的功能。

  2:代理的作用

   代理 改变或控制传递链。容许一个类在特定的情况下通知其他类来完成某项功能(如应用程序启动完成 会调用applicationDelegate类的方法来监听应用程序的生命周期)

3:类别的作用(category)

    类别主要作用可以动态为类扩展新的功能和方法。(如在项目中很多地方都使用文件缓存即 在NSObject中添加一个保存缓存的方法,方便公用)

4: 类别和扩展的区别。

相同点:

   类别和扩展都可以动态为类添加新的方法,

不同点:

类扩展可以添加属性,并且类扩展声明的方法都必须实现。

类别 不能添加属性,类别中声明的可以不实现。

5: Object-c 支持多继承吗? 有私有方法和私有变量吗?

   Object -c 不支持多继承,可以采用多个协议来实现多继承。

            没有私有方法只有类方法和实例方法。

6: 扩展一个类是用继承好还是类别好?

           一般使用类别好,不用定义子类 还能直接把类的定义放在不同的文件里面(如要扩展NSString 的方法最好使用类别)

  7: 什么时候用delegate? 什么时候用Notification?

     delegate 针对对象一对1

     Notification对一对多。

8:@Prviate  @protected  @public 声明中代表什么含义?

      @prviate  私有的  只有本类中可以访问

      @protected 受保护,只有本类和子类中可以访问

      @public  公用   任何类都可以访问。

四  OC中的特性:

   1:  id声明的对象有什么特性?

    id 声明的对象具有运行时的特性。声明对象可以指向OC中任何类型的对象。

2:对于NSString * str =[[NSDate alloc ] init ]   对象str编译时和运行时的类型区别?

    str 编译时 是NSString   运行时 是NSDate

     3: KVC和KVO的区别

    KVC 键值编码是一种间接访问对象属性的的机制,通过字符串来间接访问属性。

   KVO 键值观察模型  当对象属性发生变化 会自动响应对象的指定方法

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

    @class 用来声明一个类 用来解决同文件相互包含

#import 是OC引入头文件的关键字,

#include 是C语言引入头文件的关键字。

#include引入头文件可能引起重复编译 而#import则不会引起重复编译。

  5:线程和进程的区别?

    相同点:线程和进程都是操作系统运行中基本单元,系统利用该基本单元实现系统对应用的并发。

    不同点:

   进程有独立的地址空间 一个进程崩溃 在保护模式下不会影响其他进程。

   线程是进程中执行片段路径,线程没有独立的地址空间 但是有自己的堆栈和局部变量,一个线程崩溃等于整个进程死掉。即 多进程比多线程健壮性更好,但是系统在切换进程中会浪费多资源。

  6:堆和栈的区别?

     管理方式:

栈上的变量 是由编译器自动管理 不需要手动管理。

       堆上的变量  是由程序员手动开辟和释放。

    7: id  nil  Nil的区别?

   id 是声明对象具有运行时的特性。可以指向OC对象中的任何类型。

  nil  指的对象的指针为空。

  Nil  指向空的类。

     8:@import<>,@import “” 和@class的区别

       @class 用来声明一个类 用来解决同文件相互包含

       @import<> 用来导入系统头文件

       @import “”  用来导入自定义头文件

    9: 方法和选择器有何不同?

        selector(方法) 表示方法名称

       method 是一个组合体 表示方法名称和实现。

    10 :你对@property 和@interface 的理解

      @interface 用来声明一个类。

     @property 用来声明2个方法  编译器会自动生成 get  set方法。

   11: OC 语言的优缺点

   优点:

     1:category

      2: C  C++  OC 混编。

     3: 动态识别

    缺点:

    1:不支持运算符重载

    2:不支持多继承。

五: IOS 生命周期

  1:ViewController 的 loadView, viewDidLoad, viewDidUnload 分别是在什么时候调用的?

       loadView  是当调用 self.view=nil 会调用loadView方法

   viewDidLoad 是当View加载完成后调用该方法。

           viewDidUnload是view的视图控制器在window上销毁后调用。

2: 应用程序被打开有几种方法

       1: 正常打开

       2:本地通知打开程序

       3:被另一程序调用打开(程序可以开启微信)

六  IOS中UI部分

1:Frame 和Bounds的区别?

       Frame 是子View的坐标相对于View的位置。

      Bounds 是自己的坐标系(其中X =0  Y=0)

    2: UIView和CALayer的区别?

   UIView是ios基本界面基础 所有界面元素都基础UIView上,在UIView内部上绘图部分是由图层来完成。

  3: 事件处理过程

   当用户触摸在一个View的点时   看点是否存在subview 和subview的subview上。

    如果同时都存在  事件处理有当前View处理。

    如果不是同时存在subview的subview上 触摸点由由最近的一个Subview来处理。

4; 事件处理终止条件

  alphe <0.01

userInteractionEnabled=NO

  Hidden ==yes

5: UIView的生命周期是什么样的?顺序是怎么样的。

创建View和呈现View

  init  -- loadView --ViewdIdLoad --ViewwillAppear-- viewDidAppear

      View的消失和销毁

            viewWillDisappear--viewDidDisappear--ViewUnload--dealloc

6:UIViewController在什么时候回加载View.

当调用self.view =nil的时候 会调用loadView去重新加载View.

7: UITableView中代理方法执行的流程是什么样的?

   第一步: 得到section   -- numberofSectionTableView

   第二步: 得到Row  -- numberofRowTableView

  第三步: 创建Cell -——方法忘记了。

8: UITaleView中怎样实现重复使用Cell.

  1: UITableView对象 先冲缓存中取出Cell

  2: 取出Cell 如果为nil 就重现创建

  3: 取出的Cell如果不为nil  就是重新赋值。

9:如何设计一个可变高度的Cell?

   1:得到内容 通过内容算出内容所占的高度

   2:在UITableView中设置Cell代理方法中 把算出来的高度赋值即可。

10: 谈谈UITableView中使用MVC模式。

   MVC模式

   M 代表数据模型 主要提供数据源。

   V 代表视图模型  主要用来展示界面。

   C 代表控制器  主要是数据模型和视图模型的桥梁。

七 :IOS的数据存储

1:ios存储数据源有哪些方式。

    文件存储(文件缓存),

    plist ,

    NSUserDefault(用来存储密码)

    sqlit(商品信息)

3: 数据库优化经验

     1:批量操作要在一个数据库连接中完成

     2: 多个操作要开启事物

     3:查询要开启分页查询。

八:IOS中网络和线程

   1:网络请求的安全性处理。

   答:一般请求中都用的是Post的请求,Post请求的参数都经过 Base64编码。

   2:ios中常用线程

     队列(operationQueue)  创建一个任务 把任务加入到任务队里就开启了一个异步线程。

     GCD 操作

  3:什么是TCP三次握手

第一次握手: 客户端向服务器发送请求 等待服务确认

    第二次握手: 服务处理客户端的请求。

   第三次握手:  服务器把处理好的请求响应给客户端。

4:Socket建立网络连接步骤

1:客户端请求: 客户端通过套接字向指定IP 端口 协议发出请求。

      2:服务端监听:服务端套接字实时监控网络请求 等待客户端的请求。

      3:连接确认:当服务端监听到客户端发送过来套接字 并且处理响应给客户端。

九 :IOS其他操作

   1:ios消息推送机制

    答:   ①:应用程序 把 要发送的消息 和 iphone的标识打包   发送给 苹果推送服务器

   ②:苹果服务器  逐一查找打包好的iphone标识 并且发送消息

              ③:iphone把发送消息传递给相应的程序 弹出push的通知

十: ios 开发中遇到的问题

      1:连续多次点击导航按钮,会重复创建多个控制器?

         解决方案: 在点击按钮中加一个bool值判断,如果一次点击 直接创建VC,第二点击就不执行创建VC

 

1. #import 跟#include、@class有什么区别?#import<> 跟 #import”"又什么区别?

1> #import和#include都能完整地包含某个文件的内容,#import能防止同一个文件被包含多次

2> @class仅仅是声明一个类名,并不会包含类的完整声明;@class还能解决循环包含的问题

3> #import <> 用来包含系统自带的文件,#import “”用来包含自定义的文件

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

1> readwrite:同时生成get方法和set方法的声明和实现

2> readonly:只生成get方法的声明和实现

3> assign:set方法的实现是直接赋值,用于基本数据类型

4> retain:set方法的实现是release旧值,retain新值,用于OC对象类型

5> copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型

6> nonatomic:非原子性,set方法的实现不加锁(比atomic性能高)

3. 写一个setter方法用于完成@property (nonatomic,retain)NSString *name,写一个setter方法用于完成@property(nonatomic,copy)NSString *name.

1> @property (nonatomic, retain) NSString *name;

- (void)setName:(NSString *)name

{

if (_name != name) {

[_name release];

_name = [name retain];

}

}

2> @property(nonatomic, copy) NSString *name;

- (void)setName:(NSString *)name

{

if (_name != name) {

[_name release];

_name = [name copy];

}

}

4. 对于语句NSString*obj = [[NSData alloc] init]; ,编译时和运行时obj分别是什么类型?

1> 编译时是NSString类型

2> 运行时是NSData类型

5. 常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?

1> 常用OC类型:NSString、NSArray、NSDictionary、NSData、NSNumber等

2> OC对象需要手动管理内存,C的基本数据类型不需要管理内存

6. id 声明的变量有什么特性?

id声明的变量能指向任何OC对象

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

1> 每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器减为0时,就会被销毁

2> 通过retain可以让对象的计数器+1、release可以让对象的计数器-1

3> 还可以通过autorelease pool管理内存

4> 如果用ARC,编译器会自动生成管理内存的代码

8. 内存管理的几条原则时什么?按照默认法则.哪些方法生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?

1> 只要调用了alloc、copy、new方法产生了一个新对象,都必须在最后调用一次release或者autorelease

2> 只要调用了retain,都必须在最后调用一次release或者autorelease

3> @property如果用了copy或者retian,就需要对不再使用的属性做一次release操作

4> 如果用了ARC,另外讨论

9. 看下面的程序,三次NSLog会输出什么?为什么?

NSMutableArray* ary = [[NSMutableArray array] retain]; 

NSString *str = [NSString stringWithFormat:@"test"];  // 1

[str retain];   // 2

[ary addObject:str]; // 3

NSLog(@"%d", [str retainCount]); 

[str retain];  // 4

[str release];   // 3

[str release];   // 2

NSLog(@"%d", [str retainCount]); 

[ary removeAllObjects]; // 1

NSLog(@"%d", [str retainCount]);

结果:3、2、1

10. OC中创建线程的方法是什么?如果指定在主线程中执行代码?如何延时执行代码?

1> 创建线程的方法

Ø NSThread

Ø NSOperationQueue和NSOperation

Ø GCD

2> 主线程中执行代码

Ø [self performSelectorOnMainThread: withObject: waitUntilDone:];

Ø [self performSelector: onThread:[NSThread mainThread] withObject: waitUntilDone:];

Ø dispatch_async(dispatch_get_main_queue(), ^{

});

3> 延时执行

Ø double delayInSeconds = 2.0;

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW,

(int64_t)(delayInSeconds * NSEC_PER_SEC));

dispatch_after(popTime, dispatch_get_main_queue(), ^(void){       

});

Ø [self performSelector: withObject: afterDelay:];

Ø [NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:];

 

警告:一定要把英文题目过一遍,有些公司的题目故意弄成英文的!!!

1. Difference between shallow copy and deep copy?

1> 浅拷贝:指针(地址)拷贝,不会产生新对象

2> 深拷贝:内容拷贝,会产生新对象

2. What is advantage of categories? What is difference between implementing a category and inheritance?

1> 分类可以在不修改原来类模型的基础上拓充方法

2> 分类只能扩充方法、不能扩充成员变量;继承可以扩充方法和成员变量

3> 继承会产生新的类

/*

3. Difference between categories and extensions?

1> 分类是有名称的,类扩展没有名称

2> 分类只能扩充方法、不能扩充成员变量;类扩展可以扩充方法和成员变量

3> 类扩展一般就写在.m文件中,用来扩充私有的方法和成员变量(属性)

4. Difference between protocol in objective c and interfaces in java?

1> Java的接口中声明的方法必须都实现

2> Oc的protocol中声明的方法并不一定要实现

5. What are KVO and KVC?

1> KVC是键值编码,可以通过一个字符串的key(属性名)修改对象的属性值

2> KVO是键值监听,可以监听一个对象属性值的改变

6. What is purpose of delegates?

1> 两个对象之间传递数据和消息

2> 解耦,拆分业务逻辑

7. What are mutable and immutable types in Objective C?

1> mutable是可变类型,比如NSMutableArray,可以动态往里面添加元素

2> immutable是不可变类型,比如NSArray,固定的存储空间,不能添加元素

8. When we call objective c is runtime language what does it mean?

1> 动态绑定:对象类型在运行时才真正确定

2> 多态性

3> 消息机制

9. what is difference between NSNotification and protocol?

1> 通过NSNotification可以给多个对象传递数据和消息

2> 通过protocol(代理模式)只能给一个对象传递数据和消息

10. What is push notification?

1> 本地推送:程序内部弹出通知到用户设备

2> 远程推送:由推送服务器推送通知到用户设备

11. What is Polymorphism?

多态:父类指针指向子类对象

12. What is Singleton?

单粒:保证程序运行过程中,永远只有一个对象实例

目的是:全局共享一份资源、节省不必要的内存开销

13. What is responder chain?

响应者链:

l UIResponder有一个nextResponder属性,通过该属性可以组成一个响应者链,事件或消息在其路径上进行传递

l 如果UIResponder没有处理传给它的事件,会将未处理的消息转发给自己的nextResponder

wpsC094.tmp

14. Difference between frame and bounds?

1> frame以父控件的左上角为坐标原点

2> bounds以控件本身的左上角为坐标原点

15. Difference between method and selector?

通过一个selector可以找到方法地址,进而调用一个方法

16. Is there any garbage collection mechanism in Objective C.?

1> OC 1.0没有垃圾回收

2> OC 2.0有垃圾回收,只能用在Mac上

3> iOS中有ARC机制,是编译器特性,垃圾回收是运行时特性

17. What is NSOperation queue?

1> 用来存放NSOperation对象的队列,可以用来异步执行一些操作

2> 一般可以用在网络请求等耗时操作

18. What is lazy loading?

延迟加载:比如控制器的view,在第一次用到view时才会调用loadView方法进行创建

19. Can we use two tableview controllers on one viewcontroller?

从技术角度上分析,一个控制器内部添加2个表格控制器是没有问题的

20. Can we use one tableview with two different datasources? How you will achieve this?

从对象属性上分析,tableView只有一个dataSource属性。当然,真要使用2个不同的数据源,还是有其他办法解决的

 

1. When to use NSMutableArray and when to use NSArray?

1> 当数组元素需要动态地添加或者删除时,用NSMutableArray

2> 当数组元素固定不变时,用NSArray

2. Give us example of what are delegate methods and what are data source methods of uitableview.

1> 代理方法:返回tableView每行的高度、监听tableView每行的选中

2> 数据源方法:返回tableView数据的组数和行数、每行显示什么数据

3. How many autoreleasepool you can create in your application? Is there any limit?

没有限制

4. If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us?

系统会默认会不定时地创建和销毁自动释放池

5. When you will create an autorelease pool in your application?

当不需要精确地控制对象的释放时间时,可以手动创建自动释放池

6. When retain count increase?

当做一次retain或者copy操作,都有可能增加计数器

7. What are commonly used NSObject class methods?

NSObject常见的类方法有:alloc、new、description等

8. What is convenience constructor?

像NSStirng的stringWithFormat,NSNumber的numberWithInt

9. How to design universal application in Xcode?

1> 创建项目时,Device选择Universal

2> 可以创建一套痛用的数据模型

3> 根据iPhone\iPad选择不同的控制器(iPad可能用UISplitViewController)

4> 根据iPhone\iPad选择不同的界面

10. What is keyword atomic in Objective C?

1> atomic是原子性

2> atomic会对set方法的实现进行加锁

11. What are UIView animations?

UIView封装的核心动画可以通过类方法\block实现

12. How can you store data in iPhone applications?

1> 属性列表

2> Preference(NSUserDefaults)

3> 键值归档(NSKeyedArchiver、NSCoding)

4> SQLite数据库

5> Core Data

13. What is NSManagedObject model?

NSManagedObject是Core Data中的实体对象

14. What is predicate?

谓词:可以以一定条件来过滤数组、字典等集合数据,也能用在Core Data的数据查询中

 

1. Object-C有多继承吗?没有的话用什么代替?

1> OC是单继承,没有多继承

2> 有时可以用分类和协议来代替多继承

2. Object-C有私有方法吗?私有变量呢?

1> OC没有类似@private的修饰词来修饰方法,只要写在.h文件中,就是公共方法

2> 可以使用类扩展(Extension)来增加私有方法和私有变量

3. 关键字const什么含义?

const int a;

int const a;

const int *a;

int const *a;

int * const a;

int const * const a;

1> 前两个的作用是一样:a 是一个常整型数

2> 第三、四个意味着 a 是一个指向常整型数的指针(整型数是不可修改的,但指针可以)

3> 第五个的意思:a 是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的)

4> 最后一个意味着:a 是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的)

4. static的作用?

1> static修饰的函数是一个内部函数,只能在本文件中调用,其他文件不能调用

2> static修饰的全部变量是一个内部变量,只能在本文件中使用,其他文件不能使用

3> static修饰的局部变量只会初始化一次,并且在程序退出时才会回收内存

5. 线程和进程的区别?

1> 一个应用程序对应一个进程,一个进程帮助程序占据一块存储空间

2> 要想在进程中执行任务,就必须开启线程,一条线程就代表一个任务

3> 一个进程中允许开启多条线程,也就是同时执行多个任务

6. 堆和栈的区别?

1> 堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存

2> 栈空间的内存由系统自动分配,一般存放局部变量等,不需要手动管理内存

7. 为什么很多内置的类,如TableView的delegate的属性是assign不是retain?

1> tableView的代理一般都是它所属的控制器,控制器会对它内部的view做一次retain操作

2> 假设tableView也对代理(控制器)做一次retain操作,那么就出现循环retain问题

8. 定义属性时,什么情况使用copy、assign、retain?

1> copy:NSString、Block等类型

2> assign:非OC对象类型, 基本数据类型(两个对象相互引用的时候,一端用retain, 一端用assign)

3> retain:OC对象类型

9. 对象是什么时候被释放的?

每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器减为0时,就会被销毁

10. tableView的重用机制?

这里只是简述:将离开屏幕的cell放到缓存池,重新拿来显示到屏幕的其他位置(其他自己详细描述)

11. ViewController 的loadView、viewDidLoad、viewDidUnload分别是什么时候调用的,在自定义ViewCointroller时在这几个函数中应该做什么工作?

 

1> loadView

Ø 当第一次使用控制器的view时,会调用loadView方法创建view

Ø 一般在这里自定义view

2> viewDidLoad

Ø 当控制器的view创建完毕时会调用,也就是在loadView后调用

Ø 一般在这里添加子控件、初始化数据

3> viewDidUnload

Ø 当控制器的view因为内存警告被销毁时调用

Ø 一般在这里回收跟界面相关的资源(界面都会销毁了,跟界面相关的资源肯定不要了)

12. ViewController的didReceiveMemoryWarning是在什么时候调用的?默认的操作是什么?

Ø 当应用程序接收到系统的内容警告时,就有可能调用控制器的didRece…Warning方法

Ø 它的默认做法是:

l 当控制器的view不在窗口上显示时,就会直接销毁,并且调用viewDidUnload方法

13. 怎么理解MVC,在Cocoa中MVC是怎么实现的?

1> M:Model,模型,封装数据

2> V:View,视图界面,负责展示数据

3> C:Controller,控制器,负责提供数据(Model)给界面(View)

14. self.跟self->什么区别?

1> self.是调用get方法或者set放

2> self是当前本身,是一个指向当前对象的指针

3> self->是直接访问成员变量

15. id、nil代表什么?

1> id类型的指针可以指向任何OC对象

2> nil代表空值(空指针的值, 0)

16. 如何对iOS设备进行性能测试?

Timer Profile

你可能感兴趣的:(ios面试题大全)