下面代码,有个地方的临时对象,生成的时候必须执行一次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];
}