2011-07-04 21 views
5

Bir şeye engelliyorum ve çok büyük olduğundan eminim. BuÖzel nesneyi .plist uygulamasına bir küme yazın.

@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 

benziyor özel bir nesne Ve bunu NSCoding uygulamak görebileceğiniz gibi

@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 

uygulama var (ben öyle düşünüyorum, NSObject NSCoding uymadığı). Böyle bir şey yapmaya çalıştığında Şimdi sadece

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]; 

downloadArray bir NSMutableArray olduğunu test etmek. Benim plist okuma/yazma iyi, uygulama desteğinde path bulunur ve oturum açtığımda plist yolunu gösterir.

Ama bu diziyi sadece plist'e yazmıyor, herhangi bir fikrin var mı?

+0

Neden retainCount downloadArray değerini 2 olarak ayarladınız? Yalnızca \t indirArray = [[NSMutableArray alloc] init]; –

cevap

0

Bu benim için çalışıyor:

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

Mülkiyet listesi dosyaları yalnızca temel veri türlerini saklayabilir ve özel nesneleri içeremez. Eğer plist'e yazılmasını istiyorsanız, nesneyi bir NSData nesnesine dönüştürmeniz gerekir. Bunu, NSCoding protokolüne uygun bir nesneyi NSData nesnesine kodlayan NSKeyedArchiver ile yapabilirsiniz.

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]; 

Eğer NSData nesneden nesneye yeniden istiyoruz

, sen NSKeyedUnarchiver kullanın:

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

Ayrıca kodda birkaç hafıza sızıntıları var. senin -initWithCoder: yöntemde, Ivars değerini ayarlamak için erişimcileri kullanarak olmamalı sadece gibi pek doğrudan ivars belirlesin:

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

Sen olarak belirtilir erişimciyi kullanarak daha sonra -retain arayıp edilir copy, bu sizin nesnenin 2 bir tutma sayısına sahip olduğu ve serbest bırakılmayacağı anlamına gelecektir. Genel olarak, init yöntemlerinde erişimcileri kullanmaktan kaçınmalısınız.

Ayrıca size downloadArray nesne tahsis kodunda, lütfen Objective-C Memory Management Guidelines yeniden okumalısınız 2 bir retainCount ile bırakacağım -alloc ve nesne üzerinde daha sonra -retain, çağrıda bulunuyorlar.

+0

buna değer mi? Yani, bu sadece mülkleri sözlüğe çevirmekten ve sözlük olarak kaydetmekten daha üretken mi? Neden nesneyimi nsdata'ya sarmam gerekiyor veya bu konuda bazı öneriler var mı? –

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"); 
}