本次主要讲解的是 :autorelease
//
// main.m
// MemoryManagement
//
// Created by b126 on 12-4-23.
// Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
{
}
-(void) hello;
@end
@implementation ClassA
-(void) hello
{
NSLog(@"hello\n");
}
-(void) dealloc
{
[super dealloc];
NSLog(@"ClassA destroyed\n");
}
@end
void func()
{
NSLog(@"{ begin\n");
NSLog(@"alloc obj1 and autorelease");
ClassA *obj1 = [[[ClassA alloc] init] autorelease];
NSLog(@"obj1's retain count is %lx\n", (unsigned long)[obj1 retainCount]);
NSLog(@"assign obj1 to obj2\n");
ClassA *obj2 = obj1;
NSLog(@"obj2's retain count is %lx before retain\n", (unsigned long)[obj2 retainCount]);
NSLog(@"obj2 retain\n");
[obj2 retain];
NSLog(@"obj2's retain count is %lx after retain\n", (unsigned long)[obj2 retainCount]);
NSLog(@"obj1 says hello\n");
[obj1 hello];
NSLog(@"releasing obj1\n");
NSLog(@"obj1's retain count is %lx before release\n", (unsigned long)[obj1 retainCount]);
//[obj1 release]; // Do not release it
NSLog(@"obj1's retain count is %lx after release\n", (unsigned long)[obj1 retainCount]);
NSLog(@"obj2 says hello\n");
[obj2 hello];
NSLog(@"releasing obj2\n");
NSLog(@"obj2's retain count is %lx before release\n", (unsigned long)[obj2 retainCount]);
[obj2 release];
NSLog(@"obj2's retain count is %lx after release\n", (unsigned long)[obj2 retainCount]);
NSLog(@"Note: we don't release obj1\n");
NSLog(@"} end\n");
}
int main(int argc, char**argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
func();
NSLog(@"releasing autoreleasePool\n");
[pool release];
NSLog(@"autoreleasePool is released\n");
return 0;
}
输出的结果是:
2012-04-24 19:15:45.708 MemoryManagement[15327:403] { begin
2012-04-24 19:15:45.750 MemoryManagement[15327:403] alloc obj1 and autorelease
2012-04-24 19:15:45.752 MemoryManagement[15327:403] obj1's retain count is 1
2012-04-24 19:15:45.753 MemoryManagement[15327:403] assign obj1 to obj2
2012-04-24 19:15:45.754 MemoryManagement[15327:403] obj2's retain count is 1 before retain
2012-04-24 19:15:45.755 MemoryManagement[15327:403] obj2 retain
2012-04-24 19:15:45.755 MemoryManagement[15327:403] obj2's retain count is 2 after retain
2012-04-24 19:15:45.757 MemoryManagement[15327:403] obj1 says hello
2012-04-24 19:15:45.758 MemoryManagement[15327:403] hello
2012-04-24 19:15:45.759 MemoryManagement[15327:403] releasing obj1
2012-04-24 19:15:45.759 MemoryManagement[15327:403] obj1's retain count is 2 before release
2012-04-24 19:15:45.760 MemoryManagement[15327:403] obj1's retain count is 2 after release
2012-04-24 19:15:45.761 MemoryManagement[15327:403] obj2 says hello
2012-04-24 19:15:45.762 MemoryManagement[15327:403] hello
2012-04-24 19:15:45.762 MemoryManagement[15327:403] releasing obj2
2012-04-24 19:15:45.763 MemoryManagement[15327:403] obj2's retain count is 2 before release
2012-04-24 19:15:45.764 MemoryManagement[15327:403] obj2's retain count is 1 after release
2012-04-24 19:15:45.764 MemoryManagement[15327:403] Note: we don't release obj1
2012-04-24 19:15:45.765 MemoryManagement[15327:403] } end
2012-04-24 19:15:45.766 MemoryManagement[15327:403] releasing autoreleasePool
2012-04-24 19:15:45.767 MemoryManagement[15327:403] ClassA destroyed
2012-04-24 19:15:45.768 MemoryManagement[15327:403] autoreleasePool is released
当我的代码是:
//
// main.m
// MemoryManagement
//
// Created by b126 on 12-4-23.
// Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
{
}
-(void) hello;
@end
@implementation ClassA
-(void) hello
{
NSLog(@"hello\n");
}
-(void) dealloc
{
[super dealloc];
NSLog(@"ClassA destroyed\n");
}
@end
void func()
{
NSLog(@"{ begin\n");
NSLog(@"alloc obj1 and autorelease");
ClassA *obj1 = [[[ClassA alloc] init] autorelease];
NSLog(@"obj1's retain count is %lx\n", (unsigned long)[obj1 retainCount]);
NSLog(@"assign obj1 to obj2\n");
ClassA *obj2 = obj1;
NSLog(@"obj2's retain count is %lx before retain\n", (unsigned long)[obj2 retainCount]);
NSLog(@"obj2 retain\n");
[obj2 retain];
NSLog(@"obj2's retain count is %lx after retain\n", (unsigned long)[obj2 retainCount]);
NSLog(@"obj1 says hello\n");
[obj1 hello];
//NSLog(@"releasing obj1\n");
//NSLog(@"obj1's retain count is %lx before release\n", (unsigned long)[obj1 retainCount]);
//[obj1 release]; // Do not release it
//NSLog(@"obj1's retain count is %lx after release\n", (unsigned long)[obj1 retainCount]);
NSLog(@"obj2 says hello\n");
[obj2 hello];
NSLog(@"releasing obj2\n");
NSLog(@"obj2's retain count is %lx before release\n", (unsigned long)[obj2 retainCount]);
[obj2 release];
NSLog(@"obj2's retain count is %lx after release\n", (unsigned long)[obj2 retainCount]);
NSLog(@"Note: we don't release obj1\n");
NSLog(@"} end\n");
}
int main(int argc, char**argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
func();
NSLog(@"releasing autoreleasePool\n");
[pool release];
NSLog(@"autoreleasePool is released\n");
return 0;
}
输出为:
2012-04-24 19:17:30.762 MemoryManagement[15337:403] { begin
2012-04-24 19:17:30.765 MemoryManagement[15337:403] alloc obj1 and autorelease
2012-04-24 19:17:30.766 MemoryManagement[15337:403] obj1's retain count is 1
2012-04-24 19:17:30.766 MemoryManagement[15337:403] assign obj1 to obj2
2012-04-24 19:17:30.767 MemoryManagement[15337:403] obj2's retain count is 1 before retain
2012-04-24 19:17:30.768 MemoryManagement[15337:403] obj2 retain
2012-04-24 19:17:30.769 MemoryManagement[15337:403] obj2's retain count is 2 after retain
2012-04-24 19:17:30.769 MemoryManagement[15337:403] obj1 says hello
2012-04-24 19:17:30.770 MemoryManagement[15337:403] hello
2012-04-24 19:17:30.771 MemoryManagement[15337:403] obj2 says hello
2012-04-24 19:17:30.772 MemoryManagement[15337:403] hello
2012-04-24 19:17:30.777 MemoryManagement[15337:403] releasing obj2
2012-04-24 19:17:30.778 MemoryManagement[15337:403] obj2's retain count is 2 before release
2012-04-24 19:17:30.779 MemoryManagement[15337:403] obj2's retain count is 1 after release
2012-04-24 19:17:30.779 MemoryManagement[15337:403] Note: we don't release obj1
2012-04-24 19:17:30.780 MemoryManagement[15337:403] } end
2012-04-24 19:17:30.781 MemoryManagement[15337:403] releasing autoreleasePool
2012-04-24 19:17:30.782 MemoryManagement[15337:403] ClassA destroyed
2012-04-24 19:17:30.782 MemoryManagement[15337:403] autoreleasePool is released