美文网首页
基础面试题

基础面试题

作者: 求长生 | 来源:发表于2020-06-15 12:13 被阅读0次

    1.面向对象

    面向对象和面向过程是解决问题的两种思维方式。面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计解决问题所需功能的类。(OO面向对象、OOP面向对象编程)

    2.OC语言的特性

    OC语言作为面向对象的语言,具有面向对象的语言特性,如封装、继承、多态。他具有静态语言的特性(如C++),又有动态语言的效率(动态绑定、动态加载)。

    3.面向对象语言特性

    (1)封装(encapsulation)

         封装是隐藏对象的属性和方法实现,仅对外公开接口,控制程序中属性的读取修改权限。
    
          属性是对字段的封装。
    
          类是对字段,属性,方法等数据成员的封装。
    
          项目是对类的封装。
    

    (2)继承

    使子类具有父类的各种属性和方法,另外子类可以覆盖父类的属性和方法或追加新的属性和方法。(继承的方式,公有继承[public]、私有继承[private]、保护继承[protected])(扩展类\派生类\子类,是在继承中对子类的不同称呼)

    (3)多态(Polymorphism)

    多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术。(允许将子类类型的指针赋值给父类类型的指针,即父类的指针指向子类的实例)

    OC中的多态,不同对象对同一消息的不同响应,子类可以重写父类的方法。允许方法重名,参数或返回值可以是父类型传入或返回。

    4.OC的动态特性

        之所以叫做动态,是因为必须到运行时(run time)才会做一些事情。(动态特性的三个方面:动态类型、动态绑定、动态加载)
    

    (1)动态类型

         动态类型,(id类型)在编译器编译的时候不能被识别出,在运行时(run time),程序运行的时候才会根据语境来识别。
    
         静态类型,与动态类型相对。在编译的时候就能识别出来,明确的基本类型都属于静态类型。(int、NSString等)
    

    (2)动态绑定

          (关键词@selector)跳过编译,在运行时动态添加函数调用,运行时才决定调用什么方法,传递什么参数。
    

    (3)动态加载

         根据需求动态地加载资源。
    

    5.OC的优缺点

    优点

    (1)类别(Category)

         在不创建继承类的情况下,给已经存在的类添加方法。可将常用的相关方法分组。(@interface 类名(类别名)   @end)
    
          扩展
    
          扩展实际上是类别无类别名称。它通常被称为匿名类别。声明扩展的语法使用@ interface关键字,空括号。(@interface 类名()   @end)
    

    (2)冒充(Posing)

         可以使子类冒充父类,可以方便的让父类表现成子类的实现。([FracitonChild poseAsClass [Fraction class]]; )
    

    缺点

    (1)不支持命名空间

    (2)不支持多继承

    6.Swift的优点

    (1)Swift简单

    (2)Swift更易于维护

    (3)Swift更加安全

    (4)Swift的内存管理是统一化的

    (5)Swift代码更少

    (6)Swift更快

    (7)开源项目中更少的名称冲突

    (8)Swift支持动态库

    (9)Swift Playgrounds 鼓励交互式编码

    1、面向对象和面向过程概念
    面向过程 = 注重业务功能实现。
    面向对象 = 注重功能的封装和层次,封装内部使用面向过程来实现。

    2、类定义(声明和实现)
    OC类分为两个文件,.h文件和.m文件。
    .h文件,@interface @end 声明函数;
    .m文件,@implementation @end 实现函数和方法;

    3、基本数据类型
    C 和 OC 可以互相兼容。
    C 和 OC Bool类型使用宏定义
    OC 特有 for( xx in xx)

    4、C和OC比较
    OC没有多继承,只有单继承。通过借用协议@protocol来实现多继承。

    5、import 和 include
    C和C++ 使用include.h来包含头文件,缺点会重复包含同一个头文件。
    OC使用import来包含头文件,只会包含一次相同的头文件。

    6、构造函数和析构函数和set/get属性实例方法
    构造函数用来初始化对象的方法,例如init方法。
    析构函数-(void)dealloc; 析构函数只能有一个。
    若同时重写了属性的setter与getter方法,则需要在类的.m文件中@synthesize 属性名 = _属性名; 。

    7、点语法
    其他语言向OC的转变; [self.array count]; 等同于 self.array.count; self.age = 100;等同于 [self setAge:100];
    编译器代码编译时转化成set/get方法。

    1. 类扩展和类目的区别?
      1.扩展无名字,类目有名字。
      2.类扩展可以为某个类增加额外的属性、成员变量、方法声明; 分类只能扩充方法,不能扩充成员变量,如果在分类中声明了一个属性,分类只会生成这个属性的get\set方法声明

    2.IBOutLet有什么作用,IBAction有什么作用,前缀IB是什么意思?
    1.被IBOutlet修饰的属性能拖线到storyboard中,而且只能修饰属性
    2.被IBAction修饰的方法能拖线到storyboard中,只能修饰方法返回值类型
    3.IB全称:Interface Builder

    3.instancetype和id的区别?
    1.都可以代表任意类型
    2.instancetype只能作为返回值
    3.id类型可以作为返回值,也可以作为参数,也可以定义变量
    4.instancetype会类型检测,id不会进行类型检测

    4.UIApplication常见功能?
    1.设置应用提醒数字
    2.设置连网状态
    3.设置状态栏
    4.跳转网页

    5.程序完整启动流程?
    1.执行Main
    2.执行UIApplicationMain函数
    3.创建UIApplication对象,并设置UIApplicationMain对象的代理.UIApplication的第三个参数就是UIApplication的名称,如果指定为nil,它会默认为UIApplication.UIApplication的第四个参数为UIApplication的代理
    4.开启一个主运行循环.保证应用程序不退出
    5.加载info.plist.加载配置文件.判断一下info.plist文件当中有没有Main storyboard file base name,里面有没有指定storyboard文件,如果有就去加载info.plist文件,如果没有,那么应用程序加载完毕

    6.Swift提供了三种不同的访问级别Public、Internal、Private?
    1.Public:可以访问自己模块或应用中源文件里的任何实体,别人也可以访问引入该模块中源文件里的所有实体。通常情况下,某个接口或Framework是可以被任何人使用时,你可以将其设置为public级别。
    2.Internal:可以访问自己模块或应用中源文件里的任何实体,但是别人不能访问该模块中源文件里的实体。通常情况下,某个接口或Framework作为内部结构使用时,你可以将其设置为internal级别。(默认级别)
    3.Private:只能在当前源文件中使用的实体,称为私有实体。使用private级别,可以用作隐藏某些功能的实现细节。

    7.private(set) 的意义?
    1.通过在属性前面使用 private(set) ,属性就被设置为默认访问等级的 getter 方法,但是 setter 方法是私有的。

    import和#include和@class的区别?

    1. include指令是c语言中原来就有的包含头文件的指令,会产生重复包含

    2. import会包含这个类的所有信息,包括实体变量和方法

    3. @class只是告诉编译器这是个类,至于这些类是如何定义的,暂时不用考虑

    OC的内存管理方式

    谁创建谁管理,谁引用谁释放。
    在ARC自动管理机制,不用使用retain/release来管理,交给自动释放池来管理,使用完后就到达了自动释放池的一个循环,就会去使对象引用计数减一,变成0后释放
    最后:对于交给自动释放池管理的对象,是在每个run loop事件循环结束时才会去使对象引用计数减一,此时引用计数为0的才会得到释放。

    5、浅拷贝与深拷贝的区别是什么
    浅拷贝就是指针拷贝(指向原有内存空间),而深拷贝是内容拷贝(有新的内存空间)。

    7、什么情况使用weak关键字,相比assign有什么不同?
    使用weak关键字的主要场景:
    • weak关键字只能用于对象,对于基本类型不能使用
    • assign既可以用于对象,也可以用于基本类型,但是只是简单地进行赋值操作而已

    8、@synthesize和@dynamic分别有什么作用

    @property有两个对应的词,一个是@synthesize,,另一个是@dynamic。
    参考答案:
    • @synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。
    • @dynamic告诉编译器:属性的setter与getter方法由用户自己实现,不自动生成。假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter 方法,编译的时候没问题,但是当程序运行到 instance.var = someVar,由于缺setter方法会导致程序崩溃;或者当运行到someVar = var 时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。

    9.介绍观察者模式
    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。一个对象的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
    1.在iOS中观察者模式的实现有三种方法:Notification、KVO以及标准方法。

    10.Struct与Class的区别

    1. struct作为数据结构的实现体,默认是public,class作为对象的实现体,默认是private。

    11.RunLoop的理解

    1. RunLoop,字面意思为循环圈,一直调度任务,有任务则调用,没有时侧休眠;
    2. 默认情况下:一个线程一次只能执行一个任务,执行完任务后就会退出线程。主线程执行完即时任务时会继续等待接收事件而不退出;
    3. 每一个线程都有其对应的RunLoop,只是默认只有主线程的RunLoop是启动的,其它子线程的RunLoop默认
      是不启动的,若要启动则需要手动启动;
      在一个单独的线程中,如果需要在处理完某个任务后不退出,继续等待接收事件,则需要启用RunLoop;
    4. 实质上,对于子线程的runloop默认是不存在的,因为苹果采用了懒加载的方式。如果我们
      没有手动调用[NSRunLoop currentRunLoop]的话,就不会去查询是否存在当前线程的RunLoop,也就不会去加载,更不会创建。

    12.设计模式有?
    单例设计模式、抽象工厂设计模式、MVC 模式、装饰器模式、观察者设计模式

    一、原子性和非原子性
    nonatomic 线程不安全适合内存小的移动设备;
    非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,默认为是atomic 提供线程安全;
    atomic 线程安全需要消耗大量的资源;
    设置成员变量的@property属性时,默认为atomic,提供多线程安全,在多线程环境下,原子操作是必要的,否则有可能引起错误的结果(就是防止同时对数据修改或访问)。

    atomic的意思就是setter/getter函数是一个原语操作。如果有多个线程同时调用setter的话,不会出现某一个线程在执行setter语句还未完成,另一个线程开始执行setter的情况,相当于函数头尾加了锁一样,可以保证数据的完整性。nonatomic不保证setter/getter的原语性,所以你可能会取到不完整的东西。因此,在多线程的环境下原子操作是非常必要的,否则有可能会引起错误的结果。
    在iOS开发中,几乎所有属性都声明为nonatomic。 一般情况下并不要求属性必须是“原子的”,因为这并不能保证“线程安全” ( thread safety),若要实现“线程安全”的操作,还需采用更为深层的锁定机制才行。例如,一个线程在连续多次读取某属性值的过程中有别的线程在同时改写该值,那么即便将属性声明为atomic,也还是会读到不同的属性值。因此,开发iOS程序时一般都会使用nonatomic属性。但是在开发 Mac OS X 程序时,使用atomic属性通常都不会有性能瓶颈。

    二、assign和copy
    assign通常用于础数据类型(NSInteger,CGFloat)和C数据类型(int, float, double, char等)使用,还有代理属性的修饰、xib、storyboard中拖出来属性。
    copy分为深拷贝与浅拷贝:
    1、浅拷贝,就是指只是将对象内存地址多了一个引用,也就是说,拷贝结束之后,两个对象的值不仅相同,而且对象所指的内存地址都是一样的。
    2、深拷贝,拷贝内容,就是指拷贝一个对象的具体内容,拷贝结束之后,两个对象的值虽然是相同的,但是指向的内存地址是不同的。两个对象之间也互不影响,互不干扰。

    三、多线程的使用
    1.GCD
    延迟执行:dispatch_after();
    一次性执行:static dispatch_once_t onceToken; dispatch_once (&onceToken,^{ });
    遍历:dispatch_apply(10,dispatch_get_global_queue{0,0},^(size_t index){});
    2.NSThread
    创建线程:NSThread * thread = [NSThread alloc]initWithTarget];
    启动线程:[thread start];
    获得主线程:+(NSThread*)mainThread;
    是否为主线程:-(BOOL)isMainThread;
    获得当前线程:NSThread * thread = [NSThread currentThread];

    OC常用关键字, enum register sizeof 基本数据类型所占字节书 struct typedef volatile break continue 中止某次循环 extern static 全局变量 union 声明共同体数据类型 const struct 声明结构体变量

    OC中浮点类型
    -float 有效数字为6-7位
    -double 有效数字是15-16位
    OC中id类型 格式化说明符:%p

    方法:方法是Objective-C独有的一种结构,只能在Objective-C中声明、定义和使用,C语言不能声明、定义和使用。

    方法
    1、类方法以+号开头,对象方法以-号开头
    2、在@interface和@end之间声明,在@implementation和@end之间定义
    3、类方法只能由类来调用,对象方法只能由方法来调用
    4、方法归类、对象所有
    5、方法声明和实现中用到的数据类型必须用()括住

    函数
    1、函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有
    2、函数调用不依赖于对象
    3、函数内部不能直接通过成员变量名访问某个对象的成员变量

    1、 tableview cell 有哪些方法?有些重用机制?
    答:numberOfSectionsInTableView,numberOfRowsInSection, cellForRowAtIndexPath等,cellForRowAtIndexPath有重用机制
    2、 Controller创建时系统自带的方法。
    答:不同的controller(如UItabBarcontroller,UItableViewcontroller)创建时会有不同的自带方法,不同的IOS SDK版本也会有差异,通常包括viewDidLoad,didReceiveMemorywarning;
    3、同步、异步加载
    答:同步加载一般指数据请求过程在主线程上,异步加载一般指数据请求过程在其他线程;两者的区别在于同步会阻塞主线程,影响UI执行,而异步不会。同步加载数据的返回实际容易掌握,异步加载数据的返回可能需

    1、 在interface中定义一个代理
    Property(assin) id<myProtocol> delegate;
    2、 各种变量修饰的意思
    const:
    static:
    assin:
    retain:
    copy:
    以上修饰需要分别查阅解释
    3、 宏定义
    define X 3.1415926
    4、 用代码实现一个多线程
    [NSThread detachNewThreadSelector:@selector(doWhat:) toTarget:self withObject:nil];
    5、 dowhile和whiledo的区别
    答:do while不管条件如何,肯定会被执行一次,C和OC没有while do方法,有while方法,while方法满足判定条件的时候会执行。
    6、 解释xml和json的含义
    答:需解释xml和json分别是什么,他们能做什么,然后他们的区别,详见PPT网络请求章节或查阅网络。
    7、 如何避免文件被icloud同步
    答:参阅http://blog.csdn.net/arthurchenjs/article/details/8538996
    8、自动释放池是如何工作的
    答:NSAutoReleasePool 会根据所辖区域内的变量是否被置为autorelease来确定是否要release变量,它会将被标记为autorelease的变量引用计数器减一

    1、 代理和通知的区别
    答:需描述两者的使用方法,代理需要protocol,通知需要通知中心,使用过程不同,代理需要委托方和被委托方,通知需要通知中心,发送通知和注册通知。
    2、 宏定义
    答:define X 3.14
    3、.O/.A/.DYLib都是什么文件?
    答:链接文件,静态库文件,动态链接库文件
    4、#import #class #includ 的用法
    答:搜索三者区别
    5、设置器和访问器
    答:分别写一个标准get和set
    6、代码题 特别长 有关 声明的 两个相同foo 方法 方法内 两条代码 第一条是 n++ 第二条是 @nslog(n = %d,n);

    相关文章

      网友评论

          本文标题:基础面试题

          本文链接:https://www.haomeiwen.com/subject/pzzbgttx.html