OC基础理论知识整理

1. import的作用

答: 预处理指令#import能将头文件中的内容导入代码中, 与C语言的#include指令类似, 但区别在于#import能确保不会重复导入同一个头文件.


2. 说一下面向对象, 面向对象有哪些特性, 分别说一下

答: 面向对象编程(OOP)是以事物为中心, 赋予某事物特定的属性以及行为, 按照"某事物执行某个行为"的思考方式来编程, 在行为中定义如何实现该行为的具体方法, 而该事物本身并不关心该行为的实现过程, 只求结果.

在解决某问题时, 面向过程语言注重的是解决该问题的步骤, 而面向对象语言注重的是哪些对象能够解决这个问题.

面向对象编程更贴近现实生活中人类的思维方式.


3. OC方法与C函数的区别

答: OC方法在@interface中声明, 在@implementation中实现, 依托于类而存在, 没有了类也就没有了方法.

C函数是实现某程序功能的代码块, 归定义这个函数的文件所有, 和OC的类没有关系.

OC方法可以访问类中的成员变量, 而C函数不能访问类的成员变量.


4. OC对象方法与OC类方法的区别

答: 类方法的接收者必须是类, 对象方法的接收者必须是对象, 主要的区别就在于消息接收者不同.


5. self与super的用法

答: 在定义类的某个方法时, 如果要调用该类的其他方法, 可以用self来作为消息接收者; 如果要访问父类的某个方法, 用super来作为消息接收者.

如果某方法中使用到self关键字, 那么谁调用这个方法, self就代表谁.

super的含义是执行当前对象所属类的上一级父类的某方法.


6. 成员变量的作用域@private @protected @public @package

答: 定义为@private的成员变量只能被所属类的方法访问, 不能被子类的方法访问, 也不能被外部变量访问;

定义为@protected的成员变量能被所属类及其子类的方法访问, 不能被外部变量访问;

定义为@public的成员变量能被所属类及其子类的方法访问, 也能被外部变量访问;

定义为@package的成员变量能被处在同一框架中的方法访问(???).


定义在@interface中的成员变量默认是@protected型, 也可以将成员变量定义在@implementation中, 此时默认的就是@private类型了.


7. 重写description方法的作用

答: description方法有两个, 一个是类方法, 一个是对象方法, 类方法默认输出的内容是类名, 对象方法默认输出的是对象所属类的类名以及对象的内存地址. 通过重写description, 程序员可以自定义该方法的输出内容, 比如可以一次性输出某个对象的所有成员变量值.


8. 说一下万能指针, 点语法

答: id又称万能指针类型, 声明为id的指针变量可以指向任何类的对象, 这也是多态的一个表现形式.

点语法用于访问类的成员变量, 使用点语法实际上就是在调用某成员变量的set和get方法, 如果点语法出现在赋值运算符"="的左边, 则调用的是set方法, 其余情况均为调用get方法.


9. @property与@synthesise的用法

答: 旧版的编译器支持@property和@synthesize用法, 在@interface中使用@property声明一个成员变量, 然后在@implementation中使用@synthesize为这个变量自动生成set和get方法.


10. .h和.m文件的分工

答: .h文件用于保存类的@interface部分, 里边包括成员变量和方法的声明, 最新版的编译器中, 成员变量的声明和set/get方法实现都保存在.h文件中.

.h文件还能用于保存分类的@interface部分, 此外, 也能保存协议(protocol)内容.

.m文件用于保存类的@implementation部分, main.m文件中保存的是main函数和其他函数.


11. 内存管理的管理范围, 原理, 原则, 体现在哪些方面

答: 内存管理的管理范围主要是任何继承了NSObject的对象, 不包括基本数据类型.

每一个OC对象, 其内部都有一个引用计数器, 记录该对象被引用的次数, 对象被创建时(alloc, copy和new方法), 该计数器的默认初始值为1.

每个类都有两个对象方法retain和release, 可以使用它们来增加或者减少引用计数器的值, retain为+1, release为-1. 当一个对象的引用计数器的值减为0时, 系统将自动调用-dealloc方法销毁该对象, 回收其所占用的内存空间.

在没有ARC辅助的情况下, 为了避免内存资源的浪费, 程序员应当手动管理内存, 每当对象被一个新的变量引用时, 对该变量执行retain; 反之, 每当引用的变量减少一个, 就执行一次release.

通常, retain方法都被整合入成员变量的set方法中, 此外还要重写-dealloc方法, 在其中添加-release语句. 而且主程序代码中, 每一次调用alloc, copy 和new创建新对象时, 都应在程序结束前对该对象执行一次release, 确保内存能够正确的回收释放.

-retainCount方法返回对象当前的引用计数器的值.

-autorelease方法能将调用它的对象置入系统的自动释放池中, 一旦释放池被系统销毁, 那么该对象就执行一次releas操作. 这样就省去了在程序结尾处调用release的步骤.



12. @property的参数有哪些, 他们的作用分别是什么?

答: @property的常用参数有

1) retain, copy, assign:

retain的作用是自动生成带-retain方法的set方法, 成员变量是对象时使用该参数;

copy的作用是成员变量的set方法中调用copy方法, 其所指向的是原对象的一个副本, 即一个新的对象, 该参数通常用于对象类型的成员变量;

assign的作用是不在set方法中调用retain方法, 直接对成员变量进行赋值, 通常用于基本数据类型的成员变量.

2) nonatomic 和 atomic:

