文章目录
3.类、对象与方法
3.1 类
3.1.1 类的定义
在Objective-C中,每个类的定义包括两个部分:接口(interface)和实现(implementation)。接口部分定义在.h文件中,包含类的声明、属性以及方法,主要作用是对外提供访问接口。实现部分在.m文件中,主要用于方法的功能实现。
1.类定义简介
类定义是一种类型的对象的原型,其声明了每个对象都具有的属性(property),同时还定一个同一类的所有对象都使用的一系列方法(method)。
编译器为每个类创建一个可访问的对象,称为类的对象,类方法负责创建属于该类的新对象。创建对象的过程叫做实例化。
当使用Xcode创建一个类时,Xcode会自动创建.m和.h文件。
2.接口文件
接口文件完成类的声明,向外界提供如何使用该类,主要体现在以下3类信息。
- 继承关系:通过继承关系可以了解该类是哪个类的子类,从而可以了解可供调用的父类的方法和属性
- 属性Property
- 方法Method
接口部分的定义以@interface开始,以@end结束。在iOS开发中,属性和方法的命名一般采用驼峰法命名规则。
3.实现文件
类的实现部分已@implementation开始,以@end结束。在类的实现部分,需要使用#import命令引用类的接口部分。
3.1.2 类的继承
继承是面向对象编程的重要特性之一,类定义是累加的,每一个定义的类都是基于其父类,并且可以继承父类中定义的属性和方法。注意:NSObject类是所有类的父类。
在Objective-C中创建的类也遵循继承的原则:
- 继承父类的属性
- 继承父类的方法
3.2 属性
属性定义后,会创建一个与该属性名称同名且带下划线的实例变量,自动合成该属性对应实例变量的getter和setter方法。
3.2.1 属性的定义
1. 属性中的一些概念
- 属性(property):通常指的是由对象封装或者存储的数据。
- 存取方法(getter/setter):获取/设置该类的对象的属性值,执行设置/获取操作的方法称为存取方法
- getter方法:返回属性的值,名称与属性名相同,懒加载就是getter方法的重写。
- setter方法:设定属性的值。
2. 属性的声明
当在类中声明一个属性时,需要在类的@interface代码部分编写,格式如下:
@property (attributes) type name;
其中:
- attributes 属性的特性,常见的关键字由weak、strong、assign、copy、atomic/nonatomic。
- type 属性的类型说明 如:NSString、NSNumber等等
- name 属性的名称
3. 懒加载
在开发过程中,经常会使用属性的懒加载。就是当需要获取某个属性的值时,再对该属性对象的实例变量进行初始化,从而提高内存的使用效率。例如使用懒加载初始化name属性。
-(NSString*) name{
if(_name == nil){
_name = [NSString stringWithFormat:@"www.baidu.com"];
}
return _name;
}
3.2.2 公有属性与私有属性
在自定义类中,既可以在.h文件中声明属性,也可以在.m文件中声明属性。在.h文件中声明的属性可以供外部调用,称为公共属性。在.m文件中声明的属性,只能在该类的实现部分使用,称为专有属性,只能在该类内部调用。
3.2.3 属性关键字
属性的特性决定了属性在原子性、存取方法以及内存管理3个方面的特性。目前,常用的特性关键字有8个,分别为nonatomic、atomic、readonly、readwrite、strong、weak、assign、copy。
1.原子性(atomic、nonatomic)
(1)atomic (默认):atomic意为操作是原子的,意味着只有一个线程访问实例变量。
- 当一个变量声明为atomic时,意味着在多线程中只能有一个线程能对他进行访问。该变量为线程安全型,但是会影响访问速度。在非ARC编译环境下,需要设置访问锁来保证对该变量进行正确的getter/setter。
(2)nonatomic(常用):nonatomic与atomic刚好相反,表示非原子的,可以被多个线程访问。它的效率比atomic快,但不能保证在多线程环境下的安全性。
- 当一个变量声明为nonatomic时,意味着多个线程可以同时对其进行访问。它是非线程安全型,访问速度快。当两个不同的线程对其访问时,容易失控。
2.存取方法(readonly、readwrite)
- readonly:表示只有getter没有setter,即只能读取,不能更新或写入。
- readwrite(默认):表示该属性同时具有setter和getter,即该属性可以读也可以写。
3. 内存管理(strong、weak、assign、copy)
- strong(ARC中为默认选项):强引用,表示实例变量对传入的对象要有所有权关系,引用计数加1.
- weak:弱引用,在setter方法中,对传入的对象不进行引用计数加1的操作。
- assign :简单赋值,不更改索引计数,适用简单数据类型。
- copy:copy与strong类似,但区别在于实例变量是对传入对象的副本拥有所有权,而非对象本身。
4.速记法
- strong:自定义对象,控制器对象使用strong。
- weak:代理对象。
- assign:基本数据类型,如:int、float、double等
- copy:NSString、NSArray、NSDictionary及其可变子类、Block块代码。
3.3 方法
3.3.1 方法的定义
在iOS中,通过将一则消息(message)发送给一个对象(接收者),可以调用该对象的一个方法,消息机制是Object-C的一个特点。方法分为实例方法和类方法
在OBject-C语言中,调用某个对象中定义的方法是通过向对象发送消息的方式进行,消息的名称对应类中定义的方法名称。调用一个对象的方法采用如下形式进行:
[receiver message];
- 消息message:这里的消息指的是方法名(选择器Selector)和参数。
- 接收者receiver:通常未一个对象,消息告诉接收者需要去做什么事情。
方法的定义
方法的声明包含了以下几个部分:方法类型标示符、返回类型、方法名称、参数类型和参数名称。
-(void)insertString:(NSString *)aString atIndex:(NSUInterger)loc;
方法分为实例方法:以"-“开头,消息的接收者必须为一个已经实例化的对象。类方法:以”+"开头,也称为工厂方法,类方法通常用于创建类的新实例,类方法的返回值通常未instancetype。
3.3.2 方法的重写与调用
调用采用消息机制即可。
当子类需要重写父类的方法时,必须保证重写的两个方法返回值、方法名、参数列表完全一致。
子类调用父类方法采用[super 方法]。
3.4 对象
3.4.1创建对象
对象是类Class运行时的实例,它包含了自己的实例变量的内存副本以及类方法的指针,在实际开发中采用分配内存地址alloc以及初始化init两个步骤来创建一个对象。
对象的创建分为两个阶段:内存空间分配和初始化。
1. 分配内存空间alloc
2. 初始化init