1.OC语言概述
1>Foundation.h我们称之为主头文件, 主头文件中又拷贝了该工具箱中所有工具的头文件, 我们只需要导入主头文件就可以使用该工具箱中所有的工具, 避免了每次使用都要导入一个对应的头文件
工具箱的地址: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks
规律: 所有的主头文件的名称都和工具箱的名称一致
所有的主头文件都是导入了该工具箱中所有工具的头文件
2>import和include的区别:
import 的功能和 include一样, 是将右边的文件拷贝到当前import的位置
为了降低程序员的负担, 防止重复导入, 避免程序员去书写头文件, 那么OC给出来一个新的预处理指令import
import优点: 会自动防止重复拷贝
因为OC完全兼容C, 所以可以在OC程序中编写C语言代码
并且可以将C语言的源文件和OC的源文件组合在一起生成可执行文件
3>printf和NSLog的区别:
NSLog会自动换行
NSLog在输出内容时会附加一些系统信息
NSLog和printf接收的参数不一样
2.第一个OC类
OC中要定义一个类也分声明和实现,也就是说以后我们在OC中定义类,就是在写类的声明和实现
1>如何编写类的声明
以@interface开头,@end结尾,然后再class name对应的地方写上 事物名称,也就是类名即可
注意:类名的首字母必须大写
声明一个类的目的就是为了告诉系统,我们这个类中有哪些属性和行为
事物名称: iPhone
属性: 颜色, 型号, cpu, 尺寸 == 成员变量
行为:打电话, 发短信, 上网, 获取本机信息 == 成员方法
OC类声明中属性只能写在@interface和@end之间的{}中
例如:
@interface Iphone : NSObject
{
@public
float _model; // 型号 0
int _cpu; // cup 0
double _size; // 尺寸 0
int _color; // 颜色 0
}
注意:编写0C类的属性的时候,建议将所有属性的名称前面都加上 _(原因再后边会讲到,就是getter和seter中名字问题).
类名后边的 :NSObject是为了让我们的类具备创建对象的能力,也是类的一个父父类.
注意:默认情况下,OC类中的属性是不能直接访问的,这就是后边讲到的protected修饰符
只要让类中的属性公开,以后就可以直接通过一个指向结构体的指针来操作对象中的属性
n(int argc, const char * argv[]) {
2>如何通过一个类来创建对象
在OC中想要通过一个类来创建一个对象, 必须给类发送一个消息(好比C语言中调用函数一样)
如何发送消息?
在OC中只要想要发送消息就先写上 [类名称/对象名称 方法名称];
发送什么消息(调用什么方法)可以创建一个对象呢?
new
只要通过一个类调用类的new方法, 也就是给类发送一个叫做new的消息之后
系统内部就会做3件事情
1. 为Iphone类创建出来得对象分配存储空间
2. 初始化Iphone类创建出来的对象中的属性
3. 返回Iphone类创建出来的对象对应的地址
通过一个Iphone类型的指针接收了 Iphone对象的地址
如果使用给一个指针保存了某一个对象的地址, 那么我们就称这个指针位之为某个类型的对象
利用Iphone类型的指针保存了Iphone对象的地址, 那么我们就称Iphone类型的指针p之为Iphone对象
OC中的类其实本质就是一个结构体, 所以p这个指针其实就是指向了一个结构体
3>函数和类中行为的区别
OC中的行为和C语言中的函数一样, 都是用来保存一段特定功能的代码
C语言中定义一个函数, 分为声明和实现, 声明写在.h中, 实现写在.c中
OC中定义一个方法, 也分为声明和实现, 声明写在@interface中, 实现写在@implementation
C语言的函数分为两种: 内部函数和外部函数
OC中的方法也分为两种; 类方法和对象方法
类方法只能用类名调用, 对象方法只能用对象调用
OC中的类方法用+表示, OC中的对象方法用-表示
编写C语言函数的规律: 1.确定函数名称 2.确定形参 3.确定返回值 4.确定返回值类型
编写OC方法也有规律, 规律和C语言一模一样
()的作用:
注意: OC中的方法, 如果没有形参不需要写(), 而是直接写一个;
为什么OC中没有形参不需要写()呢? 因为OC方法中的()有特殊的用途, OC方法中的()是用来扩住数据类型的
4>C语言的函数:
没有返回值没有参数的
有返回值没有参数的
有返回值有参数的
没有返回值有参数的
有返回值没有参数的, 读取短信
- (char *)loadMessage;
有返回值有参数的, 打电话
int signal(int number);
注意: OC中的方法如果有参数, 那么每个参数的数据类型前面必须加上一个:
注意: 当前这个有参数的方法它的方法名称是 signal:
冒号也是方法名称的一部分
- (int)signal:(int)number;
有返回值并且有多个参数的, 发短信
int sendMessage(int number, char *content);
下面这个方法的方法名称是 sendMessage::
- (int)sendMessage:(int)number :(char *)content;
为了提高我们的阅读性, OC方法允许我们给每个参数添加一个标签来说明当前参数的含义
注意: 标签也是方法名的一部分
[对象 消息名称(方法名称)]
注意: OC中的NSLog对C语言的字符串支持不是很好, 如果返回的是中文的C语言字符串可能输出的是乱码, 也有可能什么都不输出
如果定义类方法, 类方法的写法和对象方法一模一样, 除了前面的-号不同以外 ,只需要将对象方法的-号换成+, 那么就定义了一个类方法
5>类方法和对象方法的区别
0. 对象方法以-开头
类方法以+开头
1. 对象方法必须用对象调用
类方法必须用类来调用
2. 对象方法中可以直接访问属性(成员变量)
类方法中不可以直接访问属性(成员变量)
3. 类方法和对象方法可以进行相互调用
4.1对象方法中可以直接调用类方法
4.2类方法中间接调用对象方法 (注意: 不建议这样使用)
4.3类方法中可以直接调用其它类方法
4.4对象方法中可以直接调用对象方法
类方法的应用场景
如果方法中没有使用到属性(成员变量), 那么能用类方法就用类方法
类方法的执行效率比对象方法高
类方法一般用于定义工具方法
字符串查找
文件操作
数据库操作
6>isa
创建对象的时候返回的地址其实就是类的第0个属性的地址
但是需要注意的是: 类的第0个属性并不是我们编写的_age, 而是一个叫做isa的属性
isa是一个指针, 占8个字节
其实类也是一个对象, 也就意味着Person也是一个对象
平时我们所说的创建对象其实就是通过一个 类对象 来创建一个 新的对象
类对象是系统自动帮我们创建的, 里面保存了当前对象的所有方法
而实例对象是程序自己手动通过new来创建的, 而实例对象中有一个isa指针就指向了创建它的那个类对象