1.#import 跟#include、@class有什么区别?#import<> 跟 #import”"又什么区别?
#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,至于这些类是如何定义的,暂时不用考虑。只是告诉编译器请不要报错或警告,因此不会给编译造成影响。当执行时,才去查看类的实现文件,可以解决头文件的相互包含。
#import <> 用来包含系统自带的文件,#import “”用来包含自定义的文件。
A->B,B->A这样相互依赖时,如果在两个文件的头文件中用#import分别声明对方,那么就会出现头文件循环利用的错误,这时在头文件中用@class声明就不会出错。
2.属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?
- readwrite:同时生成get方法和set方法的声明和实现
- readonly:只生成get方法的声明和实现
- assign:set方法的实现是直接赋值,用于基本数据类型
- retain:set方法的实现是release旧值,retain新值,用于OC对象类型
- copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型
- nonatomic:非原子性,set方法的实现不加锁(比atomic性能高)
3.写一个setter方法用于完成@property (nonatomic,retain)NSString *name,写一个setter方法用于完成@property(nonatomic,copy)NSString *name.
- (void)setName:(NSString *)name{
if (_name != name) {
[_name release];
_name = [name retain];
}
}
- (void)setName:(NSString *)name{
if (_name != name) {
[_name release];
_name = [name copy];
}
}
4.对于语句NSString*obj = [[NSData alloc] init]; 编译时和运行时obj分别是什么类型?
编译时是NSString类型,运行时是NSData类型。
5.常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?
常用OC类型:NSString、NSArray、NSDictionary、NSData、NSNumber等。OC对象需要手动管理内存,C的基本数据类型不需要管理内存。
6.id 声明的变量有什么特性?
id声明的变量能指向任何OC对象
7.Objective-C如何对内存管理的,说说你的看法和解决方法?
- 每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器减为0时,就会被销毁
- 通过retain可以让对象的计数器+1、release可以让对象的计数器
- 还可以通过autorelease pool管理内存
- 如果用ARC,编译器会自动生成管理内存的代码
8.内存管理的几条原则时什么?按照默认法则.哪些方法生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?
- 只要调用了alloc、copy、new方法产生了一个新对象,都必须在最后调用一次release或者autorelease
- 只要调用了retain,都必须在最后调用一次release或者autorelease
- @property如果用了copy或者retian,就需要对不再使用的属性做一次release操作
- 如果用了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中创建线程的方法是什么?如果指定在主线程中执行代码?如何延时执行代码?
创建线程的方法
- NSThread
- NSOperationQueue和NSOperation
- GCD
主线程中执行
[self performSelectorOnMainThread: withObject: waitUntilDone:];
[self performSelector: onThread:[NSThread mainThread] withObject: waitUntilDone:];
dispatch_async(dispatch_get_main_queue(), ^{
});
延时执行
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:];
11.Difference between shallow copy and deep copy?
浅拷贝:指针(地址)拷贝,不会产生新对象。深拷贝:内容拷贝,会产生新对象。
12.What is advantage of categories? What is difference between implementing a category and inheritance?
- 分类可以在不修改原来类模型的基础上拓充方法
- 分类只能扩充方法、不能扩充成员变量;继承可以扩充方法和成员变量
- 继承会产生新的类
13.Difference between categories and extensions?
- 分类是有名称的,类扩展没有名称
- 分类只能扩充方法、不能扩充成员变量;类扩展可以扩充方法和成员变量
- 类扩展一般就写在.m文件中,用来扩充私有的方法和成员变量(属性)
14.Difference between protocol in objective c and interfaces in java?
- Java的接口中声明的方法必须都实现
- Oc的protocol中声明的方法并不一定要实现
15.What are KVO and KVC?
- KVC是键值编码,可以通过一个字符串的key(属性名)修改对象的属性值
- KVO是键值监听,可以监听一个对象属性值的改变
16.What is purpose of delegates?
- 两个对象之间传递数据和消息
- 解耦,拆分业务逻辑
17.What are mutable and immutable types in Objective C?
- mutable是可变类型,比如NSMutableArray,可以动态往里面添加元素
- immutable是不可变类型,比如NSArray,固定的存储空间,不能添加元素
18.什么是动态绑定?
动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定 在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。
19.what is difference between NSNotification and protocol?
- 通过NSNotification可以给多个对象传递数据和消息
- 通过protocol(代理模式)只能给一个对象传递数据和消息
20.What is push notification?
- 本地推送:程序内部弹出通知到用户设备
- 远程推送:由推送服务器推送通知到用户设备
21.Difference between shallow copy and deep copy?
浅拷贝:指针(地址)拷贝,不会产生新对象。深拷贝:内容拷贝,会产生新对象。
22.What is advantage of categories? What is difference between implementing a category and inheritance?
- 分类可以在不修改原来类模型的基础上拓充方法
- 分类只能扩充方法、不能扩充成员变量;继承可以扩充方法和成员变量
- 继承会产生新的类
23.Difference between categories and extensions?
- 分类是有名称的,类扩展没有名称
- 分类只能扩充方法、不能扩充成员变量;类扩展可以扩充方法和成员变量
- 类扩展一般就写在.m文件中,用来扩充私有的方法和成员变量(属性)
24.Difference between protocol in objective c and interfaces in java?
- Java的接口中声明的方法必须都实现
- Oc的protocol中声明的方法并不一定要实现
25.What are KVO and KVC?
- KVC是键值编码,可以通过一个字符串的key(属性名)修改对象的属性值
- KVO是键值监听,可以监听一个对象属性值的改变
26.What is purpose of delegates?
- 两个对象之间传递数据和消息
- 解耦,拆分业务逻辑
27.What are mutable and immutable types in Objective C?
- mutable是可变类型,比如NSMutableArray,可以动态往里面添加元素
- immutable是不可变类型,比如NSArray,固定的存储空间,不能添加元素
28.When we call objective c is runtime language what does it mean?
- 动态绑定:对象类型在运行时才真正确定
- 多态性
- 消息机制
29.what is difference between NSNotification and protocol?
- 通过NSNotification可以给多个对象传递数据和消息
- 通过protocol(代理模式)只能给一个对象传递数据和消息
30.What is push notification?
- 本地推送:程序内部弹出通知到用户设备
- 远程推送:由推送服务器推送通知到用户设备
31.What is Polymorphism?
多态:父类指针指向子类对象
32.What is Singleton?
单例:保证程序运行过程中,永远只有一个对象实例目的是:全局共享一份资源、节省不必要的内存开销
33.What is responder chain?
响应者链:UIResponder有一个nextResponder属性,通过该属性可以组成一个响应者链,事件或消息在其路径上进行传递。如果UIResponder没有处理传给它的事件,会将未处理的消息转发给自己的nextResponder。
34.Difference between frame and bounds?
- frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
- bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
35.Difference between method and selector?
通过一个selector可以找到方法地址,进而调用一个方法
36.Is there any garbage collection mechanism in Objective C.?
- OC 1.0没有垃圾回收
- OC 2.0有垃圾回收,只能用在Mac上
- iOS中有ARC机制,是编译器特性,垃圾回收是运行时特性
37.What is NSOperation queue?
- 用来存放NSOperation对象的队列,可以用来异步执行一些操作
- 一般可以用在网络请求等耗时操作
38.What is lazy loading?
延迟加载:比如控制器的view,在第一次用到view时才会调用loadView方法进行创建
39.Can we use two tableview controllers on one viewcontroller?
从技术角度上分析,一个控制器内部添加2个表格控制器是没有问题的
40.Can we use one tableview with two different datasources? How you will achieve this?
从对象属性上分析,tableView只有一个dataSource属性。当然,真要使用2个不同的数据源,还是有其他办法解决的。
41.When to use NSMutableArray and when to use NSArray?
- 当数组元素需要动态地添加或者删除时,用NSMutableArray
- 当数组元素固定不变时,用NSArray
42.Give us example of what are delegate methods and what are data source methods of uitableview.
- 代理方法:返回tableView每行的高度、监听tableView每行的选中
- 数据源方法:返回tableView数据的组数和行数、每行显示什么数
43.How many autoreleasepool you can create in your application? Is there any limit?
没有限制
44.If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us?
系统会默认会不定时地创建和销毁自动释放池
45.When you will create an autorelease pool in your application?
当不需要精确地控制对象的释放时间时,可以手动创建自动释放池
46.When retain count increase?
当做一次retain或者copy操作,都有可能增加计数器
47.What are commonly used NSObject class methods?
NSObject常见的类方法有:alloc、new、description等
48.What is convenience constructor?
像NSStirng的stringWithFormat,NSNumber的numberWithInt
49.How to design universal application in Xcode?
1).创建项目时,Device选择Universal
2).可以创建一套痛用的数据模型
3).根据iPhone\iPad选择不同的控制器(iPad可能用UISplitViewController)
4).根据iPhone\iPad选择不同的界面
50.What is keyword atomic in Objective C?
- atomic是原子性
- atomic会对set方法的实现进行加锁
51.What are UIView animations?
UIView封装的核心动画可以通过类方法\block实现
52.How can you store data in iPhone applications
- 属性列表
- Preference(NSUserDefaults)
- 归档(NSKeyedArchiver、NSCoding)
- SQLite数据库
- Core Data
53.What is NSManagedObject model?
NSManagedObject是Core Data中的实体对象
54.What is predicate?
谓词:可以以一定条件来过滤数组、字典等集合数据,也能用在Core Data的数据查询中
55.Object-C有多继承吗?没有的话用什么代替?
- OC是单继承,没有多继承
- 有时可以用分类和协议来代替多继承
56.Object-C有私有方法吗?私有变量呢?
- OC没有类似@private的修饰词来修饰方法,只要写在.h文件中,就是公共方法
- 可以使用类扩展(Extension)来增加私有方法和私有变量
57.关键字const什么含义?
const int a;
int const a;
const int *a;
int const *a;
int * const a;
int const * const a;
- 前两个的作用是一样:a 是一个常整型数
- 第三、四个意味着 a 是一个指向常整型数的指针(整型数是不可修改的,但指针可以)
- 第五个的意思:a 是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的)
- 最后一个意味着:a 是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的)
58.static的作用?
- static修饰的函数是一个内部函数,只能在本文件中调用,其他文件不能调用
- static修饰的全部变量是一个内部变量,只能在本文件中使用,其他文件不能使用
- static修饰的局部变量只会初始化一次,并且在程序退出时才会回收内存
59.线程和进程的区别?
- 一个应用程序对应一个进程,一个进程帮助程序占据一块存储空间
- 要想在进程中执行任务,就必须开启线程,一条线程就代表一个任务
- 一个进程中允许开启多条线程,也就是同时执行多个任务
60.堆和栈区别
- 管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生 memory leak。
- 申请大小:能从栈获得的空间较小,堆是向高地址扩展的数据结构,是不连续的内存区域。堆的大小受限于计算机系统中 有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
- 碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。 对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块 从栈中间弹出
- 分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成 的,比如局部变量的分配。动态分配由 alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器 进行释放,无需我们手工实现。
- 分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈 都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
61.为什么很多内置的类,如TableView的delegate的属性是assign不是retain?
- tableView的代理一般都是它所属的控制器,控制器会对它内部的view做一次retain操作
- 假设tableView也对代理(控制器)做一次retain操作,那么就出现循环retain问题
62.定义属性时,什么情况使用copy、assign、retain?
- copy:NSString、Block等类型2
- assign:非OC对象类型, 基本数据类型(两个对象相互引用的时候,一端用retain, 一端用assign)
- retain:OC对象类型
63.对象是什么时候被释放的?
每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器减为0时,就会被销毁
64.tableView的重用机制?
为了减少对象创建,把离开屏幕的不可见行保存起来,当新的可见行出现的时候,不去创建新的对象,而是用刚保存的对象去代替它,然后把他的内容修改成新的行的内容。
65.ViewController 的loadView、viewDidLoad、viewDidUnload分别是什么时候调用的,在自定义ViewCointroller时在这几个函数中应该做什么工作?
1).loadView 当第一次使用控制器的view时,会调用loadView方法创建view,一般在这里自定义view
2).viewDidLoad 当控制器的view创建完毕时会调用,也就是在loadView后调用,一般在这里添加子控件、初始化数据
3).viewDidUnload 当控制器的view因为内存警告被销毁时调用,一般在这里回收跟界面相关的资源(界面都会销毁了,跟界面相关的资源肯定不要了)
66.ViewController的didReceiveMemoryWarning是在什么时候调用的?默认的操作是什么?
当应用程序接收到系统的内容警告时,就有可能调用控制器的didRece…Warning方法。它的默认做法是:当控制器的view不在窗口上显示时,就会直接销毁,并且调用viewDidUnload方法
67.怎么理解MVC,在Cocoa中MVC是怎么实现的?
- M:Model,模型,封装数据
- V:View,视图界面,负责展示数据
- C:Controller,控制器,负责提供数据(Model)给界面(View)
68.self.跟self->什么区别?
- self.是调用get方法或者set放
- self是当前本身,是一个指向当前对象的指针
- self->是直接访问成员变量
69.id、nil代表什么?
- id类型的指针可以指向任何OC对象
- nil代表空值(空指针的值, 0)
70.如何对iOS设备进行性能测试?
Timer Profile
71.OC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release?为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?
与alloc语义相反的方法是dealloc,与retain语义相反的方法是release。alloc是为对象在内存中开辟空间,而dealloc则是对象销毁时释放空间。retain方法是对象开辟空间以后使对象的引用计数器加1,而release是对象的引用计数器减1。需要与alloc配对的方法是release,因为对象创建以后,对象的引用计数器自动加1,而调用release方法后,对象的引用计数器归0,系统会自动调用dealloc方法释放空间。
72.在一个对象的方法里面: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"’字符串对象所在的地址,
没有调用方法。
73.这段代码有什么问题?
- (void)setAge:(int)newAge{
self.age = newAge;
}
在age属性的setter方法中,不能通过点语法给该属性赋值。会造成setter方法的循环调用。因为self.age = newAge;本质上是在调用 [self setAge:newAge]; 方法。解决循环调用的方法是方法体修改为 _age = newAge;另外变量名称不能使用new开头!
74.以下代码有什么问题
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”;" 这行代码放在循环语句外面。
75.简要叙述面向对象的特点,特别是多态
- 封装
封装是对象和类概念的主要特性。它是隐藏内部实现,提供外部接口,可以看作是“包装”。
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。好处:可以隐藏内部实现细节。通过大量功能类封装,加快后期开发速度。
- 继承
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。在考虑使用继承时,有一点需要注意,
那就是两个类之间的关系应该是“属于”关系。例如,Employee(雇员)是一个人,Manager(领导)也是一个人,因此这两个类都可以继承Person类。但是 Leg(腿) 类却不能继承 Person 类,因为腿并不是一个人。
- 多态
多态性(polymorphism)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的 方法-eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。实现多态,有两种方式,覆盖,重载。覆盖(override),是指子类重新定义父类的虚函数的做法。重载(overload),是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
备注:OC没有重载,因为OC只认函数名,不认参数类型。OC不允许存在多个同名函数。
总结:封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。
而多态则是为了实现另一个目的——接口重用!
多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。
在类层次中,子类继承了多个父类的数据结构和方法,则称为多重继承。
76.objective-c 所有对象间的交互是如何实现的?
在对象间交互中每个对象承担的角色不同,但总的来说无非就是”数据的发送者”或”数据的接收者”两种角色。
消息的正向传递比较简单,直接拿到接受者的指针即可。消息的反向传递可以通过委托模式,观察者模式(本质是单例模式),block语法,AppDelegagte来实现。其中委托模式,block语法都是1对1的消息传递。 观察者模式是1对多。AppDelegate比较特殊,这是一个生命周期与进程一致的对象。
77.什么叫数据结构?
数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合。
通常,精心选择的数据结构可以带来更高的运行或者存储效率。
78.instancetype和id的区别
instancetype和id的区别在于, id可以声明对象 也可以作为返回值,instancetype只能作为返回值。
79.OC如何对内存管理的,说说你的看法和解决方法。
Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。
- 自动内存计数ARC:由Xcode自动在App编译阶段,在代码中添加内存管理代码。
- 手动内存计数MRC:遵循内存谁申请,谁添加。谁释放的原则。
- 内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain)池子中所有的内存空间也被自动释放掉。 内存池的释放操作分为自动和手动。自动释放受runloop机制影响。
80.你对@interface中的成员变量和@property声明的属性的理解。
@interface Person : NSObject
{
NSString *_name; //成员变量
}
@property NSString *sex; //属性
@end
属性拥有setter和getter方法 外加_sex成员变量。_name只是成员变量, 没有setter和getter方法。
81.浅拷贝和深拷贝的区别?
浅拷贝:只复制指向对象的指针,而不复制引用对象本身。
深拷贝:复制引用和对象本身。
意思就是说我有个A对象,复制一份后得到A_copy对象后, 对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针, 对象本身资源还是只有一份。 那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改, 这其实违背了我们复制拷贝的一个思想。 深复制就好理解了,内存中存在了两份独立对象本身。 用通俗的话将就是: 浅拷贝好比你和你的影子,你完蛋,你的影子也完蛋。深拷贝好比你和你的克隆人,你完蛋,你的克隆人还活着。
82.什么时候用delegate,什么时候用Notification?
- Delegate(委托模式):1对1的反向消息通知功能。
- Notification(通知模式):只想要把消息发送出去,告知某些状态的变化。但是并不关心谁想要知道这个。
83.设计模式是什么?你知道哪些设计模式,并简要叙述。
- 单例模式:通过static关键词,声明全局变量。在整个进程运行期间只会被赋值一次。
- 观察者模式:KVO是典型的通知模式,观察某个属性的状态,状态发生变化时通知观察者。
- 委托模式:代理+协议的组合。实现1对1的反相传值操作。
- 工厂模式:通过一个类方法,批量的根据已有模板生产对象。
- MVC模式:Model View Control, 把模型 视图 控制器 层进行解耦合编写。
- MVVM模式:Model View ViewModel 把 模型 视图 业务逻辑 层进行解耦合编写。
- delegate和Block的区别?
delegate:
- 需要定义协议方法并且实现协议方法,会使代码结构变复杂
- 效率没有block高
block:
- 代码结构更加紧凑,不需要额外定义方法。
- 需要注意防止循环引用,使用__weak 关键词修饰。
- 当需要在块中修改外部变量时,需要对外部变量使用__block 关键词修饰。
85.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上消失
86.如何将产品进行多语言发布,开发?
国际化操作,在Xcode中,Project里,找到Localization,点击+号,添加想要支持的语言。通过新建Strings文件,把文件进行国际化处理。 通过键值对的形式,同一个key在不同的国际化。文件中,对应不同的值。通过 NSLocalizedStringFromTable 等方法,通过key来自动根据iOS设备的当前语言,显示不同的字符串。
87.OC中是如何实现线程同步的?
@synchronized: 添加同步锁
NSLock:加锁
NSCondition:加条件锁
dispatch_async(dispatch_get_main_queue(), ^{}); :异步主线程
NSOperationQueue:添加线程依赖
NSOperationQueue:设置最大并发数为1
88.UDP和TCP的区别是什么?
- 基于连接与无连接;
- 对系统资源的要求(TCP较多,UDP少);
- UDP程序结构较简单;
- 流模式与数据报模式 ;
- TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证
89.TCP/IP建立连接的过程?
在TCP/IP 协议中,TCP协议提供可靠的连接服务,采用三次握手建立连接;第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手。 (所谓的三次握手,就是要有三次连接信息的发送、接收过程。TCP连的建立需要进行三次连接信息的发送、接收。)
90.介绍版本控制中Git与SVN。
- Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。主要区别于SVN工具的功能是 分支功能比SVN强大。 (常用)
- SVN是Subversion的简称,是一个开放源代码的版本控制系统,它采用了分支管理系统,它的设计目标就是取代CVS。
91.线程与进程的区别和联系?
- 什么是进程
进程是指在系统中正在运行的一个应用程序。每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内
- 什么是线程
1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)。线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行
92.不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?(比如在一个vc的viewDidLoad中创建)
分两种情况:手动干预释放时机、系统自动去释放。手动干预释放时机--指定autoreleasepool 就是所谓的:当前作用域大括号结束时释放。系统自动去释放--不手动指定autoreleasepool。Autorelease对象会在当前的 runloop 迭代结束时释放。如果在一个vc的viewDidLoad中创建一个 Autorelease对象,那么该对象会在 viewDidAppear 方法执行前就被销毁了。
93.以下代码运行结果如何?
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
}
发生主线程锁死。程序出现假死状态。
94.若一个类有实例变量 NSString *_foo ,调用setValue:forKey:时,可以以foo还是 _foo 作为key?
都可以。
95.什么情况使用 weak 关键字,相比 assign 有什么不同?
- 什么情况使用 weak 关键字?
1)在ARC中,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决,比如:delegate代理属性
2)自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用weak,自定义IBOutlet控件属性一般也使用weak;当然,也可以使用strong。
- 不同点:
1)weak 此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似, 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。 而 assign 的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。
2)assign 可以用非OC对象,而weak必须用于OC对象
96.怎么用 copy 关键字?
- 用@property声明 NSString、NSArray、NSDictionary 经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。不过通常为了节省系统资源,选择使用strong代替copy
- block也经常使用copy关键字, 不过使用strong也无伤大雅。
97.@protocol 和 category 中如何使用 @property
- 在protocol中使用property只会生成setter和getter方法声明,我们使用属性的目的,是希望遵守我协议的对象能实现该属性。
- category 使用 @property 也是只会生成setter和getter方法的声明。如果我们真的需要给category增加属性的实现,需要借助于运行时的两个runtime函数:objc_setAssociatedObject和objc_getAssociatedObject
98.@synthesize和@dynamic分别有什么作用?
- @property有两个对应的词,一个是@synthesize,一个是@dynamic。如果@synthesize和@dynamic都没写,那么默认的就是@synthesize var = _var;
- @synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。
- @dynamic告诉编译器:属性的setter与getter方法由用户自己实现,不自动生成。(当然对于readonly的属性只需提供getter即可)。假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var = someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。
99.ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?
- 对应基本数据类型默认关键字是:atomic,readwrite,assign
- 对于普通的OC对象:atomic,readwrite,strong
100.GET和POST方法区别和选择
主要区别表现在数据传递上:
GET:
- 请求URL后面以?的形式更上传递给服务器的参数,当有多个参数时用&隔开,比如:http://ww.test.com/login?username=123&pwd=234&type=JSON参数是什么就传什么,不要随意添加等号.
- 由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的.通常不超过1KB. 当然这种请求也是不安全的. 因为参数都暴露在外边,对用户来说是及其不安全的.
POST:
- 发送给服务器的参数全部放在了请求体Body中
- POST传递的数据量是没有限制的(具体看服务器的处理能力)
GET和POST的选择:
- 如果传递大量数据,比如文件上传,只能POST请求
- GET的安全性比POST差,包含机密信息的,建议是有POST
- 如果仅仅是索取数据(数据查询),建议使用GET
- 如果是其他操作建议使用 POST