您的位置:首页 > 其它

文章标题

2016-04-16 13:38 323 查看

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: