OC内存管理-1
来源:互联网 发布:ios 提取网页数据 编辑:程序博客网 时间:2024/05/29 18:23
/*************person.h****************/
/*注:实验前请关闭ARC*/
#import <Foundation/Foundation.h>
@class Dog;
@interface Person :NSObject
{
Dog *_dog;
}
-(void)Tobug:(Dog *)newdog;
-(void)setDog:(Dog *)newdog;
@end
/*************person.m****************/
#import"Person.h"
#import"Dog.h"
@implementation Person
//declare:如果你想要一个dog对象,必须使用这个方法,
-(void)setDog:(Dog *)newdog{
if (newdog != _dog) {
//这一步判断是必要的,防止一个人用完一只狗没有解绳子而直接去用另一只狗
[_dogrelease];
_dog = [newdogretain];
}
}
//人让狗叫:
-(void)Tobug:(Dog *)newdog{
//狗调用自己的bug
[newdogbug];
}
//复写dealloc方法:
-(void)dealloc{
NSLog(@"dealloc!");
[_dogrelease];
[superdealloc];
}
//复写release方法:
-(onewayvoid)release{
NSLog(@"release!");
[super release];
}
@end
/*************Dog.m****************/
#import<Foundation/Foundation.h>
@interface Dog :NSObject
{
int _ID;
}
@propertyint ID;
-(void)print_counter;
-(void)bug;
@end
/*************Dog.m****************/
#import "Dog.h"
@implementation Dog
//打印目前dog的引用计数(reference counting)的值
-(void)print_counter{NSLog(@"retaincount:%li",[selfretainCount]);}
//狗叫:
-(void)bug{NSLog(@"T'm a dog!");}
@end
/*************main.m****************/
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc,constchar * argv[])
{
@autoreleasepool {
/*
每个对象都有一个计数器,可以记录当前对象被使用过多少次。(“使用次数”不准确,应该是被除alloc操作之外的:copy,retain的次数。)
所以每个对象分配的内存都会给记录和管理对象的数据而分配额外空间。
//插话:项目两个人做,通过api文档怎么用,一人分配内存,另一人释放内存,C/C++普遍存在,所以OC就添加了计数器来记录使用次数
指针4个字节
对象分配空间分为两部分:管理空间,存储空间,管理空间的地址一般比存储空间的地址低。
几个指针指向同一个对象(内存),他们在释放内存之前需要协商,不可私自释放。
基本对象NS,非基本对象:int char等
,每个对象都有一个retainCount,alloc,retain,
retain的目的是把对象的引用计数+1,
dealloc和release,前者释放,后者把对象引用计数-1,
实验证明,lli所指向的person对象的“引用计数”(reference count)的值为1时,【lli dealloc】是在“引用计数”的值将要减到0的时候被系统自动调用。dealloc之后,一切后灰飞烟灭了,所以如果你想在“引用计数”值为1时,【lli relea】之后,打印“引用计数”的值是不可能的,除非你能够阻止编译器调用dealloc摧毁对象。
*/
}
Person *lli = [[Personalloc]init];
Person *tti = [[Personalloc]init];
Person *nni = [[Personalloc]init];
Dog *dog_1 = [[Dogalloc]init];//retaincount = 1
[llisetDog:dog_1];
[dog_1print_counter];
[lli release];
[dog_1 print_counter];
Dog *dog_2 = [[Dog alloc] init];
[nni setDog:dog_1];
[dog_1 print_counter];
[nni setDog:dog_2];
[dog_1 print_counter];
return0;
}
- OC内存管理-1
- OC内存管理1
- OC+1-内存管理
- OC 内存管理(1)
- 【总结】 - OC内存管理(1)
- OC--内存管理(1)
- OC内存管理-OC笔记
- OC语法<2.1>内存管理:手动内存管理1
- oc学习之旅:内存管理1
- OC内存管理
- Oc-内存管理
- OC内存管理
- OC 内存管理
- oc 内存管理
- OC内存管理
- oc -内存管理 笔记
- OC之【内存管理】
- OC内存管理小记
- ARM地址重映射
- ZOJ - 3802 (状态压缩dp)
- POJ 1486:二分图匹配的必须边
- GDB调试手册
- HTML学习笔记(四)
- OC内存管理-1
- Soot 学习笔记 2:使用 Eclipse 插件
- 实验四
- Unity播放视频(pc,android,ios)
- TCP的定时器
- 第十二周 项目四:银行系统 任务二
- 暴力破解之1-n的全排列
- Matlab 中常用的直线与点形表示属性
- 银行系统(1)构造基本框架