------@class & #include & #import---------
--#include:用于对某文件的引用;
--#import:as an improved version of #include. Whether or not it's improved, however, is still a matter of debate. #import ensures that a file is only ever included once so that you never have a problem with recursive includes(避免了重复引用问题). However, most decent header files protect themselves against this anyway, so it's not really that much of a benefit.
--建议:to #import headers for Object-C things (like class definitions and such) and #include standard C stuff that I need。
--@class
1.只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,不用考虑。
2.在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类--里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件(感觉在m文件中import更体现封装性)。
3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。
4.如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。
----Importing headers in .h vs .m推荐规则(stackoverflow网站说法):
0.To the compiler, it really doesn't matter.区别在于.h中import可能会导致上文中说到的一些问题;
1.Only #import the super class, and adopted protocols, in header files.
2.#import all classes, and protocols, you send messages to in implementation.
3.Forward declarations for everything else.
备注:
1.编译出错,不识别某类的某属性:
// in ViewOwner.h #import "XXView.h" @interface ViewOwner : NSObject @property(nonatomic,strong)IBOutlet XXView *view; @end // in XXView.h @interface XXView : UIView @property(nonatomic,weak)IBOutlet ViewOwner *owner; @end 则会编译出错, 这些属性的申明 都会报错(不识别XXView 和ViewOwner)注意#import只是避免了 重复引用的问题,但是没解决这种循环引用的问题。
-------import/include angles、quotes---------
区别:
< >引用的是编译器的类库路径里面的头文件;
" "引用的是你程序目录的相对路径中的头文件。如果使用" ",(1步骤)它是会先在你项目的当前目录查找是否有对应头文件,如果没有,(2步骤)它还是会在对应的引用目录里面查找对应的头文件,例如在桌面上引用一个文件xx.h到工程(没有复制),项目里直接import "xx.h"就行。
如果通过上面的方式都找不到文件,则需要在Header search paths等路径里添加路径。
例子:(说明,xx.h在工程目录下的openssl文件夹中,group引用)
#import <Foundation/NSArray.h> //eg1 系统类库 foundation.framework/Headers/Foundation.h #import <Foundation/NSAutoreleasePool.h> #import <openssl/xx.h> //eg2 引用某个第三方库 + 必须在<strong>Header search paths里面添加 openssl文件夹所在的目录,</strong>否则会报错 include "xx.h" //相对引用,没有问题,在(2步骤)找到 include "openssl/xx.h" //相对应用,没有问题,在(1步骤)找到 include "dd/xx.h" //xx.h 找不到备注:这个跟 group vs file reference里引用资源文件区别有点不一样,后者是对资源文件而言,对于代码文件来说,只有group才能使用代码文件,俩着对于它没有区别一说。
-------Cocoa概念:是苹果公司为Mac OS X所创建的原生面向对象的API,是Mac OS X上五大API之一(其它四个是Carbon、POSIX、X11和Java)。
----init vs initWithCapacity:如果知道最大需要的容量,那么就使用initWithCapacity。好处就是当元素个数不超过容量时,添加元素不需要重新分配内存(Mutable arrays expand as needed; numItems simply establishes the object’s initial capacity);