iPhone/Mac Objective-C内存管理教程和原理剖析

本文深入解析了Objective-C的内存管理原理,包括基本原理、口诀与范式,并通过多个实例展示了如何在实际应用中正确管理内存,避免常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//================================================================================================
// memman-no-pool.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-no-pool.m -I /GNUstep/System/Library/Headers
//gcc -o memman-no-pool memman-no-pool.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-no-pool

#import <Foundation/Foundation.h>  
 
@interface ClassA : NSObject
{
}
-(void) hello;
@end
 
@implementation ClassA
-(void) hello
{
	NSLog(@"hellon");
}

-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassA destroyedn");
}
@end

void func()
{
	NSLog(@"{ beginn");
	NSLog(@"alloc obj1");
	ClassA *obj1 = [[ClassA alloc] init];
	NSLog(@"obj1's retain count is %dn", [obj1 retainCount]);
	NSLog(@"assign obj1 to obj2n");
	ClassA *obj2 = obj1;
	NSLog(@"obj2's retain count is %d before retainn", [obj2 retainCount]);
	NSLog(@"obj2 retainn");
	[obj2 retain];
	NSLog(@"obj2's retain count is %d after retainn", [obj2 retainCount]);
	NSLog(@"obj1 says hellon");
	[obj1 hello];
	NSLog(@"releasing obj1n");
	NSLog(@"obj1's retain count is %d before releasen", [obj1 retainCount]);
	[obj1 release];
	NSLog(@"obj1's retain count is %d after releasen", [obj1 retainCount]);
	NSLog(@"obj2 says hellon");
	[obj2 hello];
	NSLog(@"releasing obj2n");
	NSLog(@"obj2's retain count is %d before releasen", [obj2 retainCount]);
	[obj2 release];
	
	NSLog(@"} endn");
}

int main(int argc, char**argv)  
{    
	func();
	return 0;
}  

//================================================================================================
// memman-with-pool.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-with-pool.m -I /GNUstep/System/Library/Headers
//gcc -o memman-with-pool memman-with-pool.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-with-pool

#import <Foundation/Foundation.h>  
 
@interface ClassA : NSObject
{
}
-(void) hello;
@end
 
@implementation ClassA
-(void) hello
{
	NSLog(@"hellon");
}

-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassA destroyedn");
}
@end

void func()
{
	NSLog(@"{ beginn");
	NSLog(@"alloc obj1 and autorelease");
	ClassA *obj1 = [[[ClassA alloc] init] autorelease];
	NSLog(@"obj1's retain count is %dn", [obj1 retainCount]);
	NSLog(@"assign obj1 to obj2n");
	ClassA *obj2 = obj1;
	NSLog(@"obj2's retain count is %d before retainn", [obj2 retainCount]);
	NSLog(@"obj2 retainn");
	[obj2 retain];
	NSLog(@"obj2's retain count is %d after retainn", [obj2 retainCount]);
	NSLog(@"obj1 says hellon");
	[obj1 hello];
	//NSLog(@"releasing obj1n");
	//NSLog(@"obj1's retain count is %d before releasen", [obj1 retainCount]);
	//[obj1 release]; // Do not release it
	NSLog(@"obj1's retain count is %d after releasen", [obj1 retainCount]);
	NSLog(@"obj2 says hellon");
	[obj2 hello];
	NSLog(@"releasing obj2n");
	NSLog(@"obj2's retain count is %d before releasen", [obj2 retainCount]);
	[obj2 release];
	NSLog(@"obj2's retain count is %d after releasen", [obj2 retainCount]);
	NSLog(@"Note: we don't release obj1n");
	
	NSLog(@"} endn");
}

int main(int argc, char**argv)  
{    
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];    
 
	func();
	
	NSLog(@"releasing autoreleasePooln"); 
	[pool release]; 
	NSLog(@"autoreleasePool is releasedn"); 
	
	return 0;
}  

//================================================================================================
// memman-many-objs-one-pool.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-many-objs-one-pool.m -I /GNUstep/System/Library/Headers
//gcc -o memman-many-objs-one-pool memman-many-objs-one-pool.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-many-objs-one-pool

#import <Foundation/Foundation.h>  
 
