Objective-C知识总结(4)

ARC(automatic reference counting)机制

判断是否是ARC机制

  • ARC机制中不能使用retain release autorelease retainCount
  • 在dealloc方法中不能使用 [super dealloc];

在ARC下对象释放的判断依据: 对象没有强指针指向

指针默认的都是强指针,比如我们创建的对象都是默认的强指针

Person *p1 = [[Person alloc] init];

__strong 修饰符,修饰这个指针是一个强指针,也可以不写

__weak   修饰的这个指针是弱指针

ARC下的循环引用问题

当两个对象互相拥有的时候,如果定义的时候都用strong,那么就会导致循环引用的问题,双方互相强指针指向,不能被释放

解决这个问题的方法是:将其中一个以weak定义,就能完美解决这个问题了

ARC下set方法内存@property参数

ARC中的@property

strong:用于OC对象,相当于MRC中的retain

weak:用于OC对象,相当于MRC中的assign(代理一般用weak,UI控件一般用weak)

assign:用于基本数据类型,跟MRC中的assign一样

copy:一般用于NSString,跟MRC中的copy一样

ARC注意:

__weak Person *p=[[Person alloc] init];
// 不合理,对象一创建出来就被释放掉,对象释 放掉后,ARC把指针设置为nil。 

如何让ARC的项目兼容非ARC的类

让程序兼容ARC和非ARC部分

  • 转变为非ARC -fno-objc-arc
  • 转变为ARC的, -f-objc-arc 

在哪里添加编译器标示 -fno-objc-arc如下图

将MRC转化为ARC(不建议这么使用,若要尝试做好备份)

分类(Category)

分类的使用注意事项:

--------->在分类的声明中不能声明实例变量

--------->不能定义实例变量 也不能使用 @property

--------->在分类的方法中,可以访问类中的实例变量

--------->在分类中存在和类同名的方法  优先访问的时 分类中 的方法

当在多个类别中有同名的方法的时候,这时候,执行的最后编译的那个类别的同名方法

分类的 > 原类

最后编译的分类 >  其他的分类

分类(Category)非正式协议

非正式协议就是给NSObject类或Foundation框架中的子类创建的类目(分类),即给它们添加方法,叫做非正式协议

类的延展的概念

延展类别又称为扩展(Extendsion)

Extension是Category的一个特例 其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)

// 这个一般用在.m文件中,作为私有的方法和成员变量

@interface Student ()
{
   // 可以添加成员变量
}

// 添加方法

@end 
原文地址:https://www.cnblogs.com/melodyzhy/p/4684323.html