atomic参数是为了保证线程安全;

nonatomic不保证线程安全, 但是运行的效率更高.

3) readwrite, readonly:

readwrite参数表明该成员变量可被读取和修改;

readonly参数表示该成员变量是只读的.

4) strong, weak:

strong表示该成员变量是一个指向某对象的强指针;

weak表示该成员变量是一个指向某对象的弱指针;

强弱指针是配合ARC来使用的, ARC中规定, 一个对象如果没有被任何强指针引用, 该对象将被系统销毁, (即使有被弱指针指向也会被销毁, 注意野指针的出现);

弱指针主要应用在循环引用的场合, 因为如果循环引用的两个对象都使用的是强指针, 那么他们将永远都不能被系统销毁, 当一强一弱时就能改变这种情况.

5) getter = , 和setter = set...:

主要是用来自定义get和set方法的方法名的, 很少用到.


13. autorelease的作用, 好处, 注意

答: autorelease方法能将对象置入系统的自动释放池中, 当自动释放池被系统销毁时, 该对象将自动执行一次release.

autorelease本身不会对引用计数器进行任何操作.

使用autorelease后, 程序员就不需要再在程序结尾手动执行一次release了, 也避免出现在程序结尾的release之后对对象执行操作的失误.


14. 什么是分类(category)?分类与继承的区别

答: 有的时候, 再不改变一个类的源文件内容, 或者无法访问一个类的源文件的情况下, 如果我们想给这个类增加一些额外的方法, 就可以使用分类(category).

分类是对原类的一种方法的扩展, 分类中不能定义新的成员变量.

分类与继承的区别在于, 分类仍属于原类的一部分, 而继承是指子类与父类的关系, 但两者本质上仍属于两个不同的类,.


15. 说一下什么是协议(protpcol)? 以及其中协议中的两个关键字?

答: 协议(protocol)是一个方法列表, 当一个类声明其遵守一个协议时, 这个类就拥有了该协议中的全部方法的定义. 方法的具体实现仍需另外编写.

protocol的两个关键字是@required和@optional, 其中@required表示其后的方法是必须实现的, @optional表示其后的方法可以不用实现.

方法默认是@required类型.


16. 说一下你对代理的理解

答: 对象甲想要完成一件事情, 但是他不具备完成这件事情的能力, 因此甲想要委托对象乙代为完成, 于是甲起草了一份协议, 乙声明遵守这份协议后, 乙便成为甲的代理. 这就是代理模式.


17. block的作用, 与函数有什么异同

答: block的定义格式如下:           返回值类型 (^ BLOCK名称)(形参类型列表) = ^ (实参及类型列表){  代码块....  };

block的作用是可以封装一段实现某功能的代码, 可以在任何时候调用, 并且能提高程序的执行效率; block可以作为函数的参数或者返回值, 其本身也可以有参数和返回值

block与函数的区别是, block是程序运行时动态生成的, 且具有作用域的特点, 超出作用域范围则自动销毁; 而函数是在编译时生成的, 程序运行时即使不被调用, 函数也是存在于内存中的.


18. @class与#import有什么区别

答: #import会将一个头文件的内容导入代码中, 而@class仅仅是提示编译器其所声明的内容是一个类的名称.


19. 常用的结构体有哪些?

答: OC中常用的结构体有四种: NSRange, NSPoint(CGPoint), NSSize(CGSize), NSRect(CGRect).


20. 常用的类以及集合

答: 常用的类有NSString, NSMutableString, NSArray, NSMutableArray, NSNumber, NSValue, NSDate;

常用的集合有NSSet, NSMutableSet, NSDictionary, NSMutableDictionary, 数组和可变数组也属于常用集合类.


21. copy与retain的区别?

答: OC中的复制分为浅复制和深复制两种:

retain属于浅赋复制, 效果是原对象引用计数器+1, 在ARC之前, 用于手动管理对象内存;

copy又分为copy和mutableCopy:

其中, copy对于不可变对象(例如NSString, NSArray, NSSet, NSDictionary等等)的复制属于浅复制, 原对象引用计数器+1, 仅仅是指针拷贝;

而对于可变对象(上述对象的mutable子类), copy执行的是深复制, 复制结果是一个不可变对象, 原对象引用计数器不变;

mutableCopy对于任何对象(可变或不可变)都执行深复制, 原对象引用计数器不变.


22. 集合中排序有哪些方式?

答: 数组和可变数组是按照索引来排序的, 而set和dictionary都是乱序, 其中dictionary中保存的是键值对, 按"键"取"值".


23. 遍历集合有几种方式?分别说一下

答: NSSet的遍历方式有两种: 

1) 调用-allObjects方法, 返回一个包含所有set元素的NSArray数组, 然后利用for循环和索引值依次输出各元素;

2) 利用-enumerateObjectsUsingBlock:方法来进行遍历.

NSDictionary的遍历方式与NSSet有相同之处:

1) 调用-allKeys方法, 返回一个包含所有key元素的NSArray数组, 然后利用for循环和索引值依次输出每个key及其对应的值;

2) 利用-enumerateKeysAndObjectsUsingBlock:方法进行遍历

NSArray的遍历也类似

1) 传统的for循环+索引遍历

2) 利用-enumerateObjectsUsingBlock:


24. NSValue与NSNumber的区别

答: NSNumber用于将基本数据类型包装成对象, NSValue用于将4种常用的OC结构体包装成对象, 似乎也可以包装自定义的结构体???

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值