IOS面试整理

#import与#include的区别@class呢?
     #import导入文件头时会自动判断是否导入过,避免重复导入。引用类的方法和属性。
     #include导入文件头是通过定义宏来判断是否重复导入。
     @class 在interface中引用一个类,就用@class,它会把这个类作为一个类型来使用,而在实现这个interface的文件中,如果需要引用这个类的实体变量或者方法之类的,还是需要import这个在@class中声明的类。


内存管理原则(谁创建,谁释放)

ARC(Automatic Reference Counting)
    √     一个对象被release释放之后,最后引用它的变量我们手动设置为nil,否则可能造成野指针错误,注意给空对象发生消息不会引起错误的。
     √      Cocoa形成了一个惯例:父对象应该强引用子对象,子变量应该弱引用父对象。(避免retain cycle)

属性参数

@property的参数分为三类,也就是说参数最多可以有三个,中间用逗号分隔,每类参数可以从上表三类参数中人选一个。如果不进行设置或者只设置其中一类参数,程序会使用三类中的各个默认参数,默认参数:(atomic,readwrite,assign)

一般情况下如果在多线程开发中一个属性可能会被两个及两个以上的线程同时访问,此时可以考虑atomic属性,否则建议使用nonatomic,不加锁,效率较高;readwirte方法会生成getter、setter两个方法,如果使用readonly则只生成getter方法;关于set方法处理需要特别说明,假设我们定义一个属性a,这里列出三种方式的生成代码:

assign,用于基本数据类型

-(void)setA:(int)a{
    _a=a;
}

retain,通常用于非字符串对象

-(void)setA:(Car *)a{
    if(_a!=a){
        [_a release];
        _a=[a retain];
    }
}

copy,通常用于字符串对象

-(void)setA:(NSString *)a{
    if(_a!=a){
        [_a release];
        _a=[a copy];
    }
}

自动释放池
     
  • autorelease方法不会改变对象的引用计数器,只是将这个对象放到自动释放池中; 
  • 自动释放池实质是当自动释放池销毁后调用对象的release方法,不一定就能销毁对象(例如如果一个对象的引用计数器>1则此时就无法销毁); 
  • 由于自动释放池最后统一销毁对象,因此如果一个操作比较占用内存(对象比较多或者对象占用资源比较多),最好不要放到自动释放池或者考虑放到多个自动释放池; 
  • ObjC中类库中的静态方法一般都不需要手动释放,内部已经调用了autorelease方法;


self.和self的区别?

     √@property定义retain属性,用self.赋值的时候系统会调用set方法(set方法中有retain),而self直接给实体变量赋值,不会经过set方法。


单列模式

     +( Singleton *)sharedInstance
     {
            static  Singleton * _sharedInstance = nil;
            static dispatch_once_t  oncePredicate;
            dispatch_once(&oncePredicate,^{
                    _sharedInstance = [[ Singleton alloc] init];
            })
               
          return _sharedInstance;
     }
     
   
 +( Singleton *)sharedInstance
     {
         static  Singleton * _sharedInstance = nil;
          if(_sharedInstance != null){
               _sharedInstance = [[ Singleton alloc] init];
          }                        
          return _sharedInstance;
     }


动画实现的2种方式
     第一种  
  1. [UIView beginAnimations:@"Curl"context:nil];//动画开始  
  2. [UIView setAnimationDuration:1.25];//动画持续时间  
  3. [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];//动画速度  
  4. [UIView setAnimationTransition: UIViewAnimationTransitionCurlUp//类型  
  5.                        forView:self.view  
  6.                          cache:YES];  
  7. [UIView commitAnimations];  

     第二种
  1. CATransition *animation = [CATransition animation];   
  2. [animation setDuration:1.25f];   
  3. [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];  
  4. [animation setType:kCATransitionReveal];  
  5. [animation setSubtype: kCATransitionFromBottom];  
  6. [self.view.layer addAnimation:animation forKey:@"Reveal"];  


#ifndef/#define/#endif
#ifndef  “if not define a.h” 如果不存在,#define 就默认引入,#endif结束标志

你可能感兴趣的:(IOS)