这是之前自己整理在CSDN上的部分面试题,现抄录至。。。。。。
1、0x0110 有几个 BYTE?有几个Bit?转换成10进制是多少?并写出二进制形式。
答:2个BYTE(字节),16Bit(位),转换成10进制:272,二进制: 0000 0001 0001 0000
2、填空 (0x12 & 0x34) = ( 1 ),(0x12 && 0x34) = ( 2 )
答:(1)0x10 ; (2) 1 ;
3、int x = 0x12345678; char *p = (char ) &x; 请问 p 指的是什么?(p)的值是多少?为什么?
答:
(1) p 存储 x 第一个字节的地址;
(2) *p 大端模式:0x12 小端模式:0x78
小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。
大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址
4、delegate 使用 assign or retain ? 简述理由
答:assign,防止出现循环引用;
5、NSString 与 NSData 之间的转换过程中要特别注意的事项是什么?
答:注意编码格式,如下采用 NSUTF8 转换:
NSData *testData = [@"myTest" dataUsingEncoding:NSUTF8StringEncoding];
NSString *testStr = [[NSString alloc]initWithData:testData encoding:NSUTF8StringEncoding];
6、请用代码如何判断某个对象 obj 是否支持某个 method ?
答:(1)判断实例方法:if ( [obj respondsToSelector:@selector(method)] )
(2)判断类方法:if ( [Class instanceRespondToSelector:@selector(method)] )
7、请用简单的代码展示 @protocol 的定义及实现。
答:
(1)定义:
@protocol TestClassDelegate
- (void)testMethod:(NSString *)string;
@end
@interface TestClass : NSObject
@property (nonatomic, assign) id delegate;
@end
2)实现
在定义 TestClass 的类中,设置代理对象:
TestClass *testClass = [[TestClass alloc]init]; testClass.delegate = self;
//实现协议方法
- (void)testMethod:(NSString *)string {
NSLog(@"%@", string);
8、category 的用途?
答:类目,为已知的类增加新的方法;
9、请使用 GCD 完成如下任务:执行并发任务 task1,task1完成后 update UI。 dispatch_async( //添加代码 );
答:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//task1:
NSLog(@"执行task1");
//更新UI
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"更新UI");
});
});
10、为什么要在主线程更新 UI ?子线程中想要更新 UI 怎么做?
答:(1)在子线程中不能更新UI,除了极少数UI外,其他UI更新要等到子线程执行完毕后回到主线程中进行更新。如果子线程一直在运行,则子线程中UI更新的函数栈主线程无法得知,即UI无法更新;
(2)回到主线程中进行UI更新;
11、简述通过 storyboard 实现一个 tableview (自定义 cell )的关键步骤。
答:
12、如何生成同时支持多个架构(simulator,arm7,arm64)的通用静态库。
答: ValidArchitectures设置为:armv7|armv7s|arm64|i386|x86_64 ;
Architectures设置不变(或根据你需要): armv7|arm64 ;
然后分别选择iOS设备和模拟器进行编译,最后找到相关的.a进行合包,使用lipo -create 真机库.a的路径 模拟器库.a的的路径 -output 合成库的名字.a ;
这样就制作了一个通用的静态库.a ;
13、请写出一个 xml 文件,用于描述一个书架,书架上有两本书,书本类别(category)分别是 cooking,children。要求 tag 中包含书名(title),作者(author)。类别(category)要用属性表示。
答:
书名1<\title>
作者1<\author>
<\book>
书名2<\title>
作者2<\author>
<\book>
14、链表与数组的区别。
答:
数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。
链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了。
*C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前有时无法准确确定数组的大小,只能将数组定义成足够大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。
(1) 从逻辑结构角度来看
a, 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
b,链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)
(2)从内存存储角度来看
a,(静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。
b, 链表从堆中分配空间, 自由度大但申请管理比较麻烦.
15、什么是gcc?有没有用过
答:GCC(GNU Compiler Collection)是由 GNU 开发的编程语言编译器。详细介绍链接:http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html
16、用C++写单例关键点
答:关键点:(1)设置私有构造函数保证其不会被随意创建;
(2)创建局部静态变量保证实例只有一个;
详细介绍链接:http://www.cnblogs.com/loveis715/archive/2012/07/18/2598409.html