iOS面试之OC基础篇(一)

1.方法和选择器有何不同?

  • selector是一个方法的名字,method是一个组合体,包含了名字和实现;

2.core Foundation的内存管理

  • 凡是带有Create、Copy、Retain等字样的函数,创建出来的对象,都需要在最后做一次release
  • 比如CFRunLoopObserverCreate release函数:CFRelease(对象);

3.malloc和New的区别

  • new是C++中的操作符,malloc是C中的一个函数
  • new不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数
  • 内存泄漏对于malloc或者new都何以检查出来的,区别在于new可以指明是哪个文件的哪一行,而malloc没有这些信息
new和malloc效率比较
  • new可以认为是malloc加构造函数的执行
  • new出来的指针是直接带类型信息的

4.OC中额反射机制?简述概念和使用

class反射
  • 通过类名的字符串形式实例化对象
Class class NSClassFromString@(@"student");
Student *stu = [[class alloc] init];
  • 将类名变为字符串
Class class = [Student class];
NSString *className = NSStringFromClass(class);
SEL的反射
  • 通过方法的字符串形式实例化方法
    SEL selector = NSSelectorFromClass(@"setName");
    [stu performSelector:selector withObject:@"Mike"];
  • 讲方法变成字符串
    NSStringFromSelector(@selector*(setName:));

5.什么是SEL?如何声明一个SEL?通过哪些方法能够调用SEL包装起来的方法?

  • SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址找到方法地址就可以调用方法。在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型烦人数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。
SEL s1 = @selector(test1);//将test1方法包装成SEL对象
SEL s2 = NSSelectorFromString(@"test1");//将一个字符串方法转换成SEL对象
#####调用方法有两种方式:
* 1.直接通过方法名来调用[person text]
* 2.间接的通过SEL数据来调用 SEL aaa = @selector(text);
[person performSelector:aaa];

####6.协议中是什么意思?子类继承了父类,那么子类会遵守父类中遵守的协议吗?协议中能够定义成员变量?如何约束一个对象类型的变量要存储的地址是遵守一个协议对象?
* 遵守协议
* 会
* 能,但是只在头文件中声明,编译器是不会自动生成实例变量的,需要自己处理getter和setter方法
* id

####7.NS/CF/CG/CA/UI这些前缀分别是什么含义
* NS代表函数归属于 cocoa Fundation框架
* CF代表函数归属于core Fundation框架
* CG代表函数归属于CoreGraphics.frameworks框架
* CA代表函数归属于CoreAnimation.frameworks框架
* UI代表函数归属于UIKit框架

####8.面向对象都有哪些特征以及你对这些特征的理解
* 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
* 封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。我们在类中编写的方法就是对实现细节的一种封装;
我们编写一个雷就是对数据操作的封装。可以说,封装就是隐藏一切可以隐藏的东西,只是对外界提供最简单的编程接口;
*多态:多态是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情,多态分为编译时的多态性和运行时的多态性。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1. 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2. 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。
* (抽象):抽象是将一类对象的共同特征总结出来构造类的过程,包含数据抽象和行为抽象两方面。抽象值关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

####9.Objective-C是动态运行时语言是什么意思?(When we call objective c is runtime language what does pitman?)
* 主要是将数据类型的确定由编译时,推迟到运行时。这个问题其实浅涉及到两个概念,运行时和多态;
* 简单来说,运行时机制是我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法;
* 多态:不同对象一自己的方式响应相同的消息的能力叫做多态;
* 意思是假设生物类(life)都拥有一个相同的方法-eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法,也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。因此,运行时机制是多态的基础。









你可能感兴趣的:(iOS面试之OC基础篇(一))