一、关键字说明
1、@synthesize:自动生成成员变量相应的存取方法,可以使用点语法操作该变量的存取。
2、@implementation: 表明类的实现 ,以@end 结束。
3、self :类似java语言当中的this ,是隐藏指针 指向接受消息的对象的指针 。消息所调用的方法使用该指针参数查找它要使用的实例。
4、super : 调用父类的方法 。 self = [ super init]; 判断是否可以成功初始化 如果父类成功初始化 那么将会赋值给 self ,这样self 是一个非空对象。 它不是参数也不是实例变量, 向super 发生消息的时候,实际上是在请求oc向该类的超类 发送请求 ,如果超类中没有定义的消息,oc将按照继承的普通规则在继承链中进行查找。
继承当中隐藏指针isa 与 super关键字 两张图片来演示:
5、#imoprt 与c语言当中的#include有类似的作用 ,告诉预处理器将头文件的内容包含到本文件的.oc中 ,并且保证头文件只会被包含一次 。
6、@interface 声明包含一个 XXX 类 ,与@implementation 一样 ,以@end结束。
7、: 表示继承 后面跟的是父类 。oc是单继承的机制 ,这里跟出c++是不一样的。
8、@property 关键字 设置成员变量的属性 (读/写 赋值 assign retain copy ,支持多线程的非原子访问nonatomic)
二、 方法的声明
1、 声明一个方法 格式是:
-(返回值)方法关键字 1 :(参数类型)参数名 方法关键字2 :(参数类型)参数名 …… (在读方法的时候 ,找方法关键字来确定参数)
2、-号是实例方法 +号是类方法
3、另一个初始化的方法中 调用 已有的初始化方法 这种方法被称为是 Designated initializer
三、输出流
NSlog是OC中的标准输出 ,附加输出 当时的时间 应用程序的名称 ,使用Nslog()输出任意对象的值时 都会使用%@格式说明 ,在使用这个说明符时 对象通过调用一个名为description的方法提供自己的NSlog()格式
四、getter / settter 方法
对象.属性:使用@property配合@synthesize 可以让编译器自动实现 getter/setter方法 ,很方便 可以直接使用”对象 属性“的方法调用
对象.方法:如果想要调用”对象.方法“的方式来调用一个方法并获取到方法的返回值 需要使用@property配合@dynamic 使用@dynamic 关键字是告诉编译器由我们自己来实现访问方法 。
五、属性的设置
1、readonly 此标记说明属性是只读的 ,默认的标记是读写 ,如果指定了制度 在@implementation中只需要一个读取器 或者你使用@synthesize关键字 ,也是有读取器方法被解析 而且如果试图使用点操作符 为 属性赋值 ,那么将会出现编译错误。
2、readwrite 此标记说明属性会被当成读写的 这也是默认的属性 设置器和读取器都需要在@implementation中实现 ,如果使用@synthesize关键字 读取器和设置器都会被解析
3、nonatomic 非原子性访问 对于属性赋值的时候不加锁 ,多线程并发访问会提高性能,如果不加此属性 则默认是两个访问方法都为原子型事务访问。
4、atomic 和 nonatomic用来决定编译器生成的getter和setter是否为原子操作 ,atomic 设置成员变量的@property属性时 默认为是atomic 提供线程安全 。在多线程环境下 ,原子操作是必要的 否则会引起错误的结果 。加了 atomic,setter函数会变成下面这样:
{lock}
if(property != newValue){
[property release];
property = [newValue retain];
}
{unlock}
nonatomic 禁止多线程,变量保护 提高性能 。atomic 是OC 使用的一种线程保护技术 ,基本上来讲 就是防止在 写 未完成的时候 被另外一个线程读取 ,造成数据错误。而这种机制是耗费系统资源的 ,所以在iPhone这种小型设备上 如果没有使用多线程间的通讯编程 那么 nonatomic是一个非常好的 选择。 访问器是原子操作 ,这也就是说 在多线程环境下,解析的访问器提供一个对属性的安全访问 ,从获取器得到的返回值或者通过设置器设置的值可以一次完成, 即便是别的线程也正在对其进行访问。