一、扩展名
C源文件 .cC++源文件 .cc或.cpp
OC源文件 .m
OC++源文件 .mm
头文件 .h
编译后的文件 .o
二、#import和#include区别
两个指令的作用都是:将指定文件的内容, 在预编译的时候, 拷贝到写指令的地方。#import指令
#import指令同一个文件,无论被#import多少次,在预编译的时候 只会包含1次。
#import指令的底层会自动判断这个文件是否被包含, 只有没有被包含的时候才会包含。
#include指令
#include指令要防止重复包含,需要配合预编译执行来实现。
#import ""
包含用户自定义; 会先在当前源文件目录下查找,如果没有的话再去Xcode编译器中找
#import <>
包含系统的文件;直接去Xcode编译器中找
三、框架
把不同的功能模块,放在一个类中,多个相关的类去解决特定的问题,一个完整的框架需要有多个类。第一方框架:苹果公司;第二框架:我们;第三方框架:其他专门人员
四、“@”的使用方法
@" " 字面的字符串对象@数字 字面的数字对象
@‘字符’ 字面的字符对象
@标识符 在OC中大部分的关键字都是以@开头的,比如@interface,@implementation,@end
五、函数
函数可以在任意地方定义,但是不能直接引用类的成员变量,因为函数不依赖于类,要引用类的成员变量只能通过参数传入
六、方法中的冒号
没有冒号 代表没有参数有冒号 代码有参数,有多少个冒号就代表有多少个参数
方法的声明和实现,都必须以 + 或者 - 开头
+表示类方法(静态方法)
-表示对象方法(动态方法)
在.h中声明的所有方法作用域都是public类型, 不能更改。
七、成员变量
在类接声明@interface中,用于声明成员变量的花括号{}前不能声明方法或者函数;在实现文件@implementation中,也可以用花括号{}声明成员变量。
类方法中不能使用实例变量,即不能给实例变量直接赋值,因为实例变量没有分配空间。
八、万物皆对象
九、访问对象的属性可以用:
对象->对象成员; (注意声明属性为@public)对其中一个对象的成员进行了修改, 和其他的对象没有关系 。
补充:
1、消息和方法
因为对象独立于使用者,也因为一些实现了面向对象概念的早期语言的语法,术语“发送消息”用于描述执行对象的行为。对象行为的名称(或者原型)被称作消息(message)。
一个消息是一个方法的名字连同方法需要的参数名字,发送一个消息,运行需要一个消息表达式,每个消息表达式放在方括”[ ]”号里。
当你想要调用方法,你可以传递一个消息给这个对象来实现,发送给对象的参数都会被动态的分配,这样可以促进类的多态(多态指的是不同类型的对象回应同一个消息)有时一个方法的调用被一个类的超类(父类)的对象来接受消息。
2、数组NSArray中alloc init和array区别
使用alloc init初始化数组,需要手动release
使用array初始化数组,不需要手动release,使用autoreleasepool机制
3、new和alloc区别
[Person new]基本等同于[[Person alloc] init];区别只在于alloc分配内存的时候使用了zone,zone在给对象分配内存的时候,会把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度。
把alloc和init好处:可以调用多种不同的init方法
4、NSMutableSet
NSMutableSet如果添加了相同的对象,后面的对象会覆盖前面的对象,可以用可变字符串验证。
5、atomic与nonatomic区别
atomic是线程安全的,nonatomic是线程不安全的;如果只是单线程操作的话用nonatomic最好,因为后者效率高一些。
6、编译器
Xcode3所使用的编译器是gcc编译器,而在Xcode4之后的版本中,Xcode所使用的编译器已经替换成为新的LLVM编译器。LLVM编译器的前端是clang。
7、属性和成员变量区别
成员变量用于存储对象的各种值。
属性指的是给对应的成员变量取值或赋值的方法总称。
9、继承和复合的选择
是(is a)即(是一个)的关系时,用继承
是(has a)即(有一个)放入关系时,用复合
10、继承链
在继承中查找方法:先找子类的方法,找不到才找父类的方法,一层一层往上找。