黑马程序员--IOS_学习笔记_内存管理
来源:互联网 发布:最大子数组和 动态规划 编辑:程序博客网 时间:2024/06/07 06:30
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、知识点介绍
1、在OC中每一个对象都有一个引用计数器,表示对象被引用的次数。当时0时就可以被回收了。
调用retain:计数器+1。
release:计数器-1.。
retainCount:返回计数器的值。
dealloc:释放对象。如:[super dealloc];
2、当对象是通过alloc,new,copy创建的,就需要回收。
野指针:指针变量里面仍然有值,但是指向的对象被销毁了。
僵尸对象:指针指向的对象不存在了。
当向一个野指针发送消息时会报错,EXEC_BAD_ACCESS.
3、代码示例:
--定义CAR类
@interface Car : NSObject
@end // Car
@implementation Car
- (void) dealloc
{
NSLog(@"Car Object is 被回收了。");
}
@end // Car
--定义BOOK类
@interface Book : NSObject
@end // Book
@implementation Book
- (void) dealloc
{
NSLog(@"Book Object is 被回收了。");
}
@end // Book
// 人有 车,书,对象。
@interface Person : NSObject
{
Car *_car;
Book *_book;
}
- (void)setCar:(Car*)car;
- (Car*)car;
- (void) setBook:(Book*)book;
- (Book*)book;
@end // Person
@implementation Person
- (void)setCar:(Car*)car // 严谨的写法
{
if(_car != car)
{
[_car release]; // 如果 _car 是 nil null 0 也不会报错,OC中空指针release不报错。
_car = [car retain]; // 要使用car对象 需要把对象的计数器 +1,
}
}
- (Car*)car
{
return _car;
}
- (void) setBook:(Book*)book
{
if(_car != car) // 如果赋值的对象不等于现有的对象就执行下面的代码。
{
[_book release];
-book = [book retain];
}
}
- (Book*)book
{
_book = book;
}
- (void) dealloc
{
[_car release]; // 当前对象被销毁了,那么其内部使用的其他对象都需要计数器-1,至于是不是回收就要看计数器是不是0了。
[super dealloc];
}
@end // Person
--主函数
int main()
{
Person *p = [[Person alloc] init]; // 需要有对应的release方法。
Car *car = [[Car alloc] init];
Car *car2 = [[Car alloc] init];
Book *b = [[Book alloc] init];
p.car = car;
p.car = car2; // 如果 person类里面的setCar 方法里面不写 [_car release] 就会发生内存泄漏。就是对象不被使用了,但是仍然占用内存。
p.book = b;
[car release];
[car2 release];
[b release];
[p release];
return 0;
}
- 黑马程序员--IOS_学习笔记_内存管理_@autorelease
- 黑马程序员--IOS_学习笔记_内存管理
- 黑马程序员--IOS_学习笔记_内存管理相关@porperty
- 黑马程序员--IOS_学习笔记_类的本质
- 黑马程序员--IOS_内存管理_@class和循环引用的问题。
- 黑马程序员--IOS_学习笔记_description
- 黑马程序员--IOS_学习笔记_ARC
- 黑马程序员--IOS_学习笔记_Foundation/CoreGranphics
- 黑马程序员--IOS_学习笔记_UIView\UIViewControler
- 黑马程序员-OC学习笔记-----内存管理
- 黑马程序员-内存管理-学习笔记
- 黑马程序员_内存管理
- 黑马程序员_内存管理
- 黑马程序员--IOS_学习笔记_block和@protocol
- 黑马程序员_交通灯管理系统学习笔记
- 黑马程序员_交通灯管理系统学习笔记
- 【黑马程序员】交通灯管理系统_学习笔记
- 黑马程序员- IOS学习笔记-OC内存管理学习
- SharePoint Debug - The file xxx has been modified by xxx on...
- Linux下MySQL的配置
- 实验一
- PhpStorm快捷键设置/个性化设置
- poj 1828 Monkeys' Pride
- 黑马程序员--IOS_学习笔记_内存管理
- Codeforces Round #282 (Div. 1) A
- perl 连接SQL SERVER 数据库
- 生活之感悟
- 第16周项目2-用指针对字符串进行操作(用数组作形参计算字符串长度)
- 第十六周 项目4:为动态数组扩容
- 多用户android数据库使用注意事项
- vc中关闭对话框dialog
- bootsrap开发button按钮组事例