1.ARC自动引用计数:简化代码,减少程序的内存泄漏和崩溃问题。--内存管理。
使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露。
下面列举两种内存泄露的情况。
(1)循环参照
A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。
这种问题常发生于把delegate声明为strong属性了。
例,
@interface SampleViewController
@property (nonatomic, strong) SampleClass *sampleClass;
@end
@interface SampleClass
@property (nonatomic, strong) SampleViewController *delegate;
@end
上例中,解决办法是把SampleClass 的delegate属性的strong改为assing即可。
(2)死循环
如果某个ViewController中有无限循环,也会导致即使ViewController对应的view关掉了,ViewController也不能被释放。
这种问题常发生于animation处理。
例,
比如,
CATransition *transition = [CATransition animation];
transition.duration = 0.5;
tansition.repeatCount = HUGE_VALL;
[self.view.layer addAnimation:transition forKey:”myAnimation”];
上例中,animation重复次数设成HUGE_VALL,一个很大的数值,基本上等于无限循环了。
解决办法是,在ViewController关掉的时候,停止这个animation。
-(void)viewWillDisappear:(BOOL)animated {
[self.view.layer removeAllAnimations];
}
即使用了ARC,我们也要深刻理解iOS的内存管理机制,这样才能有效避免内存泄露。
2.dealloc方法:方法里面做一些清理操作,如:当对象销毁时,它需要移除所有的观察者对象。这时, dealloc方法仍需要。
3.强引用和弱引用
强引用表明所有权,它会保持引用对象,直到引用消失。
弱引用仅仅是一个指针,它额外的好处是,当指向的对象没有任何其他对象持有其引用而销毁时(没有对象引用时),这个指针就变成nil。
4. @synthesize 指令的作用
当 @synthesize 一个属性的时候,编译器会自动为你创建一个实例变量。所以,我们没有必要把属性和实例变量同时声明了。
@synthesize segmentControl; 该语句会让编译器生成一个名字和属性一模一样的实例变量。
@synthesize segmentControl = _segmentControl;该写法为属性声明了一个名字不同的实例变量,这个是最佳实践。可以通过self.segmentControl来访问属性,该属性关联的实例变量为_segmentControl。
5. 类别和类扩展
类扩展:(1)一般的时候,Extension都是放在.m文件中@implementation的上方; (2)Extension中的方法必须在@implementation中实现,否则编译会报错。
类别:只可以声明方法,不可以声明属性,⚠️类别的方法中不能调用super方法。
(1) Category的方法不一定非要在@implementation中实现,也可以在其他位置实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序则会崩溃。
(2) Category理论上不能添加变量,但是可以使用@dynamic 来弥补这种不足。 (即运行时Runtime)