# iOS面试题

  • 1、fmdb
    1>有三个主要的类
    1.FMDatabase – 表示一个单独的SQLite数据库。 用来执行SQLite的命令。
    2.FMResultSet – 表示FMDatabase执行查询后结果集
    3.FMDatabaseQueue – 如果你想在多线程中执行多个查询或更新,你应该使用该类。这是线程安全的。
    2>创建FMDatabase对象时参数为SQLite数据库文件路径。该路径可以是以下三种之一:
    1..文件路径。该文件路径无需真实存,如果不存在会自动创建。
    2..空字符串(@”")。表示会在临时目录创建一个空的数据库,当FMDatabase 链接关闭时,文件也被删除。
    3.NULL. 将创建一个内在数据库。同样的,当FMDatabase连接关闭时,数据会被销毁。
    3> 打开数据库
    在和数据库交互 之前,数据库必须是打开的。如果资源或权限不足无法打开或创建数据库,都会导致打开
    4>常用命令
    SELECT、CREATE, UPDATE, INSERT,ALTER,COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE (等)
    只要不是以SELECT开头的命令都是UPDATE命令。执行更新返回一个BOOL值。YES表示执行成功,否则表示有那些错误 。你可以调用 -lastErrorMessage 和 -lastErrorCode方法来得到更多信息。
    5> 执行查询
    SELECT命令就是查询,执行查询的方法是以 -excuteQuery开头的。执行查询时,如果成功返回FMResultSet对象, 错误返回nil. 与执行更新相当,支持使用 NSError**参数。同时,你也可以使用 -lastErrorCode和-lastErrorMessage获知错误信息。
    6>结果参数
    FMResultSet 提供了很多方法来获得所需的格式的值:
    intForColumn:
    longForColumn:
    longLongIntForColumn:
    boolForColumn:
    doubleForColumn:
    stringForColumn:
    dataForColumn:
    dataNoCopyForColumn:
    UTF8StringForColumnIndex:
    objectForColumn:

  • 2、添加表字段的sql语句怎么写
    1、判断表是否打开
    2、判断表中是否存在当前的一个或者多个字段
    3、如果不存在添加字段

    20150928181202620.jpeg

  • 3、面向对象的理解
    面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。面向对象最基础的概念就是「类」和「对象」,并将其作为程序的基本单元,并拥有「封装」、「抽象」、「继承」、「多态」的特性。
    面向对象编程能够更方便地实现一些通过面向对象分析设计的需求,可以很方便将某些现实事物转化成更简洁的代码去实现,

  • 4、oc多态的理解,
    多态是指子类可以替换父类,在运行时调用子类的实现,
    不同对象以自己的方式响应相同的消息的能力叫做多态。
    二、在Objective-C中如何实现多态

在Objective-C中是通过一个叫做selector的选取器实现的。在Objective-C中,selector有两个意思, 当用在给对象的源码消息时,用来指方法的名字。它也指那个在源码编译后代替方法名的唯一的标识符。 编译后的选择器的类型是SEL有同样名字的方法、也有同样的选择器。你可以使用选择器来调用一个对象的方法。

选取器有以下特点:

  • 所有同名的方法拥有同样的选取器

  • 所有的选取器都是不一样的

(1) SEL和@selector

选择器的类型是 SEL。@selector指示符用来引用选择器,返回类型是SEL。

例如:

SELresponseSEL;

responseSEL =@selector(loadDataForTableView:);

可以通过字符串来得到选取器,例如:

responseSEL =NSSelectorFromString(@"loadDataForTableView:");

也可以通过反向转换,得到方法名,例如:

NSString*methodName =NSStringFromSelector(responseSEL);

(2) 方法和选取器

选取器确定的是方法名,而不是方法实现。这是多态性和动态绑定的基础,它使得向不同类对象发送相同的消息成为现实;否则,发送 消息和标准C中调用方法就没有区别,也就不可能支持多态性和动态绑定。

另外,同一个类的同名类方法和实例方法拥有相同的选取器。

(3) 方法返回值和@参数类型

消息机制通过选取器找到方法的返回值类型和参数类型,因此,动态绑定(例:向id定义的对象发送消息)需要同名方法的实现拥有相 同返回值类型和相同的参数类型;否则,运行时可能出现找不到对应方法的错误。

有一个例外,虽然同名灶方法和实例方法拥有相同的选取器,但是它们可以有不同的参数类型和返回值类型。

  • 5、oc的动态特性
    OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载。之所以叫做动态,是因为必须到运行时(run time)才会做一些事情。
    1)动态类型
    动态类型,说简单点就是id类型。动态类型是跟静态类型相对的。像内置的明确的基本类型都属于静态类型(int、NSString等)。静态类型在编译的时候就能被识别出来。所以,若程序发生了类型不对应,编译器就会发出警告。而动态类型就编译器编译的时候是不能被识别的,要等到运行时(run time),即程序运行的时候才会根据语境来识别。所以这里面就有两个概念要分清:编译时跟运行时。

