- 浏览: 904070 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (466)
- iPhone, iOS , Objective-c (155)
- 数据库 (20)
- 设计模式 (5)
- 第三方包管理,cocoapod (2)
- 版本管理, SVN, Subversion, Git (1)
- Google, Android, Java (14)
- Wordpress (1)
- 职业素养 (3)
- 版本管理,git (3)
- 前端小技巧 (2)
- flash (1)
- javascript (5)
- Ruby (0)
- 编程语言 (1)
- 网络常识 (1)
- 找到生活好感觉 (5)
- 产品经理 (1)
- markdown (1)
- 云服务器 (1)
- iPhone (116)
- iOS (116)
- Objective-c (116)
- 学习技巧 (2)
- Google (5)
- Android (6)
- Java (21)
- python (1)
- sqlite (3)
- node.js (2)
- mongodb (2)
- 学习技巧,阅读 (2)
- 软件测试 (3)
- 架构设计 (2)
- 设计 (1)
- Spring framework (3)
- junit (1)
- Linux (2)
- 软件 (1)
- Struts2 (1)
- 版本管理 (3)
- SVN (3)
- Subversion (3)
- Git (3)
- mysql (5)
- quartz (1)
- 无关技术 (1)
- 前端 (1)
- Redis (1)
- 产品管理 (0)
- 计算机常识 (1)
- 计算机科学 (0)
- swift (1)
- 服务器 (2)
- 搜索 (1)
- Scala (1)
- J2EE (1)
- maven (1)
- 前端css (1)
- 英语 (1)
- 消息队列 (1)
- kafka (0)
- apache kafka (4)
- netbeans (1)
- IDE (2)
- 歌词 (1)
- 过滤器实现 (1)
- linux vim vi (1)
- jmeter (1)
- springcloud (1)
最新评论
-
hujingnemo:
不知道为什么打不开
CHM如何改编字体大小 -
weiboyuan:
求答案 weiboyuanios@163.com
iOS软件工程师面试题(高级) -
xueji5368:
这个现在已经广泛使用了嘛!
RoboGuice入门 -
Yao__Shun__Yu:
...
CHM如何改编字体大小 -
353144886:
非常之详细 美女求认识
sqlite数据类型 datetime处理
iOS提供了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的内存管理机制,这样才能有效避免内存泄露。
但使用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的内存管理机制,这样才能有效避免内存泄露。
发表评论
-
oc为啥不用try catch
2016-03-23 11:56 1404简单的来说,Apple虽然同时提供了错误处理(NSError) ... -
ReactiveCocoa笔记
2016-03-14 12:31 0为什么使用MVVM?为什么使用ReactiveCocoa? 概 ... -
PINCache
2016-01-19 15:11 948PINCache是线程安全的键值缓存框架,用来储存难以获取或重 ... -
Swift设计模式
2015-12-29 12:04 0Swift设计模式 -
Understanding Swift access control
2015-12-29 12:03 0Swift takes an unusual approuac ... -
cocoapods因GEM_HOME升级遇到问题解决办法
2015-12-17 14:40 926Installing CocoaPods on OS X 10 ... -
swift 闭包的比较写法
2015-12-16 11:10 755let names = ["Chris", ... -
iOS 生成二维码,生成条形码图片
2015-12-03 15:44 1472#pragma mark - 生成条形码以及二维码 // ... -
解决cocoapods 更新慢的问题
2015-11-23 17:01 755最近使用CocoaPods来添加第三方类库,无论是执行pod ... -
iOS中级面试题
2015-11-20 15:12 1182OneV‘s Den在博客里出了10道iOS面试题,用他的话是 ... -
cocoapods出错解决方法
2015-11-09 13:09 746自定义GEM_HOME $ mkdir -p $HOME/So ... -
oc时间从美国时间改到中国时间
2015-10-19 14:12 979_formatter = [[NSDateFormatt ... -
27个iOS开发库
2015-07-24 16:10 769超长慎入列表: DZNEmptyDataSet(UI,空表格 ... -
Values of type 'NSInteger' should not be used as format arguments; add an explic
2015-07-24 10:10 844Values of type 'NSInteger' shou ... -
iOS架构心得体会
2015-05-18 18:35 815好的架构不是设计出来的,而是进行出来的。 我的iOS工程架构 ... -
UICollectionView NSInternalInconsistencyException出现的原因
2015-05-11 11:32 3414'NSInternalInconsistencyExcepti ... -
XLForm-iOS表单库
2015-05-08 14:44 908XLForm是最灵活和强大的iOS类库,用于创建动态table ... -
Info.plist Utility Error: “Info.plist couldn't be opened because there is no suc
2015-05-06 16:13 689http://stackoverflow.com/questi ... -
iOS中Autolayout中各种情况的使用的width,height策略
2015-04-30 15:33 685可以总结为: 如果项目不支持横屏显示,使用w:Compac ... -
一句话加上下拉刷新
2015-04-29 18:22 770怎么一句话添加上拉刷新? https://github.co ...
相关推荐
Swift 语言的自动引用计数(Automatic Reference Counting,简称 ARC)是一种先进的内存管理技术,用于在编译时自动插入引用计数代码,以确保应用程序不会消耗过多内存或导致内存泄漏。本文将详细探讨 ARC 的工作...
内存泄漏会导致应用程序性能下降,甚至崩溃,因此,及时检测并修复内存泄漏至关重要。"iOS内存泄漏检测器"是一个实用工具,利用运行时机制帮助开发者在开发阶段就能检测出NSObject及其子类中的循环引用和其他内存...
内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能不会立即引起问题,但随着时间的推移,累积的内存泄漏可能会导致应用程序占用的内存持续增长,直至耗尽系统资源,引发应用崩溃。...
3. 在运行过程中,Instruments会实时监测内存分配和释放情况,如果发现内存泄露,会在右侧的时间线上显示,并标出泄漏的具体位置。 在检测到内存泄露后,你需要根据线索分析问题所在。通常,Leaks工具会给出内存...
然而,如果不正确地使用Block,可能会导致循环引用(retain cycle),进而引发内存泄露。本文将深入探讨Block引起的循环引用问题,提供示例并分享解决方案。 一、什么是循环引用? 循环引用是指两个或多个对象互相...
然而,如果存在循环引用或者意外的强引用,就会导致内存泄漏。 2. **循环引用**: 循环引用发生在两个或更多对象相互持有对方的强引用,使得它们无法被释放。解决循环引用的一个常见方法是使用弱引用(__weak)或...
这极大地减轻了程序员管理内存的压力,但也需要注意一些潜在的问题,如循环引用可能导致的内存泄漏。 4. 源代码分析: 书中提供的源代码示例可能包括了不同类型的内存管理场景,如对象的创建、使用、传递以及在多...
当检测到内存泄漏时,MLeaksFinder会生成详细的泄漏报告,包括泄漏对象的信息、泄漏发生的位置以及可能导致泄漏的代码路径。这有助于开发者快速定位问题并修复。 6. **内存泄漏常见原因与解决策略** - 循环引用:...
内存泄漏是iOS开发中的一个常见问题,它会导致应用的可用内存逐渐减少,最终可能导致应用崩溃或系统资源耗尽。为了有效地识别和解决内存泄漏问题,iOS开发者可以利用Xcode自带的工具进行分析和调试。以下是两种查看...
3. **Block中捕获的对象**:Block会复制其所在上下文中引用的对象,若未妥善处理,可能导致内存泄漏。 4. **非ARC库**:如果插件中包含非ARC代码,需要手动管理内存,可能会遗漏释放。 修复过程中,开发者可能通过...
尽管ARC会自动管理大部分内存,但在某些情况下,比如在异步操作或者某些特殊框架中,仍然需要使用AutoreleasePool来管理临时对象的生命周期。 12. ARC与Auto Release Pool的关系: 开发者可以使用ARC来管理...
"crash调试"这部分可能涉及如何识别和解决由于内存问题导致的应用崩溃,这通常需要用到Xcode的调试工具,如Instruments,来分析内存分配和泄漏。 "反汇编"是另一个关键标签,它意味着这份资料可能深入到代码的底层...
例如,在block中,如果不小心使用了强引用,可能会导致循环引用,进而引起内存泄漏。 ### AutoreleasePool与ARC AutoreleasePool机制在ARC中仍然发挥作用,但使用方式有所变化。在ARC环境下, autoreleasepool语句...
在非ARC环境下,正确使用`autorelease`是防止内存泄漏的关键。例如,假设你在方法中创建了一个新的对象: ```objc - (void)createAndUseObject { NSObject *localObject = [[NSObject alloc] init]; // 使用local...
- **减少内存泄露**:由于ARC会自动释放不再使用的对象,因此大大降低了因忘记释放内存而导致的内存泄漏问题。 - **提高代码可读性**:开发者无需关心何时何地调用释放方法,这使得代码更加简洁、易读。 - **提高...
由于内存泄露和不当管理通常会导致应用程序性能下降,甚至崩溃,因此Xcode提供了内存泄露查找工具来帮助开发者发现和解决这类问题。本文将详细讲解如何在Xcode中使用内存泄露查找工具,比如Memory Leaks和...
使用`weak`属性可以确保当代理对象被释放时,其引用也会自动置为`nil`,从而避免了内存泄露。 #### `unsafe_unretained` `unsafe_unretained`是一种弱引用类型,类似于`weak`,但不同之处在于`unsafe_unretained`...
- **Block与ARC**:在使用Block时需要注意,Block可能会捕获Strong引用,导致循环强引用。为了处理这种情况,通常需要使用Weak指针来避免。 - **Singleton与ARC**:在ARC环境下处理Singleton模式时需要注意,应使用...
- **强引用循环**:当两个或多个对象互相强引用时,它们的引用计数都不会降为0,这可能导致内存泄漏。使用弱引用可以打破这种循环。 ### 3. `__strong`、`__weak`、`__unsafe_unretained`修饰符 - **`__strong`**:...
例如,当代码中创建了一个对象,ARC会自动在对象不再被使用时插入release方法,防止内存泄漏。同样,当对象被复制或需要持续存在时,ARC会插入retain方法来增加对象的引用计数。使用ARC,开发者可以专注于业务逻辑的...