object-c的Dealloc

来源:互联网 发布:ultraedit汉化软件 编辑:程序博客网 时间:2024/09/21 09:28
当你自己的类中包含有其它对象时,就得负责dealloc它们,通过重写dealloc函数。

1. 例子代码:
//1. AddressCard.h
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>


@interface AddressCard: NSObject {
    NSString *first;
    NSString *last;
    NSString *email;
}

-(AddressCard*) initWithFirst: (NSString*) f last: (NSString*) l email: (NSString*) e;
-(NSString*) first;
-(NSString*) last;
-(NSString*) email;
-(void) setFirst: (NSString*) f;
-(void) setLast: (NSString*) l;
-(void) setEmail: (NSString*) e;
-(void) setFirst: (NSString*) f last: (NSString*) l email: (NSString*) e;
-(void) setFirst: (NSString*) f last: (NSString*) l;
-(void) print;
@end


//2. AddressCard.m
#import "AddressCard.h"
#import <stdio.h>


@implementation AddressCard
-(AddressCard*) initWithFirst: (NSString*) f last: (NSString*) l email: (NSString*) e {
    self = [super init];


    if ( self ) {
        [self setFirst: f last: l email: e];
    }


    return self;
}


-(NSString*) first {
    return first;
}


-(NSString*) last {
    return last;
}


-(NSString*) email {
    return email;
}


-(void) setFirst: (NSString*) f {
    [f retain];
    [first release];
    first = f;
}


-(void) setLast: (NSString*) l {
    [l retain];
    [last release];
    last = l;
}


-(void) setEmail: (NSString*) e {
    [e retain];
    [email release];
    email = e;
}


-(void) setFirst: (NSString*) f last: (NSString*) l email: (NSString*) e {
    [self setFirst: f];
    [self setLast: l];
    [self setEmail: e];
}


-(void) setFirst: (NSString*) f last: (NSString*) l {
    [self setFirst: f];
    [self setLast: l];
}


-(void) print {
    printf( "%s %s <%s>", [first cString], [last cString], [email cString] );
}


-(void) dealloc {
    [first release];
    [last release];
    [email release];


    [super dealloc];
}
@end


//3. main.m
#import "AddressCard.h"
#import <Foundation/NSString.h>
#import <stdio.h>


int main( int argc, const char *argv[] ) {
    NSString *first =[[NSString alloc] initWithCString: "Tom"];
    NSString *last = [[NSString alloc] initWithCString: "Jones"];
    NSString *email = [[NSString alloc] initWithCString: "tom@jones.com"];
    AddressCard *tom = [[AddressCard alloc] initWithFirst: first last: last email: email];


    // we'return done with the strings, so we must dealloc them
    [first release];
    [last release];
    [email release];


    // print to show the retain count
    printf( "Retain count: %i\n", [[tom first] retainCount] );
    [tom print];
    printf( "\n" );
    
    // free memory
    [tom release];


    return 0;
}



2. 编译运行:
gcc -fconstant-string-class=NSConstantString -c main.m -I /GNUstep/System/Library/Headers
gcc -c AddressCard.m -I /GNUstep/System/Library/Headers
gcc main.o AddressCard.o  -o main -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base


$ ./main.exe
Retain count: 1
Tom Jones <tom@jones.com>
 
3. 说明:
  (1). 一定要先用retain保留一份引用计数,用完它之后,才能再调用release去使得引用计数减1; 

  (2). 这个实例展示了定义自己的类时,如果成员变量是其它对象的引用时,该如何处理。

4. 补充:

   关于更多的内存使用,回收的内容,可以参考下面给出的链网址来进一步学习和理解:

http://vinceyuan.cnblogs.com/



       
原创粉丝点击