手动的进行内存管理
Cocoa和Objective-C的类都是NSObject的子类。NSObject中有几个方法进行内存管理。alloc方法为对象分配一片内存空间。dealloc方法用于释放对象的空间。但是在我们的代码中将永远都不会使用dealloc方法,因为运行时会为你调用此方法释放内存空间。而你需要做的只是引用计数,稍后介绍什么是引用计数。
除了alloc和dealloc,NSObject的还有retain和release方法两个方法用于引用计数。retain方法给retainCount变量加1,release方法给retainCount变量减1。当使用alloc为对象分配一片内存空间的时候,retainCount会为1。在这个对象的生命周期内,这个对象可能继续被其它变量引用。但有新的变量指向这个对象的时候,你应该调用retain方法,这样运行时才会知道有新的引用指向了这个变量,在这个对象生存期中拥有它的使用权。这个被Objective-C开发人员称之为“拥有”。例如:
Foo * myFooOne = [[Foo alloc] init]; //retaincount 为1
Foo * myFooTwo = myFooOne; //myFooTwo 指向了这个对象
//retaincount 仍然为1
[myFooTwo retain]; //调用retain方法,运行时才知道myFooTwo指向了该对象,retaincount 为2
上面的代码中,myFooTwo通过调用retain方法,取得了Foo对象的拥有权。在这个对象的生命周期中,会有很多变量来指向和引用它。指向这个对象的变量也可以通过release方法来解除这种拥有权。release方法将会告诉运行时,我已经使用完这个变量了,已经不需要它了,retainCount计数减1。
当对象的retainCount的计数大于或者等于1的时候,运行时会继续维持这个对象。当对象的retainCount为0的时候,运行时会释放这个对象,并回收它占得内存空间。
下图展示了一个Foo对象的生命周期。Foo对象首先在内存中分配一个内存空间,并且被myFooOne引用。在这个时候Foo对象的retaincount为1。
Foo * myFooOne = [[Foo alloc] init];
第二个引用变量指向Foo对象,这个引用变量接着调用retain方法,其实也是调用Foo对象的retain方法。Foo对象的retaincount变成2。
Foo * myFooTwo = myFooOne;
[myFooTwo retain];
接着当myFooOne引用不需要的时候,通过调用release方法,解除与Foo对象的拥有权,Foo对象的retaincount变成1。
但myFooTwo不在需要的时候,同样通过调用release方法,解除与Foo对象的拥有权,Foo对象的retaincount变成0。
内存泄露
我们经常会在一个方法中声明对象,看下面这个例子:
-(void) myMethod {
//incorrect method
NSString * myString = [[NSString alloc] init]; //retainCount = 1
Foo * myFoo = [[Foo alloc] initWithName:myString]; //retainCount = 1
NSLog(@"Foo's Name:%@", [myFoo getName]);
}
这上面这个方法中,我们为myString 和myFoo分配了内存空间。方法执行结束之后,两个变量超出了作用域的范围,所以不再有效。但是这个方法并没有releases这两个对象。所以运行时没有释放这两个变量占据的内存空间。除非你的应用程序结束,否则这两个变量占据的内存空间一直都是不可用的。我们把它称之为内存泄露。
为了防止内存泄露。无论什么时候,我们创建一个对象,或者创建一个对象的拷贝,我们都必须通过release方法释放。
-(void) myMethod {
NSString * myString = [[NSString alloc] init]; //retainCount=1
Foo * myFoo = [[Foo alloc] initWithName:myString]; //retainCount=1
NSLog("Foo's Name:%@", [myFoo getName]);
[myFoo release]; //retainCount=0 so deallocate
[myString release]; //retainCount=0 so deallocate
}
弱引用
看下面的例子:
-(void) myMethod {
//an incorrect method
Foo * myFooOne = [[Foo alloc] initWithName:@"James"]; //retainCount=1
Foo * myFooTwo = myFooOne; //retainCount still 1
[myFooOne release]; //retaincount=0 so deallocated
NSLog("Name:%@", [myFooTwo printOutName]); //runtime error
}
nyFooTwo指向了Foo对象,但是没有调用retain方法,就是一种弱引用,上面的代码会在运行时报错。因为myFooOne调用release方法。retaincount变成0,运行时,回收了对象的内存空间。然后myFooTwo调用printPutName自然就报错了,见下图说明。
总结:本文简单的介绍了一下手动的进行内存管理、内存泄露、弱引用等objective-c的知识。
分享到:
相关推荐
综上所述,本教程覆盖了Objective-C编程语言的基础知识点,不仅包括语法和结构,还包括与C语言的兼容性、内存管理机制、面向对象编程的核心概念、以及如何在不同操作系统平台上进行开发的介绍。通过这些内容的学习,...
最后,内存管理是Objective-C编程中一项基础而重要的技能,它直接影响到应用的性能和稳定性。对于初学者来说,理解并掌握内存管理的概念和实践是非常必要的。通过手动管理内存,开发者可以更好地理解内存的生命周期...
"第八讲 内存管理"是Objective-C开发中非常重要的一个环节,讲解了自动引用计数(ARC)和手动内存管理(MRC)的原理,以及如何避免内存泄漏。 最后,"第九讲 Foundation框架"介绍了苹果的基础框架,它提供了一系列...
4. **Foundation框架**:介绍Objective-C开发中最常用的Foundation框架,包括字符串处理、集合类(NSArray, NSDictionary等)、内存管理等基础工具的使用。 5. **Cocoa Touch**:对于iOS开发,会讲解Cocoa Touch...
了解了C语言的基本语法后,还需关注内存管理,包括堆栈与堆的区别,以及如何正确地分配和释放内存以防止内存泄漏。 最后,良好的编程习惯和错误处理也是C语言学习中的重要环节。学会使用printf调试,理解并正确使用...
7. **ARC(Automatic Reference Counting)**:ARC是Objective-C中的内存管理机制,自动处理对象引用计数,避免了内存泄漏和过早释放的问题。 8. ** Blocks **:Objective-C引入了Blocks,这是一种内联函数或闭包,...
Objective-C的内存管理机制与.NET和Java等语言中常见的自动垃圾回收机制不同,它更接近于C语言的手动管理方式,但在此基础上加入了一些自动化手段,使得开发人员能够在一定程度上简化内存管理的工作。 ##### 1. ...
了解和掌握Objective-C内存管理,对于iOS开发人员来说,是保障应用程序稳定运行和优化性能的基础。尽管现在ARC的出现大大简化了这一过程,但是对引用计数机制的深入理解和手动内存管理的技巧仍然是非常宝贵的。
4. **内存管理**: 早期版本的Objective-C采用手动内存管理的方式,开发者需要显式地分配和释放内存。自ARC(Automatic Reference Counting)机制引入后,Objective-C开始支持自动内存管理,大大降低了内存泄漏的风险。...
- **内存管理**:Objective-C使用ARC(Automatic Reference Counting),而C++使用自己的内存管理规则。在混用时要特别注意内存泄漏问题。 - **命名冲突**:C++的命名空间和Objective-C的类别可能会引起命名冲突,...
5. **内存管理**:Objective-C使用引用计数进行内存管理,书中会详细解释如何正确地持有和释放对象,以避免内存泄漏。 6. **NSObjects和协议**:Objective-C中的NSObject类是所有其他类的基类,书中会讲解它的方法...
Foundation框架是Objective-C的基础,包含了各种数据类型、集合类、线程管理、内存管理等核心功能。例如NSArray、NSDictionary、NSString等常用类都属于Foundation框架。 8. **NSObject**: 所有Objective-C的...
本书全面而系统地讲述Objective-C语言的基础知识和面向对象编程的重要概念,结合实例介绍了Cocoa工具包的优秀特性和其中的框架,以及继承、复合、源文件组织、内存管理、对象初始化和类别创建等众多重要的面向对象...
《Objective-C 程序设计(第4版)》已经为iOS 5和Xcode4.2中的重大变更做了全面更新,最大的改动是引入了自动引用计数(ARC),并详细说明了如何在Objective-C编程过程中使用ARC提升和简化内存管理。
7. **自动引用计数(ARC)**:Objective-C的内存管理采用自动引用计数,编译器会自动处理对象的生命周期,减少手动管理内存的工作。 8. **KVC(Key-Value Coding)与KVO(Key-Value Observing)**:KVC允许间接访问...
主要内容包括Objective-C的简介、应用场景、开发环境配置、基础语法、面向对象编程、内存管理、Foundation框架、分类与协议、动态特性与运行时、错误处理与调试、实践项目与案例分析、异步编程、线程与队列、设计...
但是,Objective-C在C的基础上新增了消息传递机制,这是它与C语言的一个重要区别。在Objective-C中,方法调用是通过向对象发送消息来完成的,而不是像C++那样直接调用成员函数。这种消息传递机制使得Objective-C的...
2. **内存管理**:Objective-C 2.0引入了自动引用计数(ARC),大大简化了内存管理。开发者不再需要手动调用`retain`、`release`和`autorelease`,而是由编译器自动处理。 3. **分类与协议**:Objective-C允许对已...
随着ARC的引入,程序员需要关注的内存管理细节减少,但理解这些基本概念仍然是编写高质量Objective-C代码的基础。在实际开发中,配合Instruments工具进行内存泄漏检查和性能分析也是提升应用质量的有效手段。