自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 delegate;
@property (nonatomic, assign) id delegate;

答案:应使用weak,如果用assign修饰,在本类销毁后,delegate将成为野指针,再访问它程序会崩溃

3,int 与 NSInteger 有什么区别?

答案:在32位系统中,NSInteger是32位整型,在64位系统中,NSInteger是64位整型
补充:NSInteger会根据系统的位数判定(32 or 64)自动选择int的最大数值(int or long)


4,ARC环境下,申明属性能否使用 retain 修饰?

答案:可以

5,申明属性时使用copy与strong有何区别,以NSString为例,分别说明其不同?

答案:使用copy时会拷贝对象具体的值,使用strong则拷贝的是指针,指向了同一块内存地址,对象的值改变时,会跟着改变

6,UIView及子类在那几种情况下无法接收事件:

答案:

hidden = YES
userInteractionEnabled = NO(不接收用户交互)
alpha <= 0.01
enabled = NO
7,#与##的作用?

答案:#是把宏参数转化为字符串的运算符,##是把两个宏参数连接的运算符。

8,说明以下const关键字的作用:
  1. const int a = 5;

    答案:a的值一直为5,不能被改变

  2. const int b; b = 10;

    答案:b的值被赋值为10后,不能被改变

  3. const int *ptr;

    答案: ptr为指向整型常量的指针,ptr的值可以修改,但不能修改其所指向的值

  4. int *const ptr;

    答案:ptr为指向整型的常量指针,ptr的值不能修改,但可以修改其所指向的值

  5. 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 
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来声明变量

你可能感兴趣的:(自iOS面试题)