亲测门户网站iOS面试题整理(不全,有些记不住了)

本文涵盖算法题目解析,如阶乘求和、斐波那契数列及数对查找优化;同时深入Objective-C特性,包括类别与扩展的使用技巧、委托与协议详解、运行时操作及多线程实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、算法类

1、1!+3!+5!+······+(2N-1)!的和,N>5。

       方法a: 两层的for循环(面试官说不对,但是我觉得可以实现)

   long fun(int n){
	long sum = 0;
	for(int i = 1;i < N;i = i + 2){
		long pro = 1;
		for(int j = 1; j < i + 1; j++){
			pro = pro * j;
		}
		sum = sum + pro;
	}
	return sum;
   }//没有编译,不知道对不对啊!

    方法b:网上搜了一下,可以用递归,但是貌似递归的效率并没有for循环高

  long fuction1(int n){
	if(n == 1){
		return 1;
	}else{
		return n*fuction1(n-1);
	}
  }
  long fun(int n){
	long sum = 0;
	for(int i = 1;i < N;i = i + 2){
		sum = sum + fuction1(i);
	}
	return sum;
  }<span style="font-family: Arial, Helvetica, sans-serif;">//没有编译,不知道对不对啊! 只提供思路</span>
2、比较简单,就是斐波那契数列,网上有的是。
int fib(int n)
{ if((n==1)||(n==2))
return 1;
return fib(n-1)+fib(n-2);
}
3、这个面试题没有,在面聊的时候问的,如下

      有一列没有顺序的数列,存在一个数K,在该数列中找到数X,数Y,有等式K=X+Y成立,怎么找到这两个数最快。

     首先将数列排序,然后另数列的第一个数(比如是最小的)为X,最后一个数(最大的)为Y,计算X+Y,

     if(X+Y > K)

          将最后第二个数赋值给Y

     else if(X+Y < K)

         将第二个数赋值给X

     else

          输出X,Y

二、Objective-C语法类

1、类别与扩展

    类别Category)在iOS开发中使用非常频繁,尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性。

   类别主要有3个作用:

       (1)将类的实现分散到多个不同文件或多个不同框架中。
       (2)创建对私有方法的前向引用。
       (3)向对象添加非正式协议

@interface NSObject (CategoryName)
- (void)myMethod;
@end
<pre name="code" class="objc">@implemenation NSObject(CategoryName)
   -(void)myMethod{
         NSLog(@"this is Category");
}
@end

 

      这是一个最简单的Category,作用于NSObject类,给NSObject添加了一个myMethod方法。

     使用Category需要注意的点:

     (1) Category的方法不一定非要在@implementation中实现,也可以在其他位置实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序则会崩溃。

     (2) Category理论上不能添加变量,但是可以使用@ dynamic   来弥补这种不足。 (即运行时 Runtime )

     (3)类别的方法中,不可以调用super方法

     (4)category 方法可能会覆盖于同一个类class 的其它 category 中的方法。但也可能被覆盖,因为不法预知他们的加载优先顺序,出现这种情况通常会在编译时出错。如果在一个开发的SDK中使用了类别, 就最好保证类别名不同于使用者的类别名, 以及类别方法也不同于使用者的类别方法名, 通常通过加前缀来做到。

  (该部分转自:传送门  多谢原作者的分享)

    类别的局限性:

   (1)无法添加新的实例变量(刚才有说,理论上不行)

     (2)名称冲突,如果类别和现有的方法重名,类别具有更高的优先级,解决办法,类别方法名中添加一个前缀

    (更加详细的文章点击传送门

    扩展:某些情况下,我们需要声明一个@property,它对外是只读的(readonly),而对内是可读写的(readwrite),这时,可以通过Extensions实现

// .h
@interface BaseClass : NSObject
@property (readonly) NSString *privateString;	// 该.h文件对外公开
@end

// .m
@interface BaseClass()			// 该.m文件对外是不公开的, 当然这里也可以放在专门的一个.h文件中,但同样不把这个文件进行公开。
@property (readwrite) NSString *privateString;
@end

@implementation BaseClass
@synthesize privateString;
//...
@end
  扩展还可以添加新的实例变量
@interface MyClass : NSObject
- (float)value;
@end
 
 
@interface MyClass () { //注意此处:扩展
    float value;
}
- (void)setValue:(float)newValue;
@end
 
@implementation MyClass
 
- (float)value {
    return value;
}
 
- (void)setValue:(float)newValue {
    value = newValue;
}
 
@end
2、委托、非正式协议、正式协议

     这篇文章写的很详细了,传送门

3、对id的理解

typedef struct objc_object {  
Class isa;
} *id; 

  作用:

用于描述delegate的类型,比如对于tableView来说其只知道自己的delegate是继承自UITableViewController的对象,但并不关心delegate具体的类型,只需要知道delegate是不是实现了那几个协议required方法就行了,这时候无法也没必要让tableView知道delegate的具体类型。

容器类的遍历,对于Array来说似乎也不用关心自己包含哪些类型的对象,因此枚举迭代只需要知道有对象就可以了,至于枚举这些对象用来干什么那是程序员自己的事情,比如:

  • [array enumeratorObjectsUsingBlock:  
    ^(id obj, NSUInteger index, BOOL  *stop){  
         // do sth
        *stop = YES;  
    }];  
    就相当于C++中的void*
4、iOS运行时获取对象的成员变量的类型和成员方法
比较简单 进 传送门
5、定义宏比较两个数的大小
#define MAX(a,b) (((a)>(b)?(a):(b)
或 #define MAX(a,b) (((((a)-(b))>>31)&0x1)?(a):(b))

6、关于copy、mutableCopy的一些问题
      核心记住:
      对于系统的非容器类对象,如果对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝)。如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。
      对于容器类本身,上面讨论的结论也是适用的,需要探讨的是复制后容器内对象的变化。
      (转自博文 传送门,感谢博主分享)
7、多线的方式有哪几种?
     NSThread
     NSOperation
     GCD(全称:Grand Central Dispatch)














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值