@class关键字的使用
@class声明一个类(提高编译效率,可以递归包含,#import不能递归包含)
如果是继承某个类,就要导入类的头文件(#import),如果只是定义成员变量属性用@class
自动释放池是oc里面一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中统一回收释放,当自动释放池销魂时,池里面
所有对象都会调用一次release方法
oc对象只需发送一条autorelease消息,就会把这个对象添加到最近的释放池中(栈顶)
@autoreleasepool代表创建一个自动释放池
[xx autorelease]将xx这个对象放到池子中
{}作用就是里面所有添加了autorelease放到这个池子中
以前我们创建一个对象后需要在特定的地方对这个对象释放,而添加了autorelease后我们就不必特定关心这个对象在哪里释放,由释放池帮我们管理
Student *stu = [[[Student alloc] init] autorelease];
@property属性分类,格式为@property(参数1,参数2) 类型 名字;
第一类:读写属性readonly(只生成get方法的声明),readwrite(同时生成set和get方法的声明)
第二类:setter处理(assign,retain,copy)retain代表release旧值retain新值就不必在重写set方法管理内存 copy代表release旧值copy新值
第三类:原子性(atomic代表给方法加锁保证线程安全,nonatomic代表不需要考虑线程安全问题)
默认为assign,基本数据类型可以写可以不写。如果是对象需要retain(@property (retain) Student *stu)
@property (nonatomic,getter=isMobile) Bool mobile;//getter是用来指定get方法的方法名
类目category(在不更改类的基础上动态的为已经存在的类添加新的方法)
xcode工具新建分类,填写分类名称与对哪个类添加分类,xcode会自动生成文件 类名+分类名称.h/m
@interface Student (Learn);
类名称后面的()代表着分类,()中的内容为分类的名称
分类只能扩展方法,不能增加成员变量。
延展的作用就是定义自己的私有方法。形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。
protocol就是一系列方法的列表,其中声明的方法可以被任何类实现,相当于java中的接口,协议中的方法都不一定要实现
@protocol对协议提前声明,相当于@class
@protocol 协议名 <NSObject> //NSObject根本协议 <>号代表实现某个协议
block封装了一段代码可以在任何时候执行(代码段)
block声明 int (^sum) (int,int) = ^(int a,int b){
return a+b;
}
block中可以访问外面定义的变量,默认情况下不可以修改,如果外面的变量已经用__block关键字,就可以在block内部修改这个变量