入行时的面试题(大家不要笑哦)

1、          简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwritereadonlyassignretaincopynonatomic atomicstrongweak属性的作用?
OC使用了一种叫做引用计数的机制来管理对象,如果对一个对象使用了alloc、[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease。也可以理解为自己生成的对象,自己持有。非自己生成的对象,自己也能持有。不在需要自己持有的对象时释放。非自己持有的对象无法释放。生成并持有对象<alloc,new,copy,mutableCopy等>,持有对象<retain>,释放对象<release>,废弃对象<dealloc>。readwrite(默认):可读可写,表示既有getter方法,也有setter方法。readonly:表示只有getter方法,没有setter方法。nonatomic:不考虑线程安全。atomic(默认):线程操作安全。strong(默认):ARC下和MRC下retain一样,weak(ARC下):和(MRC下)assign类似,区别是当weak指向的内存释放掉后自动置为nil,防止野指针。

unsafe_unretained声明一个若引用,但不会自动置为nil,可能会出现野指针。

线程安全下的setter和getter方法:

-      (NSString*)value{

@synchronized(self){

return [[_value retain] autorelease];

}

}

-      (void)setValue:(NSString*)aValue{

@synchronized(self){

[aValue retain];

[_value release];

_value = aValue;

}

}

2、          类变量的@protected,@private,@public,@package,声明各有什么含义?
上面的几个声明表明的时类成员的作用域,@private作用范围只能在自身类(外界既不可访问,又不能继承);@protected作用范围在自身类和子类,如果什么都不加修饰,默认是@protected(外界不可访问,但是可以继承);@public作用范围最大,可以在任何地方被访问(外界即可访问,又可以继承);@package作用范围在某个框架内

3、          线程是什么?进程是什么?二者有什么区别和联系?
线程是CPU独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码片段),进程是资源分配的基本单位(进程是一块包含了某些资源的内存区域)。进程是线程的容器,真正完成代码执行的是线程,而进程则作为线程的执行环境。一个程序至少包含一个进程,一个进程至少包含一个线程,一个进程中的多个线程共享当前进程所拥有的资源。

4、          谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
好处:
1、使用线程可以把程序中占据时间长的任务放到后台去处理,如图片、视频的下载
2、发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好
缺点:
1、大量的线程降低代码的可读性,
2、更多的线程需要更多的内存空间
3、当多个线程对同一个资源出现争夺的时候要注意线程安全的问题。
iOS有三种多线程编程的技术:
1、NSThread(两种创建方式)
[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:selfwithObject:nil];
NSThread *myThread = [[NSThread alloc] initWithTarget:selfselector:@selector(doSomething:) object:nil];

[myThread start];
2、NSOperationQueue

NSOperationQueue *oprationQueue = [[NSOperationQueuealloc] init];

oprationQueue addOperationWithBlock:^{

//这个block语句块在子线程中执行

}

http://alloc.sinaapp.com/wp/?p=237

3、Grand Central Dispatch (GCD)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{bvbvvgbvhhhgh

   // 耗时的操作

   dispatch_async(dispatch_get_main_queue(), ^{

       // 更新界面

   });

});

http://blog.csdn.net/totogo2010/article/details/8016129

 

PS:不显示的创建线程的方法:
用NSObject的类方法  performSelectorInBackground:withObject: 创建一个线程:
[ObjperformSelectorInBackground:@selector(doSomething) withObject:nil];

5、          线程同步和异步的区别?IOS中如何实现多线程的同步?
同步:一个线程要等待上一个线程执行完之后才能执行当前的线程,生活中的例子(上厕所)。
异步:同时去做两件或者多件事。比如边听歌边看报。  
GCD串行队列,GCD当中的屏障dispatch_barrier,NSOperationQueue设置最大并发数为1

