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网站说法):
- To the compiler, it really doesn’t matter.区别在于.h中import可能会导致上文中说到的一些问题;
- Only #import the super class, and adopted protocols, in header files.
- #import all classes, and protocols, you send messages to in implementation.
- 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               //eg1 系统类库  foundation.framework/Headers/Foundation.h
#import 

#import     //eg2 引用某个第三方库  +  必须在Header search paths里面添加 openssl文件夹所在的目录,否则会报错

include "xx.h"             //相对引用,没有问题,在(2步骤)找到
include "openssl/xx.h"     //相对应用,没有问题,在(1步骤)找到
include "dd/xx.h"          //xx.h 找不到

备注:这个跟group vs file reference里引用资源文件区别有点不一样,后者是对资源文件而言,对于代码文件来说,只有group才能使用代码文件,俩着对于它没有区别一说。

init vs initWithCapacity(Mutable)

  • 如果知道最大需要的容量,那么就使用initWithCapacity。好处就是当元素个数不超过容量时,添加元素不需要重新分配内存(Mutable arrays expand as needed; numItems simply establishes the object’s initial capacity);
  • init 它容纳对象个数是默认的。

只读属性处理

实现public readonly,private readwrite的property:在h头文件中定义一个属性对外是readonly的,在m源文件中的@interface部分重新定义此属性为readwrite,此时此属性对外是只读的,对内是读写的。

你可能感兴趣的:(iOS,iOS.General)