2009-10-29 18 views
6

Başlangıçta bunun işe yarayacağını düşündüm, ama şimdi anlayamıyorum çünkü artistCollection bir "Sanatçı" nesnesi olan bir NSMutableArray.NSMutableArray nesnelerinin diske kaydet/yaz?

@interface Artist : NSObject { 
    NSString *firName; 
    NSString *surName; 
} 

Sorum iyi diske kayıt yolu "Sanatçı" nesnelerin benim NSMutableArray Onlara benim uygulamayı çalıştırmak dahaki sefere yükleyebilir ve böylece ne olduğunu? Sadece son bir şey

artistCollection = [[NSMutableArray alloc] init]; 

newArtist = [[Artist alloc] init]; 
[newArtist setFirName:objFirName]; 
[newArtist setSurName:objSurName]; 
[artistCollection addObject:newArtist]; 

NSLog(@"(*) - Save All"); 
[artistCollection writeToFile:@"/Users/Fgx/Desktop/stuff.txt" atomically:YES]; 

DÜZENLEME

Çok teşekkürler, ben merak ediyorum. "Sanatçı", başka nesnelerin (Uygulamalar) NSMutableArray (softwareOwned) ek bir örnek değişkeni içeriyorsa, kodlamayı bu kapsamı genişletmek için nasıl genişletirim? NSCoding'i "Uygulamalar" nesnesine eklerim, sonra "Sanatçı" kodlamadan önce bunu kodlayın veya bunu "Sanatçı" da belirtmenin bir yolu var mı?

@interface Artist : NSObject { 
    NSString *firName; 
    NSString *surName; 
    NSMutableArray *softwareOwned; 
} 

@interface Application : NSObject { 
    NSString *appName; 
    NSString *appVersion; 
} 

çok teşekkürler

Gary

+0

Düzenlemenizi cevaplamak için: Bununla

@interface Artist : NSObject <NSCoding> { NSString *firName; NSString *surName; } @end @implementation Artist static NSString *FirstNameArchiveKey = @"firstName"; static NSString *LastNameArchiveKey = @"lastName"; - (id)initWithCoder:(NSCoder *)decoder { self = [super init]; if (self != nil) { firName = [[decoder decodeObjectForKey:FirstNameArchiveKey] retain]; surName = [[decoder decodeObjectForKey:LastNameArchiveKey] retain]; } return self; } - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:firName forKey:FirstNameArchiveKey]; [encoder encodeObject:surName forKey:LastNameArchiveKey]; } @end 

, sen koleksiyon kodlayabilir sadece Uygulama sınıf için NSCoding uygulamak ve Artist'in encodeWithCoder: ve initWithCoder: öğesinde, değiştirilebilen dizinin kodlamasını/kodlamasını işlemek için çizgiler ekleyin. Kendisini kodlaması istendiğinde, dizi, Uygulama nesnelerini kendilerinin kodlamasını ister. –

+0

Ah görüyorum, mükemmel, teşekkürler Ole. – fuzzygoat

cevap

18

writeToFile:atomically: için bir egzersiz olarak bırakılmıştır Kakao en toplama sınıfları yalnızca özellik listeleri için, yani yalnızca NSString, NSNumber, diğer koleksiyonlar vb. gibi standart nesneler içeren koleksiyonlar için çalışır.

jdelStrother's answer üzerinde ayrıntılı bilgi için koleksiyonun içerdiği tüm nesneler kendilerini arşivleyebiliyorsa, koleksiyonları NSKeyedArchiver kullanarak arşivleyebilir. Özel sınıf için Bunu uygulamak için, bu NSCoding protokole uygun hale:

NSData* artistData = [NSKeyedArchiver archivedDataWithRootObject:artistCollection]; 
[artistData writeToFile: @"/Users/Fgx/Desktop/stuff" atomically:YES]; 
9

NSKeyedArchiver bir göz atın. Kısaca:

NSData* artistData = [NSKeyedArchiver archivedDataWithRootObject:artistCollection]; 
[artistData writeToFile: @"/Users/Fgx/Desktop/stuff" atomically:YES]; 

Sen encodeWithCoder uygulamak gerekir: senin Sanatçı sınıfına - bkz Apple's docs

arşivden çıkarılıyor (NSKeyedUnarchiver bakınız) okuyucu :) içinde