常见OC面试题

1. 谈谈你对MVC的理解?
       MVC是一种设计模式, 这种设计模式用于分离代码的不同模块, 用于提高代码的健壮性和复用性。  


       M:Model 指的程序的数据相关。如果以游戏为例:model可以用于描述游戏角色的攻击力、杀伤力、血量!   


       V:View 凡是在界面上看到的内容都是View.换句话说:就是显示具体的内容。   


       C:Controller 如果M和V之前有过多的关联, 那么一定会影响代码的复用性。 如果要有好的复用性, 就必须让代码模块之间具备很好的独立性。但是它们之前还是有要联系的,Controller就是起到这样一个中间协调的作用。Controller也是需要处理一些业务逻辑,然后根据业务逻辑来改变Model和View;   




2. \#import 跟\#include 的区别是什么? \#import<> \#import""的区别是什么?@class的作用是什么?


   ```
   这两个指令,都是预处理指令,都是在预处理阶段来执行。功能都是用于包含代码的头文件。单独使用\#include,会出现重复包含头文件的问题。 为了解决重复包含的问题, C语言提供了头文件卫士的预处理指令。#import这个预处理指令,内部解决了重复包含头文件的功能。  
   * \#import<> 是用于包含系统的头文件   
   * \#import"" 是用于包含工程内自定义的头文件   
   * @class 的作用是前向声明,主要是当一个类, 只是要知道另外一个类的描述信息, 可以使用前向声明,来表这个意思。
   
   ```
   
3. 什么是浅拷贝?什么是深拷贝?它们的区别是什么?

浅拷贝仅仅是拷贝了指针, 就是新的指针指向的还是同一块内存空间。深拷贝是重新向操作系统申请了相同的内存,并把原来的所有数据复制一份。浅拷贝相当于对于原指针的引用计数加了1.深拷贝的主要区别, 重新分配了内存空间,真正意义存在了两个对象。实际,深拷贝是我们一般情况理解的拷贝。


4. id声明的对象有什么特性? 


id 是一种通用的指针类型,可以指向任意的数据对象类型。通俗的理解,可以认为它是万能指针。最大的特性是具有动态特性。需要注意的是, 使用id声明对象的时候, 不要再加*号了。




5. 手动管理内存的基本原则什么?在使用@property的时候, 如何避免内存泄漏?


如果我使用了new , alloc 或者copy方法获得一个对象,则我必须释放或自释放该对象。
如果你对对象调用了retain消息,那么你必须负责释放(release)这个对象,保证retain和release的使用次数相等。

在使用@property的时候, 如果用到retain copy关键字, 那么在初始对象的时候,不要使用点语法, 然后如果是手动管理内存, 则必须override dealloc方法, 并且在dealloc方法里释放该成员变量,如果是ARC环境, 则必须在dealloc方法将该成员变量指针置nil.


6. 在iOS平台里,出现过nil ,Nil ,NULL, NSNull 它们分别表达的意思是什么?有什么区别?
 
  NULL:定义在#include <stddef.h>  #define NULL (void*)0  所以NULL的本质就是((void*)0)
  Nil: 在系统的定义里:   
\#ifndef Nil   
\# if __has_feature(cxx_nullptr)   
\#   define Nil nullptr   
\# else   
\#   define Nil __DARWIN_NULL   
\# endif   
\#endif   
实际在Objective-C语言里__DARWIN_NULL的定义是 #define __DARWIN_NULL ((void *)0)   
结论:Nil的本质也是 ((void *)0)   
nil: 在系统的定义里:   
\#ifndef nil  
\# if __has_feature(cxx_nullptr)  
\#   define nil nullptr   
\# else   
\# define nil __DARWIN_NULL   
\# endif   
\#endif 

NSNull:本质上就Objective-C的一个类。其定义:      


@interface NSNull : NSObject <NSCopying, NSSecureCoding>


+ (NSNull *)null;


@end
  


NULL 用于表示C语言指针中的空值。
nil 用于表示Objective-C语言里对象的空值。
Nil 用于表示Objective-C语言类类型(Class)值为空的情况。


总结:不管是NULL 、Nil 、nil它们的本质都是一样的((void*)0),只是写法不同, 这样做意义是为了区分不同的数据类型,增强代码的可读性。举个例子:当你一看到一个变量赋值为NULL,实际上一下子就能明白, 这个变量是C语言里定义的指针类型。当看到nil的时候, 就能知道这个变量是Objective-C的对象指针。。。


7. 什么是类别?类别的主要作用是什么, 请列出三点。


类别是一种为现有的类添加新方法的方式。可以为任何类添加新的方法,包括那些没有源代码的类。
类别的主要作用:1.将类的实现代码分散到多个不同文件或框架中 2.创建对私有方法的前向引用 3.以及向对象添加非正式协议
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值