自iOS面试题
自出的iOS面试题
因公司需要,出以下几道简单的面试题:
1,如下for循环中,是否有可优化之处,如有请说明原因:
@autoreleasepool {
for (int i = 0; i < 10000; i++) {
NSString* name = [NSString stringWithFormat:@"xiaoming"];
NSString* add = [NSString stringWithFormat:@"sz"];
NSString* ID = [NSString stringWithFormat:@"%@-%d",add,i];
NSString* otherInfo = @"...";
NSMutableDictionary *infoDict = [[NSMutableDictionary new];
[infoDict setValue:name forKey:@"name"];
[infoDict setValue:ID forKey:@"ID"];
NSLog(@"%@",infoDict);
}
}
答案:@autoreleasepool应该放在for循环里面,在每次循环产生临时对象进行释放
2,申明代理指针时,使用weak与assign修饰有何不同,那个正确,都会造成什么样的后果?
e.g.
@property (nonatomic, weak ) id<BKInteractiveViewDelegate> delegate;
@property (nonatomic, assign) id<BKInteractiveViewDelegate> delegate;
答案:应使用weak,如果用assign修饰,在本类销毁后,delegate将成为野指针,再访问它程序会崩溃
3,int 与 NSInteger 有什么区别?
答案:在32位系统中,NSInteger是32位整型,在64位系统中,NSInteger是64位整型
补充:NSInteger会根据系统的位数判定(32 or 64)自动选择int的最大数值(int or long)
</br>
4,ARC环境下,申明属性能否使用 retain 修饰?
答案:可以
5,申明属性时使用copy与strong有何区别,以NSString为例,分别说明其不同?
答案:使用copy时会拷贝对象具体的值,使用strong则拷贝的是指针,指向了同一块内存地址,对象的值改变时,会跟着改变
6,UIView及子类在那几种情况下无法接收事件:
答案:
hidden = YES
userInteractionEnabled = NO(不接收用户交互)
alpha <= 0.01
enabled = NO
7,#与##的作用?
答案:#是把宏参数转化为字符串的运算符,##是把两个宏参数连接的运算符。
8,说明以下const关键字的作用:
- const int a = 5;
答案:a的值一直为5,不能被改变
- const int b; b = 10;
答案:b的值被赋值为10后,不能被改变
- const int *ptr;
答案: ptr为指向整型常量的指针,ptr的值可以修改,但不能修改其所指向的值
- int *const ptr;
答案:ptr为指向整型的常量指针,ptr的值不能修改,但可以修改其所指向的值
- const int *const ptr;
答案:ptr为指向整型常量的常量指针,ptr及其指向的值都不能修改
9,解释self
答案:self就是实例本身,在类里用self来调用自身的方法 self表示当前类
10,说说你在开发中最常使用的第三方库(5个以上,挑其中一个简单的阐述其实现原理)?
答案:无具体答案,可在面试时对面试者进行提问
11,下面函数是否正确,如有错误,请指出并说明错误之处:
- (void)setTitles:(NSArray *)titles prices:(NSArray *)prices {
for (NSInteger i = 0; i < 1; i++) {
NSString *title = titles[i];
NSString *price = prices[i];
NSLog(@"%@--%@",title, price);
}
}
答案:传递进来的两数组元素个数是未知的,但在for循环使用时未对其进行判定,可能导致数组越界,崩溃
11,下面函数中autoreleasepool什么时候会调用
- (void)updateInfo {
for (NSInteger i = 0; i < 10000; i++) {
@autoreleasepool {
NSString *title = @"宝石";
NSString *price = @"5$";
NSLog(@"%@--%@",title, price);
}
}
}
答案:每循环完一次的时候会被调用一次
13,问:下面代码在c语言的函数里与oc函数里分别会会输出什么?
#include<stdio.h>
void test () {
int a = 10, b = 20, c = 30;
printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2));
}
答案:c:110..40..60 oc: 60..40..60
这是因为C语言里函数的参数默认是从右往左处理的,输出时是从左往右。
14,指正下面函数,并说明、修正错误:
void swap(int* p1,int* p2)
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
答案:在swap函数中,p是个野指针,可能指向系统区,导致程序运行的崩溃。故而,程序应改为:
void swap(int* p1,int* p2) { int p; p = *p1; *p1 = *p2; *p2 = p; }
15,Swift 1.0及其之后,有什么更简便的方法来写下面的for循环?
for var i = 0; i < 5; i++ {
print("Hello!")
}
答案:
for _ in 0...4 { print("Hello!") }
16,Swift中如何定义变量和常量?
答案:使用let来声明常量,使用var来声明变量