待解决---无名的临时对象,内存到底何时被释放,引用计数是如何控制的

下面代码,有个地方的临时对象,生成的时候必须执行一次retain,否则后面就会报运行时异常,原因是为何呢?


#import <Foundation/Foundation.h>

@interface person :NSObject <NSCoding>

{

    NSMutableString *name;

    NSNumber *pid;

}

@property(assign) NSMutableString *name;                     

@property(assign) NSNumber *pid;                               

-(void) encodeWithCoder:(NSCoder *)aCoder;

-(id) initWithCoder:(NSCoder *)aDecoder;

//-(void) dealloc;

@end


@implementation person :NSObject

@synthesize name,pid;

-(void) encodeWithCoder:(NSCoder *)aCoder

{

    [aCoder encodeObject:name forKey:@"person_name"];

    [aCoder encodeObject:pid forKey:@"person_id"];

}

-(id) initWithCoder:(NSCoder *)aDecoder

{

    name=[[aDecoder decodeObjectForKey:@"person_name"] retain];

    pid=[[aDecoder decodeObjectForKey:@"person_id"] retain];

    //这两行必须加retain ,否则下面的 printf("name=%s,pid=%i\n",p2.name.UTF8String,p2.pid.intValue);  会报错

//    name=[aDecoder decodeObjectForKey:@"person_name"];

//    pid=[aDecoder decodeObjectForKey:@"person_id"];

    return self;

}

//-(void) dealloc

//{

//    

//    [name dealloc];

//    [pid dealloc];

//    [super release];   //这为什么不直接dealloc呢?

//    

//}

@end


#import <Foundation/Foundation.h>


int main(int argc, const char * argv[]) {

    NSAutoreleasePool *pool=[NSAutoreleasePool new];

    person *p=[person new];

    //[p autorelease];

    p.pid=[NSNumber numberWithInt:1];                           //这种临时生成的对象所占内存啥时候释放呢?

    p.name=[NSMutableString stringWithString:@"liji"];

    printf("name=%s,pid=%i\n",p.name.UTF8String,p.pid.intValue);

    person *p2;

    if([NSKeyedArchiver archiveRootObject:p toFile:@"test3.txt"])

    {

        printf("写出自定义类对象成功\n");

        p2=[NSKeyedUnarchiver unarchiveObjectWithFile:@"test3.txt"];

        if(p2!=nil)

        {

            //[p2 autorelease];

            printf("自定义对象读档成功\n");

            printf("name=%s,pid=%i\n",p2.name.UTF8String,p2.pid.intValue);    //这样运行时报错

        }

        p2.name=[NSMutableString stringWithString:@"zhangsan"];

        printf("%s\n",p.name.UTF8String);

        printf("%s\n",p2.name.UTF8String);     //

    }

    else

        printf("写出自定义类对象失败\n");

    [pool drain];

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值