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.以及向对象添加非正式协议
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.以及向对象添加非正式协议