iOS面试题 2016版✨

版权声明:本文为博主原创文章,未经博主允许不得转载。

1. OC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release?为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?
以下是针对MRC(手动内存释放)模式:
与alloc语义相反的方法是dealloc,与retain语义相反的方法是release。
alloc是为对象在内存中开辟空间,而dealloc则是对象销毁时释放空间。
retain方法是对象开辟空间以后使对象的引用计数器加1,而release是对象的引用计数器减1。
需要与alloc配对的方法是release,因为对象创建以后,对象的引用计数器自动加1,
而调用release方法后,对象的引用计数器归0,系统会自动调用dealloc方法释放空间。
2. 在一个对象的方法里面:self.name = @"object";和 _name = @"object"有什么不同吗?
self.name = @"object"; 是通过点语法修改属性name的值。
本质上使用的是name属性的setter方法进行的赋值操作,实际上执行的代码是
[self setName:@"object"];
例如:
@property(nonatomic, strong) NSString *name;
//根据@property关键词,系统自动生成setter方法。

  • (void)setName:(NSString *)name{
    //根据strong关键词
    [name retain]; //内存计数+1
    [_name release]; //把之前指针指向的内容内存计数-1
    _name = name; //指向新内容
    }
    _name = @“object”; 只是单纯的把‘_name’指针指向‘@"object"’字符串对象所在的地址,
    没有调用方法。
    3. 这段代码有什么问题吗?
    -(void)setAge:(int)newAge{
    self.age = newAge;
    }
    在age属性的setter方法中,不能通过点语法给该属性赋值。
    会造成setter方法的循环调用。因为self.age = newAge;
    本质上是在调用 [self setAge:newAge]; 方法。
    解决循环调用的方法是方法体修改为 _age = newAge;
    另外 变量名称不能使用new开头!
    4. 以下每行代码执行后,person对象的retain count分别是多少?
    Person *person = [[Person alloc] init];
    [person retain];
    [person release];
    [person release];
    Person *person = [[Person alloc] init]; =1
    [person retain]; +1 = 2
    [person release]; -1 = 1
    [person release]; -1 = 0
    内存计数技术规律
    alloc,new,copy 内存计数 = 1
    retain +1
    release -1
    UIView addSubview +1
    NSMutableArray addObject +1
    5. 这段代码有什么问题,如何修改?
    for(int i = 0; i < someLargeNumber; i++){
    NSString *string = @“Abc”;
    string = [string lowercaseString];
    string = [string stringByAppendingString:@“xyz”];
    NSLog(@“%@“, string);
    }
    代码本身不会报错。
    但是猜测出题者的意思是要循环添加为 abcxyzxyzxyz.....这样的形式。
    如果是想在Abc后面拼接多个xyz字符串的话,
    则需要把"NSString *string = @“Abc”;" 这行代码放在循环语句外面。
    6. 简要叙述面向对象的特点,特别是多态。
  1. 封装
    封装是对象和类概念的主要特性。它是隐藏内部实现,提供外部接口,可以看作是“包装”。
    封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,
    对不可信的进行信息隐藏。
    封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,
    以特定的访问权限来使用类的成员。
    好处:可以隐藏内部实现细节。通过大量功能类封装,加快后期开发速度。
  2. 继承
    面向对象编程 (OOP) 语言的一个主要功能就是“继承”。
    继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下
    对这些功能进行扩展。
    通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。
    继承的过程,就是从一般到特殊的过程。在考虑使用继承时,有一点需要注意,
    那就是两个类之间的关系应该是“属于”关系。
    例如,Employee(雇员)是一个人,Manager(领导)也是一个人,因此这两个类都可以继承Person类。
    但是 Leg(腿) 类却不能继承 Person 类,因为腿并不是一个人。
  3. 多态
    多态性(polymorphism)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,
    赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
    简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
    不同对象以自己的方式响应相同的消息的能力叫做多态。
    意思就是假设生物类(life)都用有一个相同的 方法-eat;那人类属于生物,猪也属于生物,
    都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。
    也就是不同的对象以 自己的方式响应了相同的消息(响应了eat这个选择器)。
    实现多态,有二种方式,覆盖,重载。
    • 覆盖(override),是指子类重新定义父类的虚函数的做法。
    • 重载(overload),是指允许存在多个同名函数,而这些函数的参数表不同
    (或许参数个数不同,或许参数类型不同,或许两者都不同)。
    ** 这里注意:OC没有重载,因为OC只认函数名,不认参数类型。OC不允许存在多个同名函数。
    总结:封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);
    它们的目的都是为了——代码重用。
    而多态则是为了实现另一个目的——接口重用!
    多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
    在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。
    在类层次中,子类继承了多个父类的数据结构和方法,则称为多重继承。
    7. objective-c 所有对象间的交互是如何实现的?
    在对象间交互中每个对象承担的角色不同,但总的来说无非就是”数据的发送者”或”数据的接收者”两种角色。消息的正向传递比较简单,直接拿到接受者的指针即可。消息的反响传递可以通过委托模式,观察者模式(本质是单例模式),block语法,AppDelegagte来实现。其中委托模式,block语法都是1对1的消息传递。 观察者模式是1对多。AppDelegate比较特殊,这是一个生命周期与进程一致的对象。
    8. 什么叫数据结构?
    数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合。通常,精心选择的数据结构可以带来更高的运行或者存储效率。
    9. OC的类可以多继承吗?可以实现多个接口吗?Category是什么?分类中能定义成员变量或属性吗?为什么?重写一个类的方式是继承好还是类别好?为什么?
    Object-c的类不可以多重继承;可以实现多个接口(协议),通过实现多个接口可以完成C++的多重继承;Category是类别,推荐使用类别,用Category去重写类的方法,仅对本引入Category的类有效,不会影响到其他类与原有类的关系。
    10. #import和#include有什么区别?@class呢?#import<>和#import”“有什么区别?

