标签:
1./#import 和 /#include 的区别是什么? #import<> 和 #import" " 的区别是什么?
他们都属于预处理指令,其功能都是包含头文件,但是#import 避免了头文件重复包含问题,如果在使用#include 的时候,需要加入头文件卫士的预处理指令,#ifndefine #define #endif ,如果使用了 #import 就意味着不需要加入头文件卫士即可以实现不重复包含的功能。
#import <> 其功能是包含头文件的时候,首先从系统目录开始查找,主要用法是用于包含系统框架的头文件。
#import “ ” 其功能是包含头文件的时候,首先在工程的当前目录下开始查找,如果找不到的话,就从系统目录开始找,其主要用法是用于包含自定义的头文件。
2.id声明的对象有什么样的特性?
id 是一个指向oc 对象的指针类型,称其为万能指针。通俗的理解:就是可以指任何oc 的对象,当他指向任意的对象的时候,在运行时表现的具体的对象,这一点说明它具有在动态的特点。需要注意的是,在使用id 类型的时候,不要在 id 后加*,因为其本身就是指针类型。
3.手动管理内存的基本原则是什么?使用@property 的时候如何避免内存泄露?
如果使用new copy alloc 方法创建的对象,其引用计时器为1,那么我们就需要负责释放这个对象release。
如果使用retain这样的方法,让对象的引用计数器+1,我们就需要调用release方法释放这个对象,必须保证retain 和 release方法成对出现。
如果使用了@property,在手动管理内存的时候,如果在@property 声明的时候,用到 retain 和copy 关键字,那么在初始化对象的时候,不要使用点语法,直接使用成员变量的名字,同时需要复写 dealloc 方法,在dealloc 方法里,需要释放该成员变量。如果是ARC 环境,则需要在 dealloc方法里,将成员变量指向nil.
4.iOS 平台,出现nil,Nil,NULL,NSNull, 从字面意思上来看,他们都表示空,但是他们真正的意思是什么?分别有什么区别?
#define __DARWIN_NULL ((void *)0)
#ifndef NULL
#define NULL __DARWIN_NULL
#endif /* !NULL */
#ifndef Nil
# if __has_feature(cxx_nullptr)
# define Nil nullptr
# else
# define Nil __DARWIN_NULL
# endif
#endif
#ifndef nil
# if __has_feature(cxx_nullptr)
# define nil nullptr
# else
# define nil __DARWIN_NULL
# endif
#endif
@interface NSNull : NSObject <NSCopying, NSSecureCoding>
+ (NSNull *)null;
@end
5 .深拷贝和浅拷贝有什么区别? 浅拷贝其本质, 仅仅将对象指针复制了一份, 也就是内存还是原来的内存。深拷贝:重新向系统申请了内存,并把原来的数据全部按照深拷贝的方式复制了一份,浅拷贝在手动管理内存的模式下, 相当于引用计数器加了1。他们的主要区别就在于深拷贝重新分配了内存, 深拷贝是我们一般情况下理解的复制。
标签:
原文地址:http://www.cnblogs.com/zhaozhengshi/p/4744901.html