类和对象
类
在Object-c中类,其接口(interface)和实现(implementation)是分离开来的
-
类的声明
@interface 类名:父类名 { 实例变量的定义; } 方法声明; ... @end
-
类的实现
@implementation 类名 方法定义 ... @end
对象
一个类提供对象的图纸,然后创建这个类的对象
类名 对象名=[[类名 alloc]init];
访问一个类的对象的属性可以直接使用访问成员运算符(.)
属性和变量
属性
属性(property)指在接口文件中声明实例对象到底有哪些属性
属性声明的一些规则总结如下:
- 自动生成访问方法
- 自动生成实例变量
- 更简单地调用访问方法(使用点操作符(.)完成)
- 属性的内省(introspection):通过内省可以动态地查询类中声明的属性以及属性的名称和类型
显示声明属性
让编译器自动生成与数据成员同名的方法
@property int hitPoint;
相当于自动声明了实例变量和读写方法,方便外部使用
属性的实现
使用@synthesize,让编译器自动生成setter和getter方法
@synthesize hitPoint;
synthesize还有一个作用就是可以指定与属性对应的实例变量,例如@synthesize myButton = xxx;那么self.myButton其实是操作的实例变量xxx,而不是_myButton了。
属性指定的选项
@property 可用的选项
- 指定方法名(显式指定getter和setter方法名)
- getter=getter 方法名
- setter=setter 方法名
- 读写属性
- readonly(只读)
- readwrite(读写)
- 赋值时的选项
- assign(单纯赋值)
- retain(进行保持操作)
- unsafe_unretained(同assign一样(用于ARC))
- strong(同retain一样(用于ARC))
- weak(弱引用(用于ARC))
- copy(复制对象)
- 原子性操作
- nonatomic(非原子性操作、非线程安全)
属性赋值时的选项
我们可以为可读写的@property设置选项,选项共有6种:assign,retain,unsafe_unretained,strong,weak和copy。选项之间是排他关系,可以不设置任何选项或只设置6种种的一种。根据所修饰的属性是否是对象类型或者所采用的内存管理方式(手动计数,ARC)的不同,选项的意义也不同。
如表所示:
基础数据类型 | 手动引用计数 | ARC | |
---|---|---|---|
未指定任何选项 | 直接赋值 | 警告 | 警告 |
assign unsafe_unretained |
直接赋值 | 直接赋值 | 直接赋值 |
retain strong |
出错 | 赋值并对新值进行retain操作 | 赋值并对新值进行retain操作 |
weak | 出错 | 无特别操作和assign相同 | 弱引用 |
copy | 出错 | 赋值时建立传入值的一份副本 | 赋值时建立传入值的一份副本 |