@interface ClassA : NSObject
{
}
-(void) hello;
@end
 
@implementation ClassA
-(void) hello
{
	NSLog(@"hellon");
}

-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassA destroyedn");
}
@end

void func()
{
	NSLog(@"Many objects but one pooln");
	
	int i, j;
	for (i = 0; i < 100; i++ )
	{
		for (j = 0; j < 100000; j++ )
			[NSString stringWithFormat:@"1234567890"];
	}

}

int main(int argc, char**argv)  
{    
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];    
 
	func();
	
	NSLog(@"releasing autoreleasePooln"); 
	[pool release]; 
	NSLog(@"autoreleasePool is releasedn"); 
	
	return 0;
}  

//================================================================================================
// memman-many-objs-many-pools.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-many-objs-many-pools.m -I /GNUstep/System/Library/Headers
//gcc -o memman-many-objs-many-pools memman-many-objs-many-pools.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-many-objs-many-pools

#import <Foundation/Foundation.h>  
 
@interface ClassA : NSObject
{
}
-(void) hello;
@end
 
@implementation ClassA
-(void) hello
{
	NSLog(@"hellon");
}

-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassA destroyedn");
}
@end

void func()
{
	NSLog(@"Many objects and many poolsn");
	
	int i, j;
	for (i = 0; i < 100; i++ )
	{
		NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
		for (j = 0; j < 100000; j++ )
			[NSString stringWithFormat:@"1234567890"];
		[loopPool release];
	}

}

int main(int argc, char**argv)  
{    
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];    
 
	func();
	
	NSLog(@"releasing autoreleasePooln"); 
	[pool release]; 
	NSLog(@"autoreleasePool is releasedn"); 
	
	return 0;
}  

//================================================================================================
// memman-property.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-property.m -I /GNUstep/System/Library/Headers
//gcc -o memman-property memman-property.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-property

#import <Foundation/Foundation.h>  

@interface ClassB : NSObject
{
	int index;
}

@property int index;

-(void) hello;
@end

@implementation ClassB

@synthesize index;

-(void) hello
{
	NSLog(@"hello ClassBn");
}

-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassB %d destroyedn", index);
	
}
@end

@interface ClassA : NSObject
{
	ClassB* objB;
}

@property (retain) ClassB* objB;
-(void) hello;
@end

@implementation ClassA

@synthesize objB;

-(void) hello
{
	NSLog(@"hello ClassAn");
}

-(void) dealloc
{
	NSLog(@"releasing internal member objBn");
	[objB release];
	[super dealloc];
	NSLog(@"ClassA destroyedn");
}
@end

void funcNoAutorelease()
{
	NSLog(@"---------No autorelase---------n");
	
	ClassB *objB1 = [[ClassB alloc]init];
	objB1.index = 1;
	
	ClassA *objA = [[ClassA alloc]init];
	NSLog(@"setting objB1n");
	objA.objB = objB1;
	[objB1 release];
	
	ClassB *objB2 = [[ClassB alloc]init];
	objB2.index = 2;
	
	NSLog(@"setting objB2n");
	objA.objB = objB2;
	[objB2 release];
	
	[objA release];
	
}

void funcAutorelease()
{
	NSLog(@"---------autorelase---------n");
	
	ClassB *objB1 = [[[ClassB alloc]init] autorelease];
	objB1.index = 1;
	
	ClassA *objA = [[[ClassA alloc]init] autorelease];
	NSLog(@"setting objB1n");
	objA.objB = objB1;
	
	ClassB *objB2 = [[[ClassB alloc]init] autorelease];
	objB2.index = 2;
	
	NSLog(@"setting objB2n");
	objA.objB = objB2;
}

int main (int argc, const char * argv[]) {
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];    
	
	funcNoAutorelease();
	funcAutorelease();
	
	NSLog(@"releasing autoreleasePooln"); 
	[pool release]; 
	NSLog(@"autoreleasePool is releasedn"); 
	
	return 0;
}

//================================================================================================
// memman-getter-setter.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-getter-setter.m -I /GNUstep/System/Library/Headers
//gcc -o memman-getter-setter memman-getter-setter.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-getter-setter

