内存管理的遛狗问题分析
来源:互联网 发布:selenium python 编辑:程序博客网 时间:2024/04/30 21:31
遛狗来内存处理问题
黄金法则 :有加就有减 目标就是0 只要使用 alloc retain copy 就要对应的使用 release 或者 autorelease 来释放
main.m文件里
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc,constchar * argv[])
{
@autoreleasepool {
Dog *dog1 = [[Dogalloc]init];
[dog1 setID:1];
Dog *dog2 = [[Dog alloc]init];
[dog2 setID:2];
Person *xiaoLi = [[Person alloc]init];
[xiaoLi setDog:dog1];
[xiaoLi setDog:dog2];
[dog1 release];
[xiaoLi release];
[dog2 release];
//三个alloc就是用了三个release
#if 0
Dog *dog1 = [[Dogalloc]init];//0~1
[dog1setID:1];
//xiaoli要遛狗
Person *xiaoli = [[Personalloc]init];//0~1
[xiaolisetDog:dog1];//1~2拴上一根绳子
//xiaowang也想遛狗
Person *xiaowang = [[Personalloc]init];//0~1
[xiaowangsetDog:dog1];//2~3在拴上一根绳子
NSLog(@"dog1 retain count is %lu",[dog1retainCount]);
//dog1 retain count is 3
[dog1release];//3~2
NSLog(@"dog1 retain count is %lu",[dog1retainCount]);
//dog1 retain count is 2
//xiaowang人死了
[xiaowangrelease];//1~0 2~1
NSLog(@"dog1 retain count is %lu",[dog1retainCount]);
//person is dealloc
//dog1 retain count is 1
//xiaoli也死了
// [xiaoli release];
// NSLog(@"dog1 retain count is %lu",[dog1 retainCount]);//再次调用就是野指针了不能再次使用dog1了所以如果想输出就不要采用这种方式.而使用下面的方式autorelease+自动释放池的方式
[xiaoliautorelease];//1~0 1~0
NSLog(@"dog1 retain count is %lu",[dog1retainCount]);
}//跳出后计数减一不会出现野指针问题
return0;
}
#endif
person.h文件里
#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person :NSObject
//给人添加一个实例变量 狗
{
Dog *_dog;
}
//设置狗的外部变量
- (void)setDog:(Dog *)aDog;
- (Dog *)dog;
@end
person.m文件里
#import "Person.h"
@implementation Person
- (void)setDog:(Dog *)aDog{
if (aDog != _dog ) {
[ _dog release];//需要注意
_dog = aDog;
[aDog retain];//让_dog计数器+1
}
}
- (Dog *)dog{
return _dog;
}
- (void)dealloc{
NSLog(@"person is dealloc");
[_dogrelease];//人死了就把人拥有的_dog释放
[superdealloc];
}
@end
#import <Foundation/Foundation.h>
@interface Dog : NSObject
{//设置狗的编号
int _ID;
}
//设置一个外部的方法来设置狗的ID
@property(nonatomic,assign)int ID;
@end
#import "Dog.h"
@implementation Dog
@synthesize ID = _ID;
- (void)dealloc{
NSLog(@"dog %d is dealloc",_ID);
[superdealloc];
}
@end
- 内存管理的遛狗问题分析
- E500的内存管理分析
- 内存的问题和管理
- 内存管理问题的总结
- string的内存管理问题
- 内存管理的基本问题
- NSString的内存管理问题
- MFC的CString(VC6) 内存管理分析
- MFC的CString(VC6) 内存管理分析
- MFC的CString(VC6) 内存管理分析
- MFC的CString(VC6) 内存管理分析
- Android SkBitmap的内存管理分析
- 分析jrtplib库的内存管理类
- Android进程的内存管理分析
- Android进程的内存管理分析
- Android进程的内存管理分析
- 分析jrtplib库的内存管理类
- Android进程的内存管理分析
- 子类为什么不能重写父类的静态方法
- 安卓面试常见基本问题(2)
- rails select
- Android overlay系统
- div 切换
- 内存管理的遛狗问题分析
- 安卓面试常见基本问题(3)
- 通过分类为数组元素添加一个倒序的方法.
- Solr Tutorial
- Android网络连接判断与处理
- Linux环境进程间通信(二): 信号
- 【Splay】 1208 [HNOI2004]宠物收养所
- C++设计模式之工厂方法模式(一)
- ADF中怎样创建带有小计功能的Table