------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1、指针分类
(1)强指针:默认的情况下,所有的指针都是强指针,关键字strong
(2)弱指针:__weak关键字修饰的指针
声明一个弱指针如下:
__weakPerson*p;
2、什么是ARC
Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化。
ARC是新的LLVM 3.0编译器的一项特性,使用ARC,可以说一举解决了广大iOS开发者所憎恨的手动内存管理的麻烦。
手动管理内存, 可以简称MRC (Manual Reference Counting)
ARC与其他语言的”垃圾回收”机制不同。ARC:编译器特性;“垃圾回收”运行时特性
ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease,
只要没有强指针指向对象,对象就会被释放。
注意:当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了。
ARC机制下有几个明显的标志:
1)不允许调用对象的release方法
2)不允许调用autorelease方法
3)再重写父类的dealloc方法时,不能再调用 [super dealloc];
1)强指针
所有的指针默认就是强指针,强指针使用__strong 标识
2)弱指针
所有的指针默认就是强指针,弱指针使用__week 标识
3.ARC下@property参数
ARC中的@property
strong : 用于OC对象, 相当于MRC中的retain
weak : 用于OC对象, 相当于MRC中的assign
assign : 用于基本数据类型, 跟MRC中的assign一样
copy : 一般用于NSString, 跟MRC中的copy一样
在ARC情况下解决”循环retain”的问题:@property一边用strong,一边用weak。
ARC特点总结
(1)不允许调用release,retain,retainCount
(2)允许重写dealloc,但是不允许调用[superdealloc]
strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
assign:适用于非OC对象类型(基础类型)
ARC使用注意事项
1)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作。
2)__weakPerson*p=[[Personalloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针设置为nil
3)ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[superdealloc]。
@property(nonatomic,strong)Dog*dog;
//意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
4)如果换成是弱指针,则换成weak,不需要加__。
4.ARC兼容和转换
让程序兼容ARC和非ARC部分。转变为非ARC -fno-objc-arc 转变为ARC的,-f-objc-arc。
如果一个项目是MRC的,那么我们可以吧这个项目转换为ARC的,通过Xcode菜单修改
5.分类的概念
@interface Person :NSObject
-(void)run;
-(void)eat;
@end
-(void)playlol;
类别概念
Category有很多种翻译: 分类 \类别 \类目 (一般叫分类)
Category是OC特有的语法, 其他语言没有的语法(类似于C#语言中的”扩展方法”和”partial”关键字)
类别的作用
在不修改原有的类的基础上增加新的方法
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作
使用类别的目的
1)对现有类进行扩展:
比如,你可以扩展Cocoa touch框架中的类,你在类别中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别。
2)作为子类的替代手段:
不需要定义和使用一个子类,你可以通过类别直接向已有的类里增加方法。
3)对类中的方法归类:
利用category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和
使用方法:先声明类别 然后实现 然后使用
类别的命名规则:类名+扩展方法,如“NSString+countNum”。
类别的接口声明与类的定义十分相似,但类别不继承父类,只需要带有一个括号,表明该类别的主要用途。
在.h文件中,声明类别:
@interface ClassName (CategoryName)
NewMethod; //在类别中添加方法
//不允许在类别中添加变量
@end
说明:声明类别格式
1)新添加的方法必须写在@interface 与 @end 之间
2)ClassName 现有类的类名(要为哪个类扩展方法)
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法
注意:不允许在声明类别的时候定义变量
在.m文件中(也可以在.h中实现),实现类别
@implementation ClassName(CategoryName)
NewMethod
{
……
}
@end
说明:实现类别格式
1)新方法的实现必须写在@implementation与@end之间
2)ClassName 现有类的类名
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法的实现
也可以通过图形界面生成类别
调用类别中的方法与调用其他类的成员方法一样。需要包含类别的头文件。
分类的使用注意事项:
1)分类只能增加方法, 不能增加成员变量、@property(可能编译不报错,但是运行有问题);
2)分类可以访问原来类中的成员变量;
3)如果分类和原来类出现同名的方法, 优先调用分类中的方法, 原来类中的方法会被忽略;
6.非正式协议的概念
非正式协议就是给NSObject类创建的类目(分类)又叫做非正式协议, 非正式协议一般不需要进行实现,一般在子类中进行方法的重写
7.分类延展
延展类别又称为扩展(Extendsion)
Extension是Category的一个特例
其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)
@interface Student ()
@end
通过延展来实现方法的私有,延展的头文件独立。
这种方法不能实现真正的方法私有,当在别的文件中引入延展的头文件,
那么在这个文件中定义的类的对象就可以直接调用在延展中定义所谓私有的方法。
8.Block的概念
Block对象是一个C级别的语法和运行机制。
它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。
因此,Block对象包含着一组状态数据,这些数据在程序执行时用于对行为产生影响。
你可以用Block来写一些可以传到API中的函数语句,可选择性地存储,并可以使用多线程。
作为一个回调,Block特别的有用,因为block既包含了回调期间的代码,又包含了执行期间需要的数据。
由于Objective-C 和 C++ 都是衍生自 C,block被设计为可同时兼容这三种语言。
定义格式:
void (^block名)() = ^{代码块;}
使用格式:
block名();
block带有参数的block的定义和使用
格式:
void (^block名称)(参数列表)= ^ (参数列表) { // 代码实现; }
带有参数和返回值的block
格式:
返回类型(^block名称)(参数列表)= ^ 返回类型(参数列表) { // 代码实现; }
9.block的typedef
函数指针使用
函数指针变量定义的一般形式为:
类型说明符(*指针变量名)();
其中“类型说明符”表示被指函数的返回值的类型。
“(* 指针变量名)”表示“*”后面的变量是定义的指针变量。
函数指针别名
typedef int (*NewType)(int x,int y);
NewType f1,f2,f3; //f1实际类型 int (*f1)(int x,int y);
利用typedef定义block类型(和指向函数的指针很像):
格式:
Typedef int(^MyBlock)(int,int);
速记符:
typedef返回值类型 (^block变量名) (参数类型列表);
以后就可以利用这种类型来定义block变量了。
10. block访问外部变量
1)在block内部可以访问block外部的变量
block内部也可以定义和block外部的同名的变量(局部变量),此时局部变量会暂时屏蔽外部变量的作用域
2)在block内部不可以修改block外部的变量
给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。