#import <Foundation/Foundation.h>  
 
//-----------------------------------------------
// Class B
@interface ClassB : NSObject
{
	int index;
}

-(int) getIndex;
-(void) setIndex:(int) value;

-(void) hello;
@end
 
@implementation ClassB

-(int) getIndex
{
	return index;
}

-(void) setIndex:(int) value
{
	index = value;
}

-(void) hello
{
	NSLog(@"hello ClassBn");
}

-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassB %d destroyedn", index);
}
@end

//-----------------------------------------------
// Class A
@interface ClassA : NSObject
{
	ClassB *objB;
}

-(ClassB *) getObjB;
-(void) setObjB:(ClassB *) value;

-(void) hello;
@end
 
@implementation ClassA

-(ClassB*) getObjB
{
	return objB;
}

-(void) setObjB:(ClassB*) value
{
	if (objB != value)
	{
		[objB release];
		objB = [value retain];
		NSLog(@"objB's retain count is %dn", [objB retainCount]);
	}
}


-(void) hello
{
	NSLog(@"hello ClassAn");
}

-(void) dealloc
{
	NSLog(@"releasing internal member objBn");
	[objB release];
	[super dealloc];
	NSLog(@"ClassA destroyedn");
}
@end

void funcNoAutorelease()
{
	NSLog(@"---------No autorelease---------n");
	
	ClassB *objB1 = [[ClassB alloc]init];
	[objB1 setIndex:1];

	ClassA *objA = [[ClassA alloc]init];
	NSLog(@"setting objB1n");
	[objA setObjB:objB1];
	[objB1 release];

	ClassB *objB2 = [[ClassB alloc]init];
	[objB2 setIndex:2];

	NSLog(@"setting objB2n");
	[objA setObjB:objB2];
	[objB2 release];

	[objA release];

}

void funcAutorelease()
{
	NSLog(@"--------autorelease-----------n");
	
	ClassB *objB1 = [[[ClassB alloc]init] autorelease];
	[objB1 setIndex:1];

	ClassA *objA = [[[ClassA alloc]init] autorelease];
	NSLog(@"setting objB1n");
	[objA setObjB:objB1];

	ClassB *objB2 = [[[ClassB alloc]init] autorelease];
	[objB2 setIndex:2];

	NSLog(@"setting objB2n");
	[objA setObjB:objB2];
}

int main(int argc, char**argv)  
{    
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];    
 
	funcNoAutorelease();
	funcAutorelease();
	
	NSLog(@"releasing autoreleasePooln"); 
	[pool release]; 
	NSLog(@"autoreleasePool is releasedn"); 
	
	return 0;
}  

//================================================================================================
// memman-run-loop-with-pool.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-run-loop-with-pool.m -I /GNUstep/System/Library/Headers
//gcc -o memman-run-loop-with-pool memman-run-loop-with-pool.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-run-loop-with-pool

#import <Foundation/Foundation.h>  
 
//-----------------------------------------------
// Class B
@interface ClassB : NSObject
{
}
@end
 
@implementation ClassB
-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassB destroyedn");
}
@end

//-----------------------------------------------
// Class A
@interface ClassA : NSObject
{
}
-(ClassB*) createClassB;
@end
 
@implementation ClassA
-(ClassB*) createClassB
{
	NSLog(@"create an instance of ClassB and autoreleasen");
	return [[[ClassB alloc] init] autorelease];
}

-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassA destroyedn");
}
@end

void func()
{
	NSLog(@"{ beginn");
	
	NSLog(@"create an instance of ClassA and autoreleasen");
	ClassA *obj1 = [[[ClassA alloc] init] autorelease];
	NSDate *now = [[NSDate alloc] init];
	NSTimer *timer = [[NSTimer alloc] initWithFireDate:now
		interval:0.0
		target:obj1
		selector:@selector(createClassB)
		userInfo:nil
		repeats:NO];

	NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
	[runLoop addTimer:timer forMode:NSDefaultRunLoopMode];

	[timer release];
	[now release];

	[runLoop run];
	
	NSLog(@"} endn");
}