import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import””用来包含用户头文件。例如:/* 如果这里不写@class,则报错。 原因是找不到MyVC的定义。因为代码执行顺序是由上至下的。当声明协议MyVCDelegate时, MyVC还没有声明。使用 @class 名称随便写,不管是否存在。 可以自己用代码尝试随意写个@class 例如:@class Hello; 就算项目中根本没有Hello类,这里也不会报错。 因为只有当项目运行起来,才会真的去检查Hello类是否声明了。*/@class MyVC;@protocol MyVCDelegate- (void)myVC:(MyVC *)myVC click:(id)sender;

@end
@interface MyVC : BaseVC
@end
ps:iOS7之后的新特性,可以使用@import 关键词来代理#import引入系统类库。
使用@import引入系统类库,不需要到build phases中先添加添加系统库到项目中。
11.属性readwrite, readonly, assign, retain, copy, nonatomic各是什么作用?在哪种情况下用?
1.readwrite 是可读可写特性;需要生成getter方法和setter方法时
(补充:默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数))
2.readonly 是只读特性,只会生成getter方法,不会生成setter方法;不希望属性在类外改变
3.assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
4.retain(MRC)/strong(ARC) 表示持有特性,setter方法将传入参数先保留,
再赋值,传入参数的retaincount会+1;
5.copy 表示拷贝特性,setter方法将传入对象复制一份;需要完全一份新的变量时。
6.nonatomic 非原子操作,决定编译器生成的setter和getter方法是否是原子操作。

  • atomic表示多线程安全,需要对方法加锁,保证同一时间只有一个线程访问属性,
    因为有等待过程,所以影响执行效率
  • 一般使用nonatomic。不加锁。效率会更高。但是线程不安全。
    **12. 写一个setter方法用于完成@property(nonatomic, strong)NSString name, 写一个setter方法用于完成@property(nonatomic, copy)NSString name
  • (void)setName:(NSString*)str //retain
    {
    [str retain];
    [_name release];
    _name = str;
    }
  • (void)setName:(NSString *)str //copy
    {
    id t = [str copy];
    [_name release];
    _name = t;
    }
    *13. 对于语句NSString obj = [[NSData alloc] init]; obj在编译时和运行时分别是什么类型的对象?
    编译时是NSString的类型;运行时是NSData类型的对象。
    14. 常见的OC的数据类型有哪些? 和C的基本数据类型有什么区别? 如:NSInteger和int
    object-c的数据类型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等。
    C语言的基本数据类型int,只是一定字节的内存空间,用于存放数值;
    NSInteger类型的定义是

if LP64 || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE)

|| TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;

else

typedef int NSInteger;
typedef unsigned int NSUInteger;

endif

