结合之前的学习笔记以及参考《Objective-C编程全解(第三版)》,对Objective-C知识点进行梳理总结。知识点一直在变,只是作为参考,以苹果官方文档为准~
二、类定义与封装
1、类与isa指针
isa指针:创建实例对象时,会把类加载到内存,类中放方法的列表(方法的入口地址)。每个实例对象都有一个isa属性,指向这个对象所对应的类;
调用方法[c run]过程:根据C找到它所指向的实例对象,再由实例对象中的isa找到对应的类,在类中找到run方法的入口地址,直接执行这个方法的每一条指令。
2、类定义和声明常见错误分析:
a、类外不能直接引用实例变量,必须通过实例对象引用实例变量。在类的方法中可以直接引用实例变量。
b、类的方法与普通函数的区别
(1)对象方法在定义和声明时要加-,数据类型要加(),而普通函数不需要。
(2)对象方法必须声明在@interface和@end之间,必须定义在@implementation和@end之间,而普通函数可以定义在除@interface@end之间的任何地方。
(3)对象方法必须通过实例对象来调用,而函数可以直接调用。
(4)对象方法可以直接引用实例变量,但是普通函数不行。
声明
- (int)sumOfNum1:(int)num1 andNum2:(int)num2;
方法名:sumOfNum1: andNum2: 注意冒号也是方法名的一部分
同一个类中不允许两个对象方法同名
调用
[p sumOfNum1:2 andNum2:18];
3、类的封装
(1)封装概念:隐藏属性,方法或者实现细节的过程叫做封装,本质上是对实例变量的封装
实例变量一般是隐藏的(非@public),不提供给外界直接访问和修改实例变量的权限,保证数据的安全性。
只允许通过对象方法访问对象的实例变量
(2)封装的作用:过滤不合理的输入值;隐藏类内部的细节,提供接口给外部调用
以下列一段.h文件程序来说明(setter和getter方法),方法的实现在.m文件中
@interface Student : NSObject
{
NSInteger _age; //年龄
NSInteger _no; //学号
NSString *_name; //姓名
}
- (void)study;
//set方法
//set方法的作用:
//提供一个方法给外界能够设置实例变量的值,可以在方法中对传入参数进行过滤,根据实际需要来改造参数。
//命名规范:
//1>方法名必须以set开头,set后跟上实例变量的名字;
//2>无返回值(void);
//3>一定有一个参数,关且参数类型和实例变量的类型保持一致;
//4>形参名不能和实例变量的名字相同,否则会发生混淆(因此实例对象名字以_开头)
- (void)setAge:(NSInteger)age;
//get方法
//作用:获取实例变量的值
//命名规范:
//1>有返回值,并且返回值类型和实例变量类型一致
//2>方法名就是实例变量的名字
//3>不需要参数
- (NSInteger)age;
//如果要设置某个实例变量为只读,则不去实现其Set方法,只实现get方法。
//- (void)setName:(NSString *)name;
- (NSString *)name;
4、类方法和对象方法:
对象方法:以“-”开头,只能由实例对象来调用
类方法:以“+”开头,只能由类名来调用,且不能访问成员变量
类方法的使用场合:
(1)方法内部不需要使用成员变量时,用类方法;
(2)开发中尽量使用类方法,因其不以来于实例对象,执行效率高