int main(int argc, char**argv)  
{
	NSLog(@"create an autoreleasePooln");
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];    
 
	func();
	
	NSLog(@"releasing autoreleasePooln"); 
	[pool release]; 
	NSLog(@"autoreleasePool is releasedn"); 
	
	return 0;
}  

//================================================================================================
// memman-run-loop-without-pool.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-run-loop-without-pool.m -I /GNUstep/System/Library/Headers
//gcc -o memman-run-loop-without-pool memman-run-loop-without-pool.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-run-loop-without-pool

#import <Foundation/Foundation.h>  
 
//-----------------------------------------------
// Class B
@interface ClassB : NSObject
{
}
@end
 
@implementation ClassB
-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassB destroyedn");
}
@end

//-----------------------------------------------
// Class A
@interface ClassA : NSObject
{
}
-(ClassB*) createClassB;
@end
 
@implementation ClassA
-(ClassB*) createClassB
{
	NSLog(@"create an instance of ClassB and autoreleasen");
	return [[[ClassB alloc] init] autorelease];
}

-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassA destroyedn");
}
@end

void func()
{
	NSLog(@"{ beginn");
	
	NSLog(@"create an instance of ClassAn");
	ClassA *obj1 = [[ClassA alloc] init];
	NSDate *now = [[NSDate alloc] init];
	NSTimer *timer = [[NSTimer alloc] initWithFireDate:now
		interval:0.0
		target:obj1
		selector:@selector(createClassB)
		userInfo:nil
		repeats:NO];

	NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
	[runLoop addTimer:timer forMode:NSDefaultRunLoopMode];

	[timer release];
	[now release];

	[runLoop run];
	
	NSLog(@"Manually release the instance of ClassAn");
	[obj1 release];
	
	NSLog(@"} endn");
}

int main(int argc, char**argv)  
{
	NSLog(@"No autoreleasePool createdn");
 
	func();
	
	return 0;
}  

//===============================================================================================

(1)
《iPhone/Mac Objective-C内存管理教程和原理剖析(一)基本原理》
[转]http://www.cnblogs.com/VinceYuan/archive/2010/03/08/1680488.html


(2)
《iPhone/Mac Objective-C内存管理教程和原理剖析(二)口诀与范式》
[转]http://www.cnblogs.com/VinceYuan/archive/2010/03/08/1680492.html

标题SpringBoot基层智能化人员调度系统研究AI更换标题第1章引言介绍SpringBoot基层智能化人员调度系统的研究背景、意义、现状以及论文的研究方法创新点。1.1研究背景与意义分析当前基层人员调度的现状问题,阐述智能化调度的必要性意义。1.2国内外研究现状概述国内外在基层智能化人员调度系统方面的研究进展应用情况。1.3论文方法及创新点介绍本文采用的研究方法实现智能化人员调度系统的创新点。第2章相关理论阐述SpringBoot框架、智能化调度算法人员调度理论。2.1SpringBoot框架概述介绍SpringBoot框架的特点、优势应用场景。2.2智能化调度算法总结现有的智能化调度算法,并分析其优缺点。2.3人员调度理论基础阐述人员调度的基本概念、原则方法。第3章系统需求分析对SpringBoot基层智能化人员调度系统进行需求分析,包括功能性需求非功能性需求。3.1功能性需求明确系统需要实现的功能,如人员信息管理、任务分配、调度策略制定等。3.2非功能性需求分析系统的性能、安全性、可靠性等非功能性需求。3.3需求优先级划分根据实际需求,对各项需求进行优先级划分。第4章系统设计详细介绍SpringBoot基层智能化人员调度系统的设计方案,包括架构设计、数据库设计界面设计。4.1架构设计给出系统的整体架构,包括前后端分离、微服务架构等设计理念。4.2数据库设计设计合理的数据库表结构,满足系统的数据存储查询需求。4.3界面设计设计简洁、易用的用户界面,提升用户体验。第5章系统实现阐述SpringBoot基层智能化人员调度系统的具体实现过程,包括核心代码实现、功能模块实现等。5.1核心代码实现详细介绍系统核心功能的代码实现,如人员信息管理、任务分配算法等。5.2功能模块实现分别介绍各个功能模块的实现过程,如用户登录、人员信息管理、任务管理等。第6章系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值