(2)动态绑定
动态绑定(dynamic binding)貌似比较难记忆,但事实上很简单,只需记住关键词@selector/SEL即可。先来看看“函数”,对于其他一些静态语言,比如c++,一般在编译的时候就已经将将要调用的函数的函数签名都告诉编译器了。静态的,不能改变。而在OC中,其实是没有函数的概念的,我们叫“消息机制”,所谓的函数调用就是给对象发送一条消息。这时,动态绑定的特性就来了。OC可以先跳过编译,到运行的时候才动态地添加函数调用,在运行时才决定要调用什么方法,需要传什么参数进去。这就是动态绑定,要实现他就必须用SEL变量绑定一个方法。最终形成的这个SEL变量就代表一个方法的引用。这里要注意一点:SEL并不是C里面的函数指针,虽然很像,但真心不是函数指针。SEL变量只是一个整数,他是该方法的ID。以前的函数调用,是根据函数名,也就是字符串去查找函数体。但现在,我们是根据一个ID整数来查找方法,整数的查找字自然要比字符串的查找快得多!所以,动态绑定的特定不仅方便,而且效率更高。

(3)动态加载
根据需求加载所需要的资源,最基本就是不同机型的适配

  • 6、week的底层原理
    1> runtime维护了一个弱引用表,将所有弱引用obj的指针地址都保存在obj对应的weak_entry_t中。
    2> 初始化时,runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象地址添加引用时,objc_initweak函数会调用objc_storeWeak函数,作用是更新指针指向,创建对应的弱引用表。
    3> 释放时,通过dealloc函数逐层判断,最终调用clearDeallocating函数,首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把对应的数据清空置为nil 。同时,将weak_entry_t移除出弱引用表weak_table。

当我们对一个对象进行弱引用时,底层是通过runtime来支持的,在底层会调用runtime的objc_initWeak函数

  • 7、常用修饰符
    在MRC下常用修饰符:
    assign/ retain/ copy/ readwrite、readonly/ nonatomic、atomic 等。
    在ARC下常用修饰符:
    assign/ strong/ weak/ copy/ readwrite、readonly/ nonatomic、atomic 等。

  • 8、原子和非原子
    1> atmoic:原子属性,为系统默认的属性,会为修饰的成员变量的setter方法自动加锁(自旋锁),使得线程安全,但较为消耗资源,效率相对低些。是一种单写多读的多线程技术,可能出现脏数据。
    2> nonatomic:非原子属性,开发中最常用的属性,不会为修饰的成员变量的setter方法加锁,虽然线程不安全,但效率高
    3> 在原子性中,最为核心的机制,便是锁的机制。通过锁的机制,可以保证线程的安全性,保证成员变量的安全性,这是我们选择才不采用原子性最主要考虑的方面

  • 9、内存的划分


    image.png
  • 10、内存管理
    MRC:Manual Reference Counting 手动引用计数器,需要我们手动管理对象引用计数器的值
    ARC:Autimatic Reference Counting 自动引用计数器,系统自动的改变对象引用计数器的值(iOS5之后),ARC是基于MRC的
    新创建一个对象,这个对象的引用计数器的值为1,有对象的创建,就需要匹配一个release,是谁来负责retain的,谁就要负责release,使用的时候retain,不是用的时候releaseretain的次数要和release次数想匹配,有加有减,做到平衡

参考文章:
FMDB数据库升级增加表字段
iOS 多态

你可能感兴趣的:(# iOS面试题)