iOS:开发杂记(一)--Lang

------@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);

你可能感兴趣的:(iOS:开发杂记(一)--Lang)