2011-07-04 20 views
5

我阻止了某些東西,我相信它太大了。 我有這個樣子將自定義對象寫入.plist中的可可

@interface DownloadObject : NSObject <NSCoding>{ 
    NSNumber *key; 
    NSString *name; 
    NSNumber *progress; 
    NSNumber *progressBytes; 
    NSNumber *size; 
    NSString *path; 
} 
@property (copy) NSNumber *key; 
@property (copy) NSString *name; 
@property (copy) NSNumber *progress; 
@property (copy) NSNumber *size; 
@property (copy) NSString *path; 
@property (copy) NSNumber *progressBytes; 
-(id)initWithKey:(NSNumber *)k name:(NSString *)n progress:(NSNumber *)pro size:(NSNumber *)s path:(NSString *)p progressBytes:(NSNumber *)pb; 
@end 

自定義對象和實現

@implementation DownloadObject 
@synthesize size, progress, name, key, path, progressBytes; 

-(id)initWithKey:(NSNumber *)k name:(NSString *)n progress:(NSNumber *)pro size:(NSNumber *)s path:(NSString *)p progressBytes:(NSNumber *)pb 
{ 
    self.key = k; 
    self.name = n; 
    self.progress = pro; 
    self.size = s; 
    self.path = p; 
    self.progressBytes = pb; 

    return self; 
} 

-(id) initWithCoder: (NSCoder*) coder { 
    if (self = [super init]) { 
     self.key = [[coder decodeObjectForKey:@"Key"] retain]; 
     self.name = [[coder decodeObjectForKey:@"Name"] retain]; 
     self.progress = [[coder decodeObjectForKey:@"Progress"] retain]; 
     self.size = [[coder decodeObjectForKey:@"Size"] retain]; 
     self.path = [[coder decodeObjectForKey:@"Path"] retain]; 
     self.progressBytes = [[coder decodeObjectForKey:@"ProgressBytes"]retain]; 
    } 
    return self; 
} 


-(void) encodeWithCoder: (NSCoder*) coder { 
    [coder encodeObject:self.key forKey:@"Key"]; 
    [coder encodeObject:self.name forKey:@"Name"]; 
    [coder encodeObject:self.progress forKey:@"Progress"]; 
    [coder encodeObject:self.size forKey:@"Size"]; 
    [coder encodeObject:self.path forKey:@"Path"]; 
    [coder encodeObject:self.progressBytes forKey:@"ProgressBytes"]; 
} 


-(void)dealloc 
{ 
    [key release]; 
    [name release]; 
    [size release]; 
    [progress release]; 
    [path release]; 
    [progressBytes release]; 
    [super dealloc]; 
} 

@end 

正如你可以看到它實現NSCoding(我是這麼認爲的,NSObject的不符合NSCoding)。現在,當我嘗試做這樣的事情只是爲了測試

downloadArray = [[[NSMutableArray alloc]init]retain]; 
NSNumber *number = [NSNumber numberWithInt:10]; 
DownloadObject *object = [[DownloadObject alloc]initWithKey:number name:@"hey" progress:number size:number path:@"hey" progressBytes:number]; 
[downloadArray addObject:object]; 
[object release]; 
[downloadArray writeToFile:path atomically:YES]; 

downloadArrayNSMutableArray。我的plist讀取/寫入沒有問題,path位於應用程序支持中,當我登錄時顯示plist路徑。

但它只是不寫數組到plist,任何想法?

+0

爲什麼將downloadArray的retainCount設置爲2?只需要\t downloadArray = [[NSMutableArray alloc] init]; –

回答

0

這個工作對我來說:

NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 

[archiver encodeObject:highScoreArray forKey:kHighScoreArrayKey]; 

[archiver finishEncoding]; 

[data writeToFile:[self dataFilePath] atomically:YES]; 

[data release]; 
[archiver release]; 
21

屬性列表文件只能存儲基本數據類型,也不能包含自定義對象。如果您希望將其寫入plist,則需要將對象轉換爲NSData對象。您可以使用NSKeyedArchiver來完成此操作,該操作會將符合NSCoding協議的對象編碼爲NSData對象。

DownloadObject *object = [[DownloadObject alloc]initWithKey:number name:@"hey" progress:number size:number path:@"hey" progressBytes:number]; 
NSData* objData = [NSKeyedArchiver archivedDataWithRootObject:object]; 
[downloadArray addObject:objData]; 
[object release]; 

當你想從NSData對象重建的對象,請使用NSKeyedUnarchiver

NSData* objData = [downloadArray objectAtIndex:0]; 
DownloadObject* object = [NSKeyedUnarchiver unarchiveObjectWithData:objData]; 

你也有好幾個內存泄漏在你的代碼。在你-initWithCoder:方法,你不應該使用訪問器來設置實例變量的值,你應該直接設置實例變量,就像這樣:

key = [[coder decodeObjectForKey:@"Key"] copy]; 

要調用-retain,然後用其指定爲訪問copy,這意味着您的對象的保留計數爲2,並且不會被釋放。一般來說,你應該避免在init方法中使用訪問器。

而且,在你分配你downloadArray對象的代碼,您呼叫-alloc,然後在對象上-retain,這將具有2的retainCount你應該重新閱讀的Objective-C Memory Management Guidelines離開它。

+0

值得嗎?我的意思是,這比僅將屬性轉換爲字典並保存爲字典更高效?爲什麼我需要將我的對象包裝到nsdata中,或者有關於此的一些建議? –

0
BOOL flag = false; 

    ObjectFileClass *obj = [yourMutableArray objectAtIndex:0]; 

    //TO Write Data . . . 

    NSData* archiveData = [NSKeyedArchiver archivedDataWithRootObject:obj.title]; 
    flag =[archiveData writeToFile:path options:NSDataWritingAtomic error:&error]; 
} 


if (flag) { 
    NSLog(@"Written"); 

    //To Read Data . . . 

    NSData *archiveData = [NSData dataWithContentsOfFile:path]; 
    id yourClassInstance = [NSKeyedUnarchiver unarchiveObjectWithData:archiveData]; // choose the type of your class instance . . . 
    NSLog(@"%@",yourClassInstance); 
}else{ 

    NSLog(@"Not Written"); 
} 
相關問題