参考(http://blog.csdn.net/lifengzhong/article/details/7487505

多线程实现数据:原子操作(atomic)、加锁(NSLock、NSRecursive、NSConditionLock)、@synchronized

6、          假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理之后的输出结果为:aabcd

本题的题意是以第一个出现的字母作为参照,只要之后出现相同的字母并且和第一个字母不相邻,那么就删除。为防止删除某些字符之后,把之前不相邻的重复字符串转化为相邻字符串,所以可以先用空格替换掉需要删除的字符,最后对数组里面的空格进行处理。
-(void)removeRepeat:(NSString *)aNum

{

   NSMutableArray *mArr = [[NSMutableArray alloc]initWithCapacity:10];

   for (int i = 0;i < aNum.length;i++)

   {

       [mArr addObject:[aNum substringWithRange:NSMakeRange(i,1)]];

   }

   NSLog(@"- %@", mArr);

   [self compareNum:mArr];

   NSLog(@"%@",mArr);

   

}

//比较是否相等

-(NSMutableArray*)compareNum:(NSMutableArray *)mArr

{

   int count = mArr.count;//重新定义了,count不会减一

   for (int j = 0; j < count - 1; j++)

   {

       for (int i = j; i < count - 1-1-1; i++)

       {

            NSLog(@" %@  %@",[mArr objectAtIndex:j],[mArr objectAtIndex:i+ 2]);

            NSString *a = [mArrobjectAtIndex:j];

            NSString *b = [mArrobjectAtIndex:i+2];

           

            if ([a isEqualToString:b])

            {

                [mArr replaceObjectAtIndex:i +2 withObject:@" "];

            }

       }

   }

   

   return mArr;

}

 

7、          获取一台设备唯一标识的方法有哪些?
MAC地址,udid,keychain,openudid,广告标识IDFA-identifierForIdentifier

参考链接<http://www.2cto.com/kf/201308/237648.html >。

8、          iOS类是否可以多继承?如果没有,那可以用其他方法实现吗?简述实现过程。
不可以,可以通过delegate和protocol和类别来实现类似多继承。

9、          堆和栈的区别?
栈区(stack)--由编译器自动分配释放,存放函数的参数值、局部变量的值。
堆区(heap)--一般由程序员分配释放。
全局区(静态区)(static)--全局变量和静态变量。程序结束后由系统释放。

     文字常量区--常量字符串存放在这里。程序结束后由系统释放。
         程序代码区—存放函数体的二进制文件。

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

10、       iOS本地数据存储都有哪几种方式?iOS如何实现复杂对象的存储?

1、        NSKeyedArchiver(归档)采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。

2、        NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。

3、        Write写入方式:永久保存在磁盘中。

4、        SQLite(FMDB、CoreData)

NSCoding +NSKeyedArchiver实现复杂对象的存储。

11、      iOS的动态性
iOS的动态性来自三个方面:动态类型、动态绑定、动态载入、SEL类型

1、动态类型<弱类型>(id):在代码的运行阶段判断代码的类型,使用id类型可以让应用在“运行时”使用任何类型来替换。动态类型让程序更加灵活,但是会使数据的统一性降低和代码的可读性。我们常用静态类型<强类型>(如NSString),使用静态类型编译器可以完全分析你的代码,这让代码的性能和可预知性更高。
2、动态绑定:让代码在运行时判断需要调用什么方法,而不是在编译时。  动态类型和动态绑定使得选择哪个接收者已经调用什么方法都放到运行
      时去完成。          3、动态载入:应用程序可以根据需要加载可执行代码以及资源,而不是   

     在启动时就加载所有资源。

4、SEL类型iOS在编译的时候会根据方法的名字(包括参数序列),生成一个用来区分这个方法的唯一的ID,这个ID是SEL类型的,SEL的本质就是类方法的编号[函数地址]。(类似C语言里面的函数指针,但是OC的类不能直接使用函数指针,这样只能做一个@selector语法来取。注意:@selector是查找当前类(含子类)的方法。)

 


1、写出方法获取ios内存使用情况。
//获取当前设备可用内存及所占内存的头文件

#import <sys/sysctl.h>

#import <mach/mach.h>

 

// 获取当前设备可用内存(单位:MB

- (double)availableMemory

{

  vm_statistics_data_t vmStats;

  mach_msg_type_number_t infoCount =HOST_VM_INFO_COUNT;

 kern_return_tkernReturn = host_statistics(mach_host_self(), 

                                           HOST_VM_INFO

                                           (host_info_t)&vmStats, 

                                           &infoCount);

  

  if(kernReturn != KERN_SUCCESS) {

  return NSNotFound;

  }

  

  return ((vm_page_size *vmStats.free_count) / 1024.0) / 1024.0;

}

 

//获取当前任务所占用的内存(单位:MB

- (double)usedMemory

{

  task_basic_info_data_t taskInfo;

  mach_msg_type_number_t infoCount =TASK_BASIC_INFO_COUNT;

  kern_return_t kernReturn = task_info(mach_task_self(), 

                                      TASK_BASIC_INFO

                                      (task_info_t)&taskInfo, 

                                     &infoCount);

 

  if(kernReturn != KERN_SUCCESS

      ) {

  return NSNotFound;

  }

  

  return taskInfo.resident_size / 1024.0 / 1024.0;}

1、          深拷贝和浅拷贝的理解?
深拷贝拷贝的是内容,浅拷贝拷贝的是指针。深拷贝和浅拷贝最大的区别就是子类对象的地址是否改变,如果子类对象的地址改变那么就是深拷贝。

2、怎样实现一个singleton的类。
static LOSingleton * shareInstance;

+( LOSingleton *)sharedInstance{

   @synchronized(self){//这个东西其实就是 一个加锁。如果self 其他线程访问,则会阻塞。这样做一般是用来对单例 进行一个死锁的保护

       if (shareInstance == nil) {

            shareInstance = [[superallocWithZone:NULL] init];

       }

   }

returnshareInstance;

}

//第二种方式

+ (LOSingleton *) sharedInstance

{

   static  LOSingleton *sharedInstance= nil ;

   static  dispatch_once_tonceToken;  // 锁

   dispatch_once (& onceToken, ^ {    // 最多调用一次

       sharedInstance = [[self  alloc]init];

   });

   return  sharedInstance;

}

3、什么是安全释放?

在对象release之后把指针置为nil

2、          RunLoop是什么?
一个RunLoop就是一个事件处理的循环,用来不停的调度工作以及处理输入时间。使用runloop的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。runloop的设计是为了减少cpu无谓的空转。

3、          什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储?
如果你需要存储一个复杂的对象的话,经常要以二进制的方法序列化这个对象,这个过程叫Archiving。如果一个对象需要进行序列化,那么需要遵循NScoding协议,主要有两个方法:
-(id)initWithCoder:(NSCoder*)coder;//从coder中读取数据,保存到相应变量中,即反序列化数据。
-(void)encodeWithCoder:(NSCoder*)coder;//读取实例变量,并把这些数据写到coder中去,即序列化数据。

4、          写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?
#define kMIN(X,Y)  ((X) > (Y)) ? (Y) :(X)

5、          iphone os有没有垃圾回收机制?简单阐述一下OC内存管理。
iphone os没有垃圾回收机制。
垃圾回收机制用于在空闲时间以不定时的方式动态的回收无任何引用的对象占据的内存空间。

6、          简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期?
应用程序的状态:
Not running 未运行,程序没启动
Inactive    未激活,程序在前台运行,不过没接受到事件,没有事件处理的状态下通常处于这个状态。
Active      激活   程序在前台并且接收到了事件
Backgound  后台   程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。
Suspended   挂起  程序在后台不能执行代码。
- (BOOL)application:(UIApplication *)applicationwillFinishLaunchingWithOptions:(NSDictionary *)launchOptions
   //告诉代理进程启动但还没进入状态保存
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  // 告诉代理启动基本完成程序准备开始运行
- (void)applicationWillResignActive:(UIApplication*)application
              // 当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
- (void)applicationDidBecomeActive:(UIApplication*)application 
                                         //  当应用程序入活动状态执行,这个刚好跟上面那个方法相反
- (void)applicationDidEnterBackground:(UIApplication*)application
                //  当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
- (void)applicationWillEnterForeground:(UIApplication*)application
                               //当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
- (void)applicationWillTerminate:(UIApplication*)application
                                              //当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。
-(void)applicationDidFinishLaunching:(UIApplication*)application
 //当程序载入后执行

7、          ViewController allocloadView,viewDidLoad,viewWillAppear,viewDidUnload,deallocinit分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?

          alloc初始化当前的ViewController

loadView:没有正在使用nib视图页面,子类将会创建自己的自定义视图层

viewDidLoad:试图被加载后调用

viewWillAppear:试图即将出现的时候调用

viewDidUnload:<iOS6之后废弃>当系统内存吃紧的时候会调用该方法,释放掉当前未在window中显示的试图和对应的控制器

 

 

描述应用程序的启动顺序。
1、程序入口main函数创建UIApplication实例和UIApplication代理实例
2、在UIApplication代理实例中重写启动方法,设置第一ViewController
3、在第一ViewController中添加控件,实现对应的程序界面。

为什么很多内置类如UITableViewControl的delegate属性都是assign而不是retain?请举例说明。
防止循环引用,
Student * str=[];

Teacher *teacher=[[Teacher alloc] init];

Student * student=[[Student alloc] init];

teacher.delegate=student;

student.delegate= teacher;

在teacher中dealloc会release当前的Delegate,就会触发student对象release,继而也会导致student执行dealloc,在student中也会release自己的delegate,产生循环了。

使用UITableView时候必须要实现的几种方法?
2个。
-(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section; 这个方法返回每个分区的行数
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath)indexPath;这个方法返回我们调用的每一个单元格

写一个便利构造器。
+ (id)studentWithName:(NSString*)newName andAge:(int)newAge
{
              Student *stu = [[Studentalloc] initWithName:newName andAge:newAge];
              return [stu autorelease];
}

UIImage初始化一张图片有几种方法?简述各自的优缺点。
1、从资源读取
UIImage *image = [UIImage imageNamed:@”1.png”];
2、从网络读取
NSURL*url=[NSURLURLWithString:@"http://www.sinaimg.cn/qc/photo_auto/chezhan/2012/50/00/15/80046_950.jpg"];
3.从手机本地读取
//读取本地图片非resource
NSString *aPath3=[NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];
UIImage *imgFromUrl3=[[UIImage alloc]initWithContentsOfFile:aPath3]; 4.从现有的context中获得图像

//add ImageIO.framework and #import<ImageIO/ImageIO.h> 

CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url,NULL);

CGImageRef img=CGImageSourceCreateImageAtIndex(source,0,NULL);

CGContextRef ctx=UIGraphicsGetCurrentContext();

CGContextSaveGState(ctx);

//transformCTM的2种方式

//CGContextConcatCTM(ctx, CGAffineTransformMakeScale(.2,-0.2));

//CGContextScaleCTM(ctx,1,-1);

//注意坐标要反下,用ctx来作为图片源

CGImageRef capture=CGBitmapContextCreateImage(ctx);

CGContextDrawImage(ctx, CGRectMake(160, 0, 160, 230), [imageCGImage]);

CGContextDrawImage(ctx, CGRectMake(160, 230, 160, 230), img);

CGImageRef capture2=CGBitmapContextCreateImage(ctx);

5、用Quartz的CGImageSourceRef来读取图片

CGImageSourceRef source =CGImageSourceCreateWithURL((CFURLRef)url, NULL);

CGImageRef img=CGImageSourceCreateImageAtIndex(source,0,NULL);

参考(http://blog.csdn.net/jerryvon/article/details/7526147#)

回答person的retainCount值,并解释为什么

Person * per = [[Person alloc] init];

self.person = per;
person属性如果为assign的话retainCount为1,如果为retain的话retainCount为2

这段代码有什么问题吗:

@implementation Person

- (void)setAge:(int)newAge {

self.age = newAge;

}

@end
死循环

这段代码有什么问题,如何修改

for (int i = 0; i < someLargeNumber;i++) {

NSString *string = @Abc;

string = [string lowercaseString];

string = [stringstringByAppendingString:@"xyz"];

NSLog(@%@,string);

}

如果数字很大的话会造成内存一直增加(因为一直通过便利构造器方法创建autorelease对象),直到循环结束才减少,在循环内加一个自动释放池,更改后代码如下:

for (int i = 0; i < someLargeNumber;i++) {

NSString *string = @Abc;
@autoreleasepool {

       string= [string lowercaseString];

       string= [string stringByAppendingString:@"xyz"];

       NSLog(@%@, string);

 

}

}

 

截取字符串20 | http://www.baidu.com中,|字符前面和后面的数据,分别输出它们。
NSString *string = @”20 | http://www.baidu.com”;
[string componentsSeparatedByString:@”|”];

用obj-c写一个冒泡排序

              NSMutableArray*array = [NSMutableArrayarrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];

    NSString  *tmp;

    for (int i = 0; i< array.count; i ++) {

        for (int j = 0;j < array.count  - 1 - i; j++) {

            if ([[arrayobjectAtIndex:j] integerValue] > [[array objectAtIndex:j + 1] integerValue]){

                tmp =[array objectAtIndex:j];

                [arrayreplaceObjectAtIndex:j withObject:[array objectAtIndex:j + 1]];

                [arrayreplaceObjectAtIndex:j + 1 withObject:tmp];

            }

        }

    }

 

 

 

 

1、          简述你对UIView、UIWindow和CALayer的理解
UIView继承于UIResponder,UIResponder继承于NSObject,UIView可以响应用户事件。CALayer继承于NSObject,所以CALayer不能响应事件。
UIView构建界面,UIView侧重于对内容的管理,CALayer侧重于对内容的绘制。
UIView是用来显示内容的,可以处理用户事件;CALayer是用来绘制内容的,对内容进行动画处理,依赖与UIView来进行显示,不能处理用户事件。

2、          写一个完整的代理,包括声明,实现

3、          分析json、xml的区别?json、xml解析方式的底层是如何处理的?
json底层原理遍历字符串中的字符,最终根据各市规定的特助字符,比如{},[],:号等进行区分,{}是字典,[]表示的时数组,:号是字典的键和值的分水岭,最总是将json数据转化为字典。Xml两种解析方式,DOM和SAX,DOM需要读入整个XML文档(文档驱动),SAX是事件驱动的,并不需要读入整个文档,文档的读入过程也就是SAX的解析过程。

4、          ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?
didReceiveMemoryWarning在出现内存警告的时候执行该方法,在该方法里面释放掉暂时没使用的可重用的对象。

if([self isViewLoaded] == YES &&self.view.window == nil)

   {

       self.view = nil;

   }

5、          面向对象的三大特征,并作简单的介绍
封装、继承、多态。封装:是把客观事物封装成抽象的类,隐藏内部的实现,对外部提供接口。继承:可以使用现有类的所有功能,并且在无需重新编写原来的类的情况下对这些功能进行扩展。多态:不同的对象以自己的方式响应相同的的消息的能力叫做多态,或者说父类指针指向子类对象<如UITableView的,cellForRow方法,返回值类型是UITbaleViewCell,但是你返回的cell可以是你自定义的cell,在比如多个类里面都有同一个方法>

6、          重写一个NSStrng类型的,retain方式声明name属性的setter和getter方法

7、          简述NotificationCenter、KVC、KVO、Delegate?并说明它们之间的区别?
Notification:观察者模式,controller向defaultNotificationCenter添加自己的notification,其他类注册这个notification就可以收到通知,这些类可以在收到通知时做自己的操作(多观察者默认随机顺序发通知给观察者们,而且每个观察者都要等当前的某个观察者的操作做完才能轮到他来操作,可以用NotificationQueue的方式安排观察者的反应顺序,也 可以在添加观察者中设定反映时间,取消观察需要在viewDidUnload跟dealloc中都要注销)。

KVC键值编码,可以直接通过字符串的名字(key)来间接访问属性的机制,而不是通过调用getter和setter方法访问。
KVO:观测指定对象的属性,当指定对象的属性更改之后会通知相应的观察者。
delegate:一对一,delegate遵循某个协议并实现协议声明的方法。

8、          What is lazyloading?
在使用的时候才去初始化,比如UITableViewCell的imageView属性,懒加载对象的创建是在getter方法里面进行创建的。

9、          什么是Protocol?什么是代理?写一个委托的interface?委托的property声明用什么属性?为什么?
协议提供了一组方法,但是并不负责实现,如果一个类遵循了某个协议,并且实现了协议里面的方法,那么我们称这个类就是遵循了某个协议的代理。属性的声明使用assign,防止出现循环引用的问题。

10、      分别描述类别(categories)和延展(extensions)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?
category类目:在不知道源码的情况下为一个类扩展方法,extension:为一个类声明私有方法和变量。
继承是创建了一个新的类,而类别只是对类的一个扩展,还是之前的类。
类目的作用就是为已知的类添加方法。

 

 

 

 

1、          Objective-C有私有方法么?私有变量呢?如多没有的话,有没有什么代替的方法?
objective-c – 类里面的方法只有两种, 静态方法和实例方法. 
@private来修饰私有变量
OC中所有的实例变量默认都是私有的,所有的实例方法默认都是公有的。

2、          #import、#include和@class有什么区别
#includec语言中引入一个头文件,但是可能出现交叉编译
#import在OC中引入自己创建的头文件#import””或者系统框架#import<>。#import不会出现交叉编译
@class对一个类进行声明,告诉编译器有这个类,但是类的定义什么的都不知道

3、          谈谈你对MVC的理解?为什么要用MVC?在Cocoa中MVC是怎么实现的?你还熟悉其他的OC设计模式或别的设计模式吗?
MVC是Model-VIew-Controller,就是模型-视图-控制器,MVC把软件系统分为三个部分:Model,View,Controller。在cocoa中,你的程序中的每一个object(对象)都将明显地仅属于这三部分中的一个,而完全不属于另外两个。MVC可以帮助确保帮助实现程序最大程度的可重用性。各MVC元素彼此独立运作,通过分开这些元素,可以构建可维护,可独立更新的程序组建。
单例模式,delegate设计模式,target-action设计模式

4、          如监测系统键盘的弹出
[[NSNotificationCenterdefaultCenter] addObserver:self selector:@selector( )name:UIKeyboardWillShowNotification object:nil];

5、          举出5个以上你所熟悉的ios  sdk库有哪些和第三方库有哪些?
Foundation,CoreFraphics,UIKit,MapKit,CoreLocation,CFNetWork,MessageUI,ImageIO,CoreData,AFNetWorking,MKNetWorkKit,ASIHttpRequest,FMDB,ZXing,ZBar,SDWebImage

6、          如何将产品进行多语言发布?
程序的国际化

7、          如何将敏感字变成**
字符串替换stringByReplacingOccurrencesOfString: withString:

8、          objc中的减号与加号代表什么?
+静态方法,也叫类方法,-实例方法

9、          单例目的是什么,并写出一个?
当一个类只能有一个实例的时候需要使用单例。创建参照第2个文件

10、       说说响应链
当事件发生的时候,响应链首先被发送给第一个响应者(往往是事件发生的视图,也就是用户触摸屏幕的地方)。事件将沿着响应者链一直向下传递,直到被接受并作出处理。一般来说,第一响应这是个视图对象或者其子类,当其被触摸后事件就交由它处理,如果他不处理,时间就会被传递给视图控制器对象UIViewController(如果存在),然后是它的父视图对象(superview),以此类推直到顶层视图。接下来会沿着顶层视图(topview)到窗口(UIwindow 对象)再到程序的(UIApplication对象),如果整个过程都没有响应这个事件,则该事件被丢弃,一般情况下,在响应链中只要有对象处理事件,事件就会被传递

         典型的响应路线图如:
      First  Responser --> The Window-->The Applicationn --> App Delegate

 

 

 

 

 

1、请写出代码,用blocks来取代上例中的protocol,并比较两种方法的优势。实际应用部分?请写出代码,用blocks取代协议或回调方法
声明:
#import<Foundation/Foundation.h>

typedef void(^TestBlock)(NSString*string);

@interface LO_Person : NSObject

+(void)showStringFromBlcok:(TestBlock)justBlock;
@end
实现:
#import "LO_Person.h"

 

@implementation LO_Person

 

+(void)showStringFromBlcok:(TestBlock)justBlock

{

   NSString *str = @"测试blcok";

   justBlock(str);

}
@end
调用:
[LO_Person showStringFromBlcok:^(NSString *string) {

       NSLog(@"-- %@",string);

   }];

 

1、          你做iphone开发时候,有哪些传值方式,view和Controller之间是如何传值的?
属性、delegate、blocks

2、          给定的一个字符串,判断字符串中是否还有png,有就删除它?
[string stringByReplacingOccurrencesOfString:@"png"withString: @""]

3、          对于语句NSString* testObject = [[NSData alloc] init];testObject 在编译时和运行时分别是什么类型的对象?
编译的时候是NSString类型,运行的时候是NSData类型

4、          OC中是所有对象间的交互是如何实现的?
函数指针实现

5、          目标-动作机制
目标是动作消息的接收者。动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法常用的UIButton添加方法

6、          for(int index = 0; index < largenumber;index ++){
NSString *tempStr = @
tempStr;
NSLog(tempStr);
NSNumber *tempNumber = [NSNumber numberWithInt:2];
NSLog(tempNumber);
}
这段代码有什么问题.?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?为什么?
参照第三个文档

7、          描述上拉加载、下拉刷新的实现机制?
根据下拉或者上拉的距离来判断是否进行网络请求

8、          什么是沙盒(sandbox)?沙盒包含哪些文件,描述每个文件的使用场景。如何获取这些文件的路径?如何获取应用程序包中文件的路径?
iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。
默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;

Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除

tmp:提供一个即时创建临时文件的地方。

iTunes在与iPhone同步时,备份所有的Documents和Library文件。iPhone在重启时,会丢弃所有的tmp文件。

9、          介绍一下XMPP?有什么优缺点吗?
XMPP:基于XML的点对点的即时通讯协议。
XMPP 协议是公开的,XMPP协议具有良好的扩展性,安全性
缺点是只能传输文本

10、       谈谈对性能优化的看法,如何做?

从用户体验出发:1、程序logging不要太长、2、相同数据不做重复获取、3、昂贵资源要重用(cell、sqlite、date),4、良好的编程习惯和程序设计:选择正确的集合对象和算法来进行编程、选择适合的数据存储格式(plist、SQLite)、优化SQLite查询语句5、数据资源方面的优化(缓存和异步加载)

解决方案:

  • 能够发现问题
  • 利用log或工具分析问题原因
  • 假设问题原因
  • 改进代码和设计

http://blog.csdn.net/yangxt/article/details/8173412


1、          应用程序如何省电?
GPS定位在不需要的时候即使关闭

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

{

                   if(n==0||n==1)

                     return 1;

                   else

                     return n*fun(n-1);

}

3、          NSArray和NSMutableArray的区别,多线程操作哪个更安全?
NSArray不可变数组,NSMutableArray可变数组,NSArray更安全,多线程操作的时候记得加锁。

4、          当前有一个数组,里面有若干重复的数据,如何去除重复的数据?(会几个写几个)
最简单的方式,把数组里面的元素放到集合里面。
也可以对数组进行排序,排序之后把数组里相同的元素删除掉

5、          isKindOfClass、isMemberOfClass作用分别是什么?
-(BOOL)isKindOfClass: classObj判断是否是这个类或者是这个类子类的实例
-(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例

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

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

name = @Habb;

[name  release]
第一行:[[ NSString alloc] init]在堆区开辟一块内存,name指向堆区的这快内存,第二行:name指向常量区,这个时候堆区的内存没有释放也没有指针指向,会造成内存泄露

7、          请分别写出SEL、id的意思?
参照前面文档的动态类型和动态绑定

8、          iPhone上,不能被应用程序直接调用的系统程序是什么?
时钟、视频、指南针、天气、计算器、备忘录、提醒事件、股市
http://blog.sina.com.cn/s/blog_7dc11a2e01016qve.html

  http://blog.csdn.net/yhawaii/article/details/7587355

9、以.mm为拓展名的文件里,可以包含的代码有哪些?c和obj-c如何混用
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编写的模块是我们想要的。

如果模块以类实现,那么要按照cppclass的标准写类的定义,头文件中不能出现obj-c的东西,包括#import cocoa的。实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。

如果模块以函数实现,那么头文件要按c的格式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m

10、说说如何进行后台运行程序?
     1、检查设备是否支持多任务

2、applicationDidEnterBackground和applicationWillEnterForeground(UIApplicationDidEnterBackgroundNotification和UIApplicationWillEnterForegroundNotification)

3、声明你需要的后台任务(在Info.plist中添加Required background modes键值:audio、location、voip)

11、sizeof和strlen的区别和联系
    sizeof是运算符,strlen是函数
     char str[20]="0123456789";
     int a=strlen(str); //a=10;>>>> strlen 计算字符串的长度,以结束符 0x00为字符串结束。
     int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。

12、sprintf,strcpy,memcpy的功能?使用上要有哪些要注意的地方
char*strcpy(char *dest, const char*src);

其对字符串进行操作,完成从源字符串到目的字符串的拷贝,当源字符串的大小大于目的字符串的最大存储空间后,执行该操作会出现段错误。

int sprintf(char*str, const char*format, ...)

函数操作的源对象不限于字符串:源对象可以是字符串、也可以是任意基本类型的数据。主要是实现将其他数据类型转换为字符串

void *memcpy(void*dest, const void *src,size_t n)

实现内存的拷贝,实现将一块内存拷贝到另一块内存。该函数对源对象与目的对象没有类型现在,只是对内存的拷贝

9、         自己写函数,实现strlen功能
判断的时候注意“\0”

10、      写一个代码片段输入一个字符串“20130322152832,输出一个NSDate类型的对象,打印该对象输出2013-03-22 15:28:32
NSDateFormatter  @“yyyy-MM-dd HH:mm:ss”

11、       找错误

a:void test1()

{

 char string[10];

 char* str1 = "0123456789";

 strcpy( string, str1 );//注意strcpy特点

}

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

{

 *p = (char *) malloc( num );//分配了内存空间,但是没有释放

}

voidTest( void )

{

 char *str = NULL;

 GetMemory( &str, 100 );

 strcpy( str, "hello" );

 printf( str );

}

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

      a、一个整型数   inta;

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

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

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

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

      f、一个指向有10个整型数数组的指针 int (*a)[10];

      g、一个指向函数的指针,该函数有一个整型参数,并返回一个整型数int(*a)(int);

 

 

 

 



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡搜偶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值