IOS面试题---005

1、        应用程序如何省电?

                        设备一定的时间内没有检测到触摸事件,系统最初会使屏幕变暗,并最终完全关闭屏幕。大多数开发者都应该让这个定时器打开,但是,游戏和不使用触摸输入的应用程序开发者可以禁用这个定时器,使屏幕在应用程序运行时不会变暗。将共享的UIApplication对象的idleTimerDisabled属性设置为YES,就可以禁用自动休眠定时器。

                       比较费电,定位,网络连接,信号的搜索. 1:及时关闭定位.2不要频繁的请求网络,作本地存储.让用户主动的更新数据(上下拉刷新).3:提升程序的算法,优化代码,提高代码的质量.4:蓝牙,需要才连接,用完及时断开.5:界面的渲染,(游戏中)尽量提升效率,减少渲染次数.

           

2、        写一个递归方法:计算N的阶乘,然后将计算结果进行存储。以便应用退出后下次启动课直接获取该值。

      int prime(int n){

                        if(n>1)

                        return n*prime(n-1); //返回值最好是long或者是lld

                        else

                        return 1;

                        }

3、        NSArray和NSMutableArray的区别,多线程操作哪个更安全?

                        NSArray创建之后会在堆中建立一块区域A,然后指针MoMo指向这块区域A,但是这块区域的大小是已经确定不能更改的了。但是我们还是能够看到有setobject的方法,可以向里面添加改变值。这是因为会在堆中在新建一个内存区域B,把原来堆内存A中的数据复制到这个堆区域B中,然后在这个新的区域B里面添加你setobject进去的值,并把栈中的指针对象MoMo指向B。这样就是说原来A的对内存值没有发生变化,但是你的指针MoMo在指向新的内存区域B之后指针对应的值已经变化了。因为B中有A的复制内容,还有最后你新添加进去(setobject)的值。

 

源数组是否发生了变化.NSArray更安全.不涉及到数组变化.只是读取.

 

 

4、        当前有一个数组,里面有若干重复的数据,如何去除重复的数据?(会几个写几个)

                        使用set集合 initWithArray:(NSArray *)arr;

或者使用for循环遍历----双循环,发现相同的数据就移除.

把数组放到可变字典之中,元素作为key,有重复,就会覆盖,最后比较两者的                  count

                       

5、        isKindOfClass、isMemberOfClass作用分别是什么?

            isKindOfClassisMemberOfClass之间的区别是:

我们可以使用isKindOfClass来确定一个对象是否是一个类的实例,或者是该类父类的实例。//BOOL,继承链上都会返回YES
isMemberOfClass
只能用来判断前者,不能用来判断后者。

 

 

6、        写出下面程序段的输出结果

NSDictionary*dict = [NSDictionary dictionaryWithObject:@"a string value"forKey:@"akey"];

NSLog(@"%@",[dict objectForKey:@"akey"]);

[dictrelease];//不应该释放---便利构造器---

 

结果是a string value

 

 

7、        请写出以下代码的执行结果

NSString  * name = [ [ NSString alloc] init ];

name = @Habb;

[name  release];//常量区,不应该release

内存泄露问题.----重指向,之前开辟的内存空间无法释放,内存泄露.

 

 

8、        请分别写出SEL、id的意思?

                        SEL选择器.------id对象类型

 

 

9、        iPhone上,不能被应用程序直接调用的系统程序是什么?

                        //配置PList文件可以调用Setting;

                        //EventKit事件添加;可以调用

                        //        计算器 股市 备忘录 天气 提醒事项 等关于隐私的程序         

                       

 

10、     以.mm为拓展名的文件里,可以包含的代码有哪些?c和obj-c如何混用

                        1)obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj-c的代码,因为cpp只是cpp 
2) 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题 
3)在cpp中混用obj-c其实就是使用obj-c编写的模块是我们想要的。 
如果模块以类实现,那么要按照cpp class的标准写类的定义,头文件中不能出现obj-c的东西,包括#import cocoa的。实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。 
如果模块以函数实现,那么头文件要按c的格式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m。 

总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。obj-c的编译器支持cpp. 

 

Buildsetting设置编译器,按OBJECTive-C++写

 

11、     说说如何进行后台运行程序?

IOS4开始支持.9种情况:音乐.  GPS  VOIP(网络电话) 后台下载 

后台网络请求

 

申请后台运行 :接受一个代理---EnterBackGround

 

     – beginBackgroundTaskWithExpirationHandler:

          – endBackgroundTask:

 

12、     sizeof和strlen的区别和联系

   sizeof用来计算内存大小
           
strlen用来计算字符长度的

 

 

13、     sprintf,strcpy,memcpy的功能?使用上要有哪些要注意的地方

                        strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char*dst, const char *src); 

将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。具备字符串拷贝功能的函数有memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(char *dst,const char* src, unsigned int len); 

将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存叠加的问题。 

sprintf是格式化函数。将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,造成溢出。

Sprint:将打印的内容输出到文件

 

 

 

14、     自己写函数,实现strlen功能

intstrlen(const char string[]){//注意写const,字符串只读,保证安全,无法修改串
                        int i=0;
                        while(string[i])

  i++;
                        return i;
                        }

 

 

 

15、     写一个代码片段输入一个字符串“20130322152832,输出一个NSDate类型的对象,打印该对象输出2013-03-22 15:28:32

NSString*str = @20130322152832;

//转化为NSdate

NSDateFormatter*formatter =[ [NSDateFormatter alloc]init];

[formattersetDateFormatter: @yyyyMMddhhmmss ];

NSDate*date  = [formatter dateFromString:str];

//转化为字符串

 [formatter setDateFormatter: @yyyy-MM-dd-hh-mm-ss ];

NSString*str_last = [formatter stringFromdate:date];

 

16、     找错误

a:void test1()

{

 char string[10];

 char* str1 = "0123456789";

 strcpy( string, str1 );

}// \0放不下,打印的时候字符串结束位置不确定

 

b:voidGetMemory( char **p, int num )

{

 *p = (char *) malloc( num );

}//--------没有free代码(释放)

voidTest( void )

{

 char *str = NULL;

 GetMemory( &str, 100 );

 strcpy( str, "hello" );

 printf( str );

-------free(str);

}

17、     用变量a写出以下定义

      a、一个整型数 int a

      b、一个指向整型数的指针 int *a

      c、一个指向指针的指针,它指向的指针是指向一个整型数 int ** a

      d、一个有10个整型数的数组 int a[10]

      e、一个有10个指针的数组,该指针是指向一个整型数的int *a[10]

      f、一个指向有10个整型数数组的指针int(*a)[10]----宣布a是个指针变量

      g、一个指向函数的指针,该函数有一个整型参数,并返回一个整型数

                        int(*a)(int );

将函数的首地址赋给a

 

 

你可能感兴趣的:(ios,oc)