一、 类的声明和实现&规则
1.如何编写类的声明
以@interface开头 , 以@end结尾, 然后再class name对应的地方写上 事物名称, 也就是类名即可
注意: 类名的首字符必须大写
声明一个类的目的就是为了告诉系统, 我们这个类中有哪些属性和行为
OC类声明中属性只能在写@interface和@end之间的{}中
注意: 编写OC类属性的时, 建议将所有属性的名称前面都加上"_",这个是规范,记住就行了。
类名后面的 :NSObject 是为了让我们的Iphone类具备创建对象的能力(继承),也就是说,可以直接用[Iphone new];来创建一个新的对象,不然没有这个new这个类方法,因为new这个方法是存在于NSObject中的。
@interface Iphone : NSObject
@end
{ // 注意: 默认情况下, OC对象中的属性是不能直接访问的 @public // 只要让类中的属性公开, 以后就可以直接通过一个指向结构体的指针来操作对象中的属性,真实写代码不这么做。 float _model; // 型号 0 int _cpu; // cup 0 double _size; // 尺寸 0 int _color; // 颜色 0 } // 对象方法
// 因为OC方法中的()有特殊的用途, OC方法中的()是用来扩住数据类型的,只要有数据类型就得用()来扩住,下面是不待参数,没有返回值的最简单的一个方法,"-"开头的是对象方法,"+"开头的是类方法 - (void)about;
// 有返回值没有参数的, 读取短信,会返回括号类型(字符串)的一个值 - (NSString *)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方法允许我们给每个参数添加一个标签来说明当前参数的含义 // 注意: 标签也是方法名的一部分 // 方法名是 sendMessageWithNumber:andContent: - (int)sendMessageWithNumber:(int)number andContent:(char *)content;
// 类方法 // 如果定义类方法, 类方法的写法和对象方法一模一样, 除了前面的-号不同以外 只需要将对象方法的-号换成+, 那么就定义了一个类方法,类方法的实现效率要比对象方法高,所以如果该方法中没有用到类中的属性(成员变量)建议用类方法来节约性能。 + (int)sumWithValue1:(int)value1 andValue2:(int)value2; + (void)demo;
总结:
注意: 如果声明的是对象方法那么就必须实现对象方法
如果声明的是类方法那么就必须实现类方法
类方法和对象方法的区别
0. 对象方法以-开头
类方法以+开头
1. 对象方法必须用对象调用
类方法必须用类来调用
2. 对象方法中可以直接访问属性(成员变量)
类方法中不可以直接访问属性(成员变量)
3. 类方法和对象方法可以进行相互调用
4.1对象方法中可以直接调用类方法
4.2类方法中间接调用对象方法 (注意: 不建议这样使用)
4.3类方法中可以直接调用其它类方法
4.4对象方法中可以直接调用对象方法
类方法的应用场景
如果方法中没有使用到属性(成员变量), 那么能用类方法就用类方法
类方法的执行效率比对象方法高
类方法一般用于定义工具方法:字符串查找,文件操作,数据库操作等等。。。
2.如何编写类的实现
以@implementation开头, 以@end结尾, 然后在class对应的地方写上声明时声明的类的名称, 必须和声明的类名一模一样
@implementation Iphone // 行为的实现,可以对象方法,可以类方法 @end
如何通过一个类来创建对象
在OC中想要通过一个类来创建一个对象, 必须给类发送一个消息
如何发送消息? 在OC中只要想要发送消息就先写上 [类名称/对象名称 方法名称];
只要通过一个类调用类的new方法, 也就是给类发送一个叫做new的消息之后
系统内部就会做3件事情
1. 为Iphone类创建出来得对象分配存储空间
2. 初始化Iphone类创建出来的对象中的属性
3. 返回Iphone类创建出来的对象对应的地址
通过一个Iphone类型的指针接收了 Iphone对象的地址
如果使用给一个指针保存了某一个对象的地址, 那么我们就称这个指针位之为某个类型的对象(理解一下这句话)
利用Iphone类型的指针保存了Iphone对象的地址, 那么我们就称Iphone类型的指针p之为Iphone对象
// 1.创建对象 // 每次给Iphone类发送一个new消息都会开辟一块新的存储空间 // 也就意味着每次发送new消息创建出来的对象都是一个新的对象,彼此之间互不干涉的 Iphone *p = [Iphone new]; p->_color = kIColorWhite; p->_cpu = 1; p->_model = 4; p->_size = 3.5; // 2.给对象发送消息 [p about];
OC中的类其实本质就是一个结构体, 所以p这个指针其实就是指向了一个结构体
struct Person { int age; char *name; }; struct Person sp; struct Person *sip = &sp; (*sip).age = 30; // 改变指针只想的结构体中的值 (*sip).name = "lnj"; sip->age = 30; sip->name = "lnj";