iOS内存管理(一)
2013-10-11 08:42
267 查看
1.
内总管理原则(引用计数)
IOS的对象都继承于NSObject,
该对象有一个方法:retainCount ,内存引用计数。 引用计数在很多技术都用到:
window下的COM组件,多线程的信号量,读写锁,思想都一样。
(一般情况下: 后面会讨论例外情况)
alloc
对象分配后引用计数为1
retain
对象的引用计数+1
copy
copy 一个对象变成新的对象(新内存地址) 引用计数为1
原来对象计数不变
release
对象引用计数-1 如果为0释放内存
autorelease
对象引用计数-1
如果为0不马上释放,最近一个个pool时释放
NSLog(@"sMessage retainCount:%u",[sMessage retainCount]);
[sMessage retain]; //2
NSLog(@"sMessage
retainCount:%u",[sMessage retainCount]);
NSLog(@"sMessage
retainCount:%u",[sMessage retainCount]);
NSLog(@"sMessage retainCount:%u",[sMessage retainCount]);
内存管理的原则就是最终的引用计数要平衡,
如果最后引用计数大于0 则会内存泄露
如果引用 计数等于0还对该对象进行操作,则会出现内存访问失败,crash
所以尽量设置为nil
这两个问题都很严重,所以请一定注意内存释放和不用过后设置为nil
2. autoReleasePool
每个工程都有一个 main.m 文件:
内容如下:
int main(int argc, char
*argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]
init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
很明显C语言的main
函数:
NSAutoreleasePool 是用来做autorelease 变量释放的,前面说了,
autorelease不会马上释放,当他到了最近的pool release 时会检查reatin count 是不是为0,
为0就释放。
当我们在一段代码时加入了大量的autorelease变量时,我们应该为这段代码加上
Autoreleasepool,其它时候不用
在返回一个对象时常常要返回一个autorelease 对象,因为objectC 对象都是动态内存,没有
栈的概念,所以不能像C/C++一样返回一个对象到栈,只能用autorelease对象。
3. 成员变量与属性
实际情况并非上面那么简单,你可能需要在一个函数里调用另一个函数分配的变量这时候
有两个选择: 类成员变量和使用属性
@interface TestMem: NSObject
{
TestObject
*m_testObject ;
//
成员变量
TestObject
*testObject;
//成员变量
}
成员变量与上面的内存管理是一致的,只是在不同的函数里要保持引用计数加减的平衡
所以要你要每次分配的时候检查是否上次已经分配了。是否还能调用
什么时候用属性?
1. 把成员做为public.
2. outlet 一般声明为属性(
这个内存于系统控制,但我们还是应该做一样操作,后面会讲)
3. 如果很多函数都需要改变这个对象
,或这个函数会触发很多次,建议使用属性。我们看看属性函数展开后是什么样子:
// assign
-(void)setTestObject :(id)newValue{
testObject=
newValue;
}
// retain
-(void)setTestObject :(id)newValue{
if
(testObject!= newValue) {
[testObject release];
testObject= [newValue
retain];
}
}
// copy
-(void)setTestObject :(id)newValue{
if
(testObject != newValue) {
[testObject release];
testObject =
[newValue copy];
}
}
asssign 相于于指针赋值,不对引用计数进行操作,注意原对象不用了,一定要把这个设置为nil
retain 相当于对原对象的引用计数加1
copy 不对原对象的引用计数改变,生成一个新对象引用计数为1
注意:
self.testObject 左值调用的是setTestObject 方法.
右值为get方法,get 方法比较简单不用说了
而 真接testObject 使用的是成员变量
self.testObject = [[testObject alloc] init];
// 错 reatin 两次
testObject = [NSArray
objectbyindex:0]; //错 不安全,没有retain
后面release会出错
如果testObject已有值也会mem leak
4. 自动管理对象
IOS 提供了很多static(+)
创建对象的类方法,这些方面是静态的,可以直接用类名
调用如:
NSString *testString =
[NSString stringWithFormat:@"test" ];
testString 是自动管理的对象,你不用relese
他,他有一个很大的retain count, release后数字不变。
5. 例外
有一些通过alloc
生成的对象相同是自动管理的如:
NSString
*testString = [[NSString
alloc] initWithString:@"test1"];
retain count
同样是很大的数,没办法release
但为了代码对应,还是应该加上[ testString
release];
不然xcode的Analyze 会认识内存leak,
但Instruments leak 工具检测是没有的
6.view 内存管理
通常我们编程会用到view,
在view 中的方法:
viewDidload
didReceiveMemoryWarning
viewDidUnload
@property (retain)
NSArray *iarrTestMem
viewDidLoad
init retain is
0
(alloc)
+1 =1
if(memwarning)
didrecivememwarning
-0 =1
didviewunload
-1
=0
will
load viewDidLoad when next load
view
esle
dealloc:
-1
=0
我们来看一个变量的生命周期
当view被alloc
A.
框架会自动调用viewDidLoad
一般来说在viewDidLoad
中分配变量:
假设为alloc 现在变量的reatin 为 0 +1 =
1;
第一种情况:
内总管理原则(引用计数)
IOS的对象都继承于NSObject,
该对象有一个方法:retainCount ,内存引用计数。 引用计数在很多技术都用到:
window下的COM组件,多线程的信号量,读写锁,思想都一样。
(一般情况下: 后面会讨论例外情况)
alloc
对象分配后引用计数为1
retain
对象的引用计数+1
copy
copy 一个对象变成新的对象(新内存地址) 引用计数为1
原来对象计数不变
release
对象引用计数-1 如果为0释放内存
autorelease
对象引用计数-1
如果为0不马上释放,最近一个个pool时释放
NSLog(@"sMessage retainCount:%u",[sMessage retainCount]);
[sMessage retain]; //2
NSLog(@"sMessage
retainCount:%u",[sMessage retainCount]);
NSLog(@"sMessage
retainCount:%u",[sMessage retainCount]);
NSLog(@"sMessage retainCount:%u",[sMessage retainCount]);
内存管理的原则就是最终的引用计数要平衡,
如果最后引用计数大于0 则会内存泄露
如果引用 计数等于0还对该对象进行操作,则会出现内存访问失败,crash
所以尽量设置为nil
这两个问题都很严重,所以请一定注意内存释放和不用过后设置为nil
2. autoReleasePool
每个工程都有一个 main.m 文件:
内容如下:
int main(int argc, char
*argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]
init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
很明显C语言的main
函数:
NSAutoreleasePool 是用来做autorelease 变量释放的,前面说了,
autorelease不会马上释放,当他到了最近的pool release 时会检查reatin count 是不是为0,
为0就释放。
当我们在一段代码时加入了大量的autorelease变量时,我们应该为这段代码加上
Autoreleasepool,其它时候不用
在返回一个对象时常常要返回一个autorelease 对象,因为objectC 对象都是动态内存,没有
栈的概念,所以不能像C/C++一样返回一个对象到栈,只能用autorelease对象。
3. 成员变量与属性
实际情况并非上面那么简单,你可能需要在一个函数里调用另一个函数分配的变量这时候
有两个选择: 类成员变量和使用属性
@interface TestMem: NSObject
{
TestObject
*m_testObject ;
//
成员变量
TestObject
*testObject;
//成员变量
}
成员变量与上面的内存管理是一致的,只是在不同的函数里要保持引用计数加减的平衡
所以要你要每次分配的时候检查是否上次已经分配了。是否还能调用
什么时候用属性?
1. 把成员做为public.
2. outlet 一般声明为属性(
这个内存于系统控制,但我们还是应该做一样操作,后面会讲)
3. 如果很多函数都需要改变这个对象
,或这个函数会触发很多次,建议使用属性。我们看看属性函数展开后是什么样子:
// assign
-(void)setTestObject :(id)newValue{
testObject=
newValue;
}
// retain
-(void)setTestObject :(id)newValue{
if
(testObject!= newValue) {
[testObject release];
testObject= [newValue
retain];
}
}
// copy
-(void)setTestObject :(id)newValue{
if
(testObject != newValue) {
[testObject release];
testObject =
[newValue copy];
}
}
asssign 相于于指针赋值,不对引用计数进行操作,注意原对象不用了,一定要把这个设置为nil
retain 相当于对原对象的引用计数加1
copy 不对原对象的引用计数改变,生成一个新对象引用计数为1
注意:
self.testObject 左值调用的是setTestObject 方法.
右值为get方法,get 方法比较简单不用说了
而 真接testObject 使用的是成员变量
self.testObject = [[testObject alloc] init];
// 错 reatin 两次
testObject = [NSArray
objectbyindex:0]; //错 不安全,没有retain
后面release会出错
如果testObject已有值也会mem leak
4. 自动管理对象
IOS 提供了很多static(+)
创建对象的类方法,这些方面是静态的,可以直接用类名
调用如:
NSString *testString =
[NSString stringWithFormat:@"test" ];
testString 是自动管理的对象,你不用relese
他,他有一个很大的retain count, release后数字不变。
5. 例外
有一些通过alloc
生成的对象相同是自动管理的如:
NSString
*testString = [[NSString
alloc] initWithString:@"test1"];
retain count
同样是很大的数,没办法release
但为了代码对应,还是应该加上[ testString
release];
不然xcode的Analyze 会认识内存leak,
但Instruments leak 工具检测是没有的
6.view 内存管理
通常我们编程会用到view,
在view 中的方法:
viewDidload
didReceiveMemoryWarning
viewDidUnload
@property (retain)
NSArray *iarrTestMem
viewDidLoad
init retain is
0
(alloc)
+1 =1
if(memwarning)
didrecivememwarning
-0 =1
didviewunload
-1
=0
will
load viewDidLoad when next load
view
esle
dealloc:
-1
=0
我们来看一个变量的生命周期
当view被alloc
A.
框架会自动调用viewDidLoad
一般来说在viewDidLoad
中分配变量:
假设为alloc 现在变量的reatin 为 0 +1 =
1;
第一种情况:
相关文章推荐
- [iphone开发多线程之]iOS的多核编程和内存管理
- IOS的内存管理
- iOS关于内存管理的那点事儿
- iOS学习笔记01_内存管理的整理
- iOS全局变量与属性的内存管理
- iOS开发ARC下内存管理
- iOS与内存管理
- iOS内存管理(objective-c)
- cocos2d-x与ios内存管理分析(在游戏中减少内存压力)
- iOS内存管理中引用计数的学习
- ios内存管理原则
- ios arc下内存管理
- iOS内存管理方法
- iOS 阶段学习第九天笔记(内存管理)
- oc_4 ios 内存管理
- IOS中内存管理机制浅解
- cocos2dx与iOS内存管理
- iOS手动内存管理
- iOS - 内存管理十全大补丸——内存泄露检查实战总结
- iOS 5编程 内存管理 ARC技术概述