• 经典面试总结2


    1.

     写一个NSString类的实现+ (id)initWithCString:(constchar *)nullTerminatedCString encoding:

    (NSStringEncoding)encoding;

    { NSString *obj;

    obj = [self allocWithZone: NSDefaultMallocZone()];

    obj = [obj initWithCString: nullTerminatedCString encoding: encoding]; return [obj autorelease];
    }
    2.谈谈你对MVC的理解?为什么要用MVC?在Cocoa中MVC是怎么实现的?你还熟悉其他的OC设计模式或别 的设计模式吗?

    MVC就是Model-View-Controller的缩写,M指的是业务模型,V指的是用户页面,C指的是控制器。MVC是架构模式,是讲M和 V的代码分离,从而使同那个一个程序可以使用不同的表现形式。 M:表示数据和业务规则,V是用户看到的并与之交互的页面,C是接受用户的输入并调用M和V取完成用户需求的 单例,代理,观察者,工厂模式等 单例模式:说白了就是一个类不通过alloc方式创建对象,而是用一个静态方法返回这个类的对象。系统只需要拥有一个的 全局对象,这样有利于我们协调系统整体的行为; 代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用.比如一个工厂生产了产品,并不想 直接卖给用户,而是搞了很多代理商,用户可以直接找代理商买东西,代理商从工厂进货.常见的如QQ的自动回复就属于代 理拦截,代理模式在iphone中得到广泛应用.

    观察者模式: 当一个物体发生变化时,会通知所有观察这个物体的观察者让其做出反应。实现起来无非就是把所有观察者的 对象给这个物体,当这个物体的发生改变,就会调用遍历所有观察者的对象调用观察者的方法从而达到通知观察者的目的;

    3.

    readwrite,readonly,assign,retain,copy,nonatomic 、strong、weak属性的作用?并区别

    strong(强引用)、 weak(弱引用)?什么情况使用copy,assign,和retain?

    readwrite 是可读可写特性;需要生成getter方法和setter方法时
    readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变
    assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
    retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
    copy 表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时。
    nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用 nonatomic
    assign用于简单数据类型,如NSInteger,double,bool。
    retain 和copy用户对象,copy用于当 a指向一个对象,b也想指向同样的对象的时候,如果用assign,a如果释放,再 调用b会crash,如果用copy 的方式,a和b各自有自己的内存,就可以解决这个问题。retain 会使计数器加1,也可以解 决assign的问题。另外:atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。 在多线程环境 下,原子操作是必要的,否则有可能引起错误的结果。

    4. 一:

    static DataHandle *handle = nil;
    + (DataHandle *)shareInstance{
    if(handle == nil){
    //如果还没有创建过对象,使用handle指向新创建的对象
    handle = [[DataHandle alloc] init];
     }
    //如果已经创建过对象,则直接返回已经创建的对象。
    return handle;


    二:


    + (id)sharedInstance  
    {  
        static id sharedInstance = nil;  
        static BOOL token = NO;  
          
        if (!token) {  
            token = YES;  
              
            sharedInstance = [[NSObject alloc] init];  
        }  
          
        return sharedInstance;  
    }  
    //单例方法。dispatch_once  第三种方法。

    #pragma mark -- 封装的Manager单例方法

    +(instancetype)shareManager

    {

        static MusicInfoManager *manager = nil;

        static dispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{

            //初始化

            manager = [[MusicInfoManager alloc] init];

     });
        return manager;
        }
    5

    写一个完整的代理,包括声明,实现
    //创建
    @protocol BeforeMarriedDelagate <NSObject> @required

    -(void)doCook:(NSString *)foodName; -(void)doHomework;
    @optional
    -(void)driveCar;

    -(void)makeMoney; @end

    //声明
    @interface Boy : NSObject< BeforeMarriedDelagate>

    -(void)doCook:(NSString *)foodName; -(void)doHomework; -(void)makeMoney;
    //实现

    @implementation Boy
    -(void)doCook:(NSString *)foodName
    { NSLog(@"做饭:%@!",foodName);}
    -(void)doHomework
    { NSLog(@"今天洗衣服!");}
    -(void)makeMoney
    { NSLog(@"Coding!!");}
    @end

    6

    类别的作用?继承和类别在实现中有何区别?
    答案:category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。
    并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
    类别主要有3个作用:
    (1)将类的实现分散到多个不同文件或多个不同框架中。
    (2)创建对私有方法的前向引用。
    (3)向对象添加非正式协议。
    继承可以增加,修改或者删除方法,并且可以增加属性。

    .Difference between categories and extensions?
    类别和类扩展的区别。
    答案:category和extensions的不同在于 后者可以添加属性。另外后者添加的方法是必须要实现的。
    extensions可以认为是一个私有的Category。

  • 相关阅读:
    c#常用简化语句
    SQL语句使用中的笔录
    UpdateProgress 实现加载效果
    maven的下载安装,配置本地仓库
    IntelliJ IDEA启动Tomcat后,无法访问Tomcat主页
    SSM框架实现分页
    mybatis-generator-xxxx 使用方法
    Mybatis错误:Parameter 'XXX' not found. Available parameters are [1, 0, param1, param2]
    mybatis高级映射(一对一,一对多)
    SSM整合---实现全部用户查询
  • 原文地址:https://www.cnblogs.com/liuyang666/p/5236003.html
Copyright © 2020-2023  润新知