属性
属性与实例变量的区别:属性无法直接访问对象的内部状态,但提供了访问这类数据的方便机制(即读取和设置方法),因而可以含有其他逻辑
属性的特性
使用属性的声明特性可以设置属性的存储语义和其他行为
nonatomic
:
原子性,使用该特性可以在多线程并发的情况中,将访问器设置为非原子性的,因而能够提供不同的结过。如果不设置该特性,访问器就会拥有原子性,换言之,赋值和返回结过永远都会完全同步。
assign
通过该特性可以在不使用copy和retainy特性的情况下,使属性的设置方法执行简单的赋值操作,这个特性是默认设置的。
retain
在赋值时,输入值会被发送一条保留消息,而上一个值会被发送一条释放消息
copy
在赋值时,输入值会被发送一条新消息的副本,而上一个值会被发送一条释放消息
strong
当属性使用ARC内存管理功能时,该特性等同于
retain
特性
weak
当属性使用ARC内存管理功能时,该特性的作用与assign特性类似,但如果引用对象被释放了,属性的值会被设置为nil
readwrite
使用该特性时,属性可以被读取也可以被写入,而且必须实现getter和setter方法,这个特性时默认设置。
read-only
使用该特性时,会将属性设置为只读,必须设置getter方法
协议
使用协议声明的方法和属性可以由任何类实现,类接口直接与特定的类关联,因此也会直接与类的层次结构关联。相对而言,协议不与特定的类关联,因此使用它可以捕捉无继承关系类之间的相似之处,协议使Objective-C支持多重继承规范的概念(方法声明)。协议还可以同于定义对象能够发送哪些消息(通过设置遵守协议的属性)。
语法
@protocol exampleDelegate<NSObject>
//必须实现的
@required
//可选的
@optional
@end
分类
使用分类可以在不进行子类化的情况下,为已经存在的类增加功能。分类中的方法会成为类的组成部分,而且会被其子类继承,这意味着可以向这个类发送消息,调用在分类中定义的方法
可用于:
1.扩展其他人定义的类
2.提到子类
3.将新类的实现代码分发给多个源文件
4.给类添加属性(通过runtime关联上)
扩展
可以将扩展视为匿名分类,在扩展中声明的方法必须在相应类.m中实现
扩展与分类的区别
扩展能够声明实例变量和属性,编译器会检查在扩展中声明的方法是否被实现,类扩展通常应存储在类实现文件中,并用于组织和声明在勒种独立使用的其他私有方法
网友评论