object-c的Dealloc

当你自己的类中包含有其它对象时,就得负责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/



       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值