可以看到,在64位操作系统上,NSInteger是 C语言的long类型。
在32位操作系统上,则是int类型。
15. id声明的对象有什么特性?
id 声明的对象具有运行时的特性,即可以指向任意类型的objcetive-c的对象;
可以作为返回值,也可以声明对象。
例如

  • (id)initWithName:(NSString *)name;
    id obj = [NSObject new];
    现在我们使用苹果推荐使用的“instancetype”类型代替id类型作为返回值
  • (instancetype)initWithName:(NSString *)name;
    instancetype和id的区别在于, id可以声明对象 也可以作为返回值,
    instancetype只能作为返回值。
    16. OC如何对内存管理的,说说你的看法和解决方法。
    Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。
  1. 自动内存计数ARC:由Xcode自动在App编译阶段,在代码中添加内存管理代码。
  2. 手动内存计数MRC:遵循内存谁申请,谁添加。谁释放的原则。
  3. 内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain)
    池子中所有的内存空间也被自动释放掉。 内存池的释放操作分为自动和手动。
    自动释放受runloop机制影响。
    17. 你对@interface中的成员变量和@property声明的属性的理解。
    @interface AA: NSObject{
    NSString *_name; //成员变量
    }
    @property NSString *sex; //属性
    如上所示:
    属性拥有setter和getter方法 外加_sex成员变量。
    _name只是成员变量, 没有setter和getter方法。
    18. do while 和while do的区别?
    while do是先判断while中的表达式的真假,再执行循环。
    do while先进行循环一次,再判断while中的表达式的真假。
    19. 用预处理指令#define声明一个常数,用以表明一年中有多少秒(忽略闰年问题)。

define SECONDS_PER_YEAR (60 * 60 * 24 * 365)

20. 浅拷贝和深拷贝的区别?
浅拷贝:只复制指向对象的指针,而不复制引用对象本身。
深拷贝:复制引用和对象本身。
意思就是说我有个A对象,复制一份后得到A_copy对象后,
对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,
对象本身资源还是只有一份。
那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,
这其实违背了我们复制拷贝的一个思想。
深复制就好理解了,内存中存在了两份独立对象本身。
用网上一哥们通俗的话将就是:
浅拷贝好比你和你的影子,你完蛋,你的影子也完蛋
深拷贝好比你和你的克隆人,你完蛋,你的克隆人还活着。
21. 类别的作用?继承和类别在实现中有何区别?
Category可以向类中添加新的方法,或者重写已有方法。
正常情况下不可以添加属性。但是实际应用中可以通过runtime机制添加属性。
类别主要有3个作用:

  • 将类的实现分散到多个不同文件或多个不同框架中。降低耦合性。
  • 重写主类方法
  • 向类中添加协议,属性,方法。
    继承主要作用:
  • 重写父类方法
  • 在父类基础上增加属性,方法,协议
    区别:继承使用时,需要使用子类。 Category使用时只需要引入头文件。
    22. 我们说的OC是动态运行时语言是什么意思?
    编译时等价于编码时, 编码时就是程序员写的代码的样子. 程序员为一个类编写代码,
    便可以为一个类添加 “成员变量(实例变量)” . 程序员也可以在一个类中写一些函数, 被称作“方法”.
    运行前编译, 编译器会把程序员写的代码编译成可执行文件, 里面便有之前写的类的信息,
    包括实例变量方法, 这些信息并不能组成一个实际的数据类型.
    程序运行后, 会将这些信息拼凑成一个结构体, 这个结构体便是一个数据类型.
    同时, 在运行期间, 数据类型可以改变, 表现为:
  1. 可以动态增添方法
  2. 可以动态增添实例变量
    等等..做一些运行时数据类型修改.
    一旦做了运行时修改, 就会使得这个结构体与程序员当初编写的类不一样.
    23. 为什么很多内置类如UITableView的delegate属性都是assign而不是retain ?
    如果是retain会引起循环引用。
    所有的引用计数系统,都存在循环引用的问题。例如下面的引用关系:
    对象a创建并引用了对象b,对象b创建并引用了对象c,对象c创建并引用了对象b.
    这时候b和c的引用计数分别是2和1。当a不再使用b,调用release释放对b的所有权,因为c还引用了b。
    所以b的引用计数为1,b不会被释放。b不释放,c的引用计数就是1,c也不会被释放。
    从此,b和c永远留在内存中。
    这种情况,必须打断循环引用,通过其他规则来维护引用关系。
    比如,我们常见的delegate往往是assign方式的属性而不是retain方式的属性,
    赋值不会增加引用计数,就是为了防止delegation两端产生不必要的循环引用。
    如果一个UITableViewController对象a通过retain获取了UITableView对象b的所有权,
    这个UITableView对象b的delegate又是a,如果这个delegate是retain方式的,
    那基本上就没有机会释放这两个对象了。
    24. 什么时候用delegate,什么时候用Notification?
    Delegate(委托模式):
    1对1的反向消息通知功能。
    Notification(通知模式):
    只想要把消息发送出去,告知某些状态的变化。但是并不关心谁想要知道这个。
    25. 什么是KVC和KVO?
    KVC(Key-Value-Coding):键 - 值编码是一种通过字符串间接访问对象的方式。
    而不是通过调用setter方法或通过实例变量访问的机制。很多情况下可以简化程序代码。
    例如:
    @interface MeiLing:NSObject
    @property NSString *name;
    @property UILabel *label;
    @end
    对于name的赋值 可以使用 meiLing.name = @"笑玲"; 这是点语法。调用的是setName方法。
    KVC的写法是 [meiLing setValue:@"梦玲" forKey:@"name"]; 通过name字符串赋值。
    当然也可以跨层赋值,例如为label的text属性赋值
    点语法: meiLing.label.text = @"笑玲";
    KVC: [meiLing setValue:@"梦玲" forKeyPath:@"label.text"];
    KVO:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。
    KVO 只能被 KVC触发, 包括使用setValue:forKey:方法 和 点语法。
    通过下方方法为属性添加KVO观察
  • (void)addObserver:(NSObject *)observer
    forKeyPath:(NSString *)keyPath
    options:(NSKeyValueObservingOptions)options
    context:(nullable void *)context;
    当被观察的属性发生变化时,会自动触发下方方法
  • (void)observeValueForKeyPath:(NSString *)keyPath
    ofObject:(id)object
    change:(NSDictionary *)change
    context:(void *)context
    26. 设计模式是什么?你知道哪些设计模式,并简要叙述。
  • 单例模式:通过static关键词,声明全局变量。在整个进程运行期间只会被赋值一次。
  • 观察者模式:KVO是典型的通知模式,观察某个属性的状态,状态发生变化时通知观察者。
  • 委托模式:代理+协议的组合。实现1对1的反相传值操作。
  • 工厂模式:通过一个类方法,批量的根据已有模板生产对象。
  • MVC模式:Model View Control, 把模型 视图 控制器 层进行解耦合编写。
  • MVVM模式:Model View ViewModel 把 模型 视图 业务逻辑 层进行解耦合编写。
    27. 描述一下iOS SDK中如何实现MVC的开发模式。
    MVC即 Model-View-Control
    Model称为模型层,主要负责数据结构,业务逻辑相关的操作
    View 称为视图层,主要负责视图的展示
    Control 称为控制层,主要负责把View和Model层结合起来的操作。例如点击视图上的某个按钮
    要执行Model层中的某个业务逻辑。 或者把Model中的数据展现在视图上。
    28. ViewController的didReceiveMemoryWarning是在什么时候调用的?默认的操作是什么?
    当系统内存不足时,首先UIViewController的didReceiveMemoryWarining方法会被调用。
    默认操作如果当前控制器不是window的根视图控制器,会自动将self.view释放。
    29. delegate和Block的区别?
    delegate:
  • 需要定义协议方法并且实现协议方法,会使代码结构变复杂
  • 效率没有block高
    block:
  • 代码结构更加紧凑,不需要额外定义方法。
  • 需要注意防止循环引用,使用__weak 关键词修饰
  • 当需要在块中修改外部变量时,需要对外部变量使用__block 关键词修饰
    30. frame和bounds有什么不同?
    frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
    bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
    31.ViewController生命周期
    按照执行顺序排列
  • initWithCoder:通过nib文件初始化时触发
  • awakeFromNib:nib文件被加载的时候,会发送一个awakeFromNib的消息到nib文件中的每个对象
  • loadView:开始加载视图控制器自带的view
  • viewDidLoad:视图控制器的view被加载完成
  • viewWillAppear:视图控制器的view将要显示在window上
  • updateViewConstraints:视图控制器的view开始更新AutoLayout约束
  • viewWillLayoutSubviews:视图控制器的view将要更新内容视图的位置
  • viewDidLayoutSubviews:视图控制器的view已经更新视图的位置
  • viewDidAppear:视图控制器的view已经展现到window上
  • viewWillDisappear:视图控制器的view将要从window上消失
  • viewDidDisappear:视图控制器的view已经从window上消失
    32. 如何将产品进行多语言发布,开发?
    国际化操作
    在Xcode中,Project里,找到Localization,点击+号,添加想要支持的语言
    通过新建Strings文件,把文件进行国际化处理。 通过键值对的形式,同一个key在不同的国际化
    文件中,对应不同的值。
    通过 NSLocalizedStringFromTable 等方法,通过key来自动根据iOS设备的当前语言,
    显示不同的字符串。
    33. OC中是如何实现线程同步的?
    @synchronized: 添加同步锁
    NSLock:加锁
    NSCondition:加条件锁
    dispatch_async(dispatch_get_main_queue(), ^{}); :异步主线程
    NSOperationQueue:添加线程依赖
    NSOperationQueue:设置最大并发数为1
    34. UDP和TCP的区别是什么?
    1.基于连接与无连接;
    2.对系统资源的要求(TCP较多,UDP少);
    3.UDP程序结构较简单;
    4.流模式与数据报模式 ;
    5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证
    35. TCP/IP建立连接的过程?
  • 在TCP/IP 协议中,TCP协议提供可靠的连接服务,采用三次握手建立连接;
  • 第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;
  • 第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,
    此时服务器进入SYN_RECV状态;
  • 第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,
    完成三次握手。
    (所谓的三次握手,就是要有三次连接信息的发送、接收过程。
    TCP连的建立需要进行三次连接信息的发送、接收。)
    36. 编程中,保存数据有哪几种方式?
  • 数据:Sqlite。 操作方式分为原生的sqlite3,FMDB,Coredata
  • 归档:Archive。 自定义类型需要注意遵循NSCoding协议
  • Plist:就是数组或字典,写入文件后的表现形式。
  • NSUserDefault:本质上就是Plist。
  • 写文件
  • 上传到服务器
    37. 介绍版本控制中Git与SVN。
    1、Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
    主要区别于SVN工具的功能是 分支功能比SVN强大。 (常用)
    2、SVN是Subversion的简称,是一个开放源代码的版本控制系统,它采用了分支管理系统,
    它的设计目标就是取代CVS。
    38. OC中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码,方法又是什么?
    创建线程的方法
  • [NSThread detachNewThreadSelector:nil toTarget:nil withObject:nil]
  • [self performSelectorInBackground:nil withObject:nil];
  • [[NSThread alloc] initWithTarget:nil selector:nil object:nil];
  • dispatch_async(dispatch_get_global_queue(0, 0), ^{});
  • [[NSOperationQueue new] addOperation:nil];
    主线程中执行代码的方法
  • [self performSelectorOnMainThread:nil withObject:nil waitUntilDone:YES]
  • dispatch_async(dispatch_get_main_queue(), ^{});
  • [[NSOperationQueue mainQueue] addOperation:nil];
    延迟执行代码
    sleep(2) 睡两秒钟
    NSTimer启动定时器
    39. iOS中有哪些多线程方案?
    常用的有三种: NSThread NSOperationQueue GCD。
    1、NSThread 是这三种范式里面相对轻量级的,但也是使用起来最负责的,
    你需要自己管理thread的生命周期,线程之间的同步。线程共享同一应用程序的部分内存空间,
    它们拥有对数据相同的访问权限。你得协调多个线程对同一数据的访问,
    一般做法是在访问之前加锁,这会导致一定的性能开销。
    2、NSOperationQueue 以面向对象的方式封装了用户需要执行的操作,
    我们只要聚焦于我们需要做的事情,而不必太操心线程的管理,同步等事情,
    因为NSOperation已经为我们封装了这些事情。
    NSOperation 是一个抽象基类,我们必须使用它的子类。
    3、 GCD: iOS4 才开始支持,它提供了一些新的特性,以及运行库来支持多核并行编程,
    它的关注点更高:如何在多个cpu上提升效率。
    总结:
  • NSThread是早期的多线程解决方案,实际上是把C语言的PThread线程管理代码封装成OC代码。
  • GCD是取代NSThread的多线程技术,C语法+block。功能强大。
  • NSOperationQueue是把GCD封装为OC语法,额外比GCD增加了几项新功能。
  • 最大线程并发数
  • 取消队列中的任务
  • 暂停队列中的任务
  • 可以调整队列中的任务执行顺序,通过优先级
  • 线程依赖
  • NSOperationQueue支持KVO。 这就意味着你可以观察任务的状态属性。
    但是NSOperationQueue的执行效率没有GCD高,所以一半情况下,我们使用GCD来完成多线程操作。
    40. 线程与进程的区别和联系?
    1.什么是进程
    进程是指在系统中正在运行的一个应用程序
    每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内
    2.什么是线程
    1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)
    线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行。
    MRC:手动内存释放。遵循谁申请谁释放的原则,需要手动的处理内存计数的增加和修改。从12年开始,逐步被ARC(自动内存释放)模式取代。
    点语法: “self.属性 = obj” 调用属性的setter方法。”self.属性” 调用属性的getter方法区别在于是否有等号。

41.Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。
APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。
上图可以分为三个阶段。
第一阶段:.net应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。
http://blog.csdn.net/zhuqilin0/article/details/6527113 //消息推送机制
看内存泄露时候:在搜索中搜索run 找到Run Static Analyzer .

42.ASIDownloadCache 设置下载缓存
它对Get请求的响应数据进行缓存(被缓存的数据必需是成功的200请求):
[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];
当设置缓存策略后,所有的请求都被自动的缓存起来。
另外,如果仅仅希望某次请求使用缓存操作,也可以这样使用:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadCache:[ASIDownloadCache sharedCache]];
缓存存储方式
你可以设置缓存的数据需要保存多长时间,ASIHTTPRequest提供了两种策略:
a,ASICacheForSessionDurationCacheStoragePolicy,默认策略,基于session的缓存数据存储。当下次运行或[ASIHTTPRequest clearSession]时,缓存将失效。
b,ASICachePermanentlyCacheStoragePolicy,把缓存数据永久保存在本地,
如:
ASIHTTPRequest *request = [ ASIHTTPRequest requestWithURL:url ];
[ request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy ];
43.HTTP协议详解
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中。
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
44.URL
HTTP URL (URL是一种特殊类型的URI是他的子类,包含了用于查找某个资源的足够的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
45.TCP/UDP区别联系
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快
TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,我们来看看这三次对话的简单过程:1.主机A向主机B发出连接请求数据包;2.主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包;3.主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。
tcp协议和udp协议的差别
是否连接面向连接面向非连接
传输可靠性可靠不可靠
应用场合传输大量数据少量数据
速度慢快
46.socket连接和http连接的区别
简单说,你浏览的网页(网址以http://开头)都是http协议传输到你的浏览器的, 而http是基于socket之上的。socket是一套完成tcp,udp协议的接口。
HTTP协议:简单对象访问协议,对应于应用层 ,HTTP协议是基于TCP连接的
tcp协议: 对应于传输层
ip协议: 对应于网络层
TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
http连接:http连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉;
socket连接:socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。所以当一个socket连接中没有数据的传输,那么为了维持连接需要发送心跳消息~~具体心跳消息格式是开发者自己定义的
我们已经知道网络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭),这些函数我们在后面进行介绍。我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。
1)Socket是一个针对TCP和UDP编程的接口,你可以借助它建立TCP连接等等。而TCP和UDP协议属于传输层 。
而http是个应用层的协议,它实际上也建立在TCP协议之上。
(HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。)
2)Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。
47.什么是TCP连接的三次握手
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开)
48.利用Socket建立网络连接的步骤
建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
1。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
2。客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
3。连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

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

推荐阅读更多精彩内容

  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 1,872评论 0 7
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 1,977评论 0 12
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,317评论 0 35
  • 1、OC中创建线程的方法是什么?如果指定在主线程中执行代码?如何延时执行代码。【难度系数★★】 1)创建线程的方法...
    木旁_G阅读 1,872评论 2 16
  • 参考文章: Xcode Project File Format 打开project.pbxproj,基本结构如下 ...
    观星阅读 1,758评论 0 0