2012-01-06 22 views
6

Bir MVC için bir model yapıyorum ve Apple Documentation"Değere dönüştürülebilir bir nesne ayarlansanız bile, NSUserDefaults döndürülen değerler değişmezdir.", [[NSUserDefaults standardUserDefaults] objectForKey: @ "key"], mutable dizisini döndürüyor. NSUserDefaults döndürülebilir bir dizi döndürüyor

Ben koşul yeniden oluşturmak için Xcode 4D199 iOS için bir boş uygulamayı yarattı ve benim proje üzerinde diğer faktörlere karşı sorumlu olmadığını teyit etmektedir.

ben gösterildiği gibi NSMutableArray kuruyorum: Ben gösterildiği gibi nesne alıyorum,

- (void)setupTest 
{ 
    NSMutableArray *mutableArray = [[NSMutableArray alloc] init]; 
    [mutableArray addObject:@"one"]; 
    [mutableArray addObject:@"two"]; 

    [[NSUserDefaults standardUserDefaults] setObject:mutableArray forKey:@"mutableArray_01"]; 
    [[NSUserDefaults standardUserDefaults] synchronize];  
} 

ve elma belgelerine göre, Şimdi

- (void)checkTest 
{ 
    NSMutableArray *mutableArrayInCheck = nil; 
    id whatIsThis = [[NSUserDefaults standardUserDefaults] objectForKey:@"mutableArray_01"]; 
    if([whatIsThis isKindOfClass:[NSMutableArray class]]) 
    { 
     NSLog(@"The array is mutable."); 
     mutableArrayInCheck = (NSMutableArray *)whatIsThis; 
    } 
    if([whatIsThis isKindOfClass:[NSArray class]]) 
    { 
     NSLog(@"The array is immutable."); 
    } 
    if ([whatIsThis isMemberOfClass:[NSMutableArray class]]) 
    { 
     NSLog(@"The array is a member of NSMutableArray class"); 
    } 

    if (mutableArrayInCheck) 
    { 
     [mutableArrayInCheck addObject:@"three"]; 
     NSLog([mutableArrayInCheck description]); 
    } 
} 

, bir konsol beklenebilir sadece immutable satırı görüntüler. Ben kodu çalıştırmak zaman, aşağıdaki satırları konsolda görüntülenir: Burada Eksik bir şey varsa

2012-01-05 18:47:33.328 Tester_01[78533:f803] The array is mutable. 
2012-01-05 18:47:33.348 Tester_01[78533:f803] The array is immutable. 
2012-01-05 18:47:33.349 Tester_01[78533:f803] (
    one, 
    two, 
    three 
) 

Yani, merak ediyorum. Ek bilgi için

testleri yürütür kod olarak gösterilir:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    BOOL setupKey = NO; 
    if (setupKey) 
    { 
     [self setupTest]; 
    } 
    BOOL checkKey = YES; 
    if (checkKey) 
    { 
     [self checkTest]; 
    } 

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

Başlangıçta, ben EVET için setupKey set ile projeyi koştu. İlk çalıştırmadan sonra kurulumKeyNO'u değiştirdim. Konsol günlüğü, KurK01NO'a ayarlandığında bir sonuçtur. Ne düşündüğü söyle.

+1

ben onlar sadece yapmanız gerekir demek sanırım: Bir yöntem NSArray nesneye bir işaretçi dönerse dizi değişken ise aşağıdaki kodda gösterildiği gibi Örneğin, sen, görmek için bu yöntemi kullanmamalıdır Değişken bir dizi elde etmeye değil. Projelerimde genellikle bir "NSMutableArray" öğesini bir "NSArray" işaretçisine atadım, çünkü [NSArray arrayWithArray: mutableArray] işlevi yalnızca çok az fayda sağlayacak şekilde ek yük getiriyordu. – mvds

+1

sadece bir tahmin: değiştirilebilen diziyi kullanıcı varsayılanlarına ekledikten sonra uygulamayı yeniden başlattınız ve yeniden ayarlamadan okumaktan daha fazlasını yaptınız. Görüntüleyebilirim, nesnenin bir seansta aynı kalmasına, serileşene ve diske yazılana ve tekrar okuyacağına kadar. – vikingosegundo

+0

Evet, sorunun sonunda açıkladığım gibi, *** setupKey *** ** YES ** olarak ayarlandığında, uygulamayı ilk çalıştırdığımda değiştirilebilen diziyi ayarlıyorum. Bundan sonra, *** setupKey *** 'i ** NO ** olarak ayarladıktan sonra yukarıda açıklanan konsol çıktısını almak için uygulamayı yeniden başlattım. – Jin

cevap

2

Kesin olarak haklısınız. "Döndürülen değerler immutable" ifadesi kafa karıştırıcıdır, çünkü bu, değiştirilebilen bir nesnenin imkansız olması gerektiği gibi görünür. Ancak, ifadenin "Döndürülen değerlerin değiştirilemeyeceği garanti edilemez" şeklinde okunmalıdır. Bu nedenle, bir değişken diziyi saklasanız bile, değeri geri okuduğunuzda, bir NSArray nesnesi (NSMutableArray değişken alt sınıfının bir nesnesi olabilir) elde edersiniz, ancak bu garanti edilemez ve çalıştırılanlar arasında değişebilir veya dizi içeriği). yöntemin isKindOfClass

+0

Gerçekten. Bu uygulama ayrıntısına güvenmek çok kötü bir fikir olabilir çünkü aynı zamanda OSX'in veya iOS'un gelecekteki sürümlerinde de değişiklik olması muhtemeldir. –

+0

İyi nokta. Belgeleme, gerçekten böyle bir durumda, onu nasıl tarif ettiğine göre yeniden ifade etmelidir. Her neyse, bu noktada, NSUserDefaults'dan aldığımda yeni bir NSMutableArray başlatmak için sadece dikkatli olmalı ve içeriği ayıklamak zorunda kalacağım. – Jin

1

bir sınıf kümesi ile temsil nesneler üzerinde bu yöntemi kullanırken

dikkat sınıf küme

sonraki paragraf belgelerinde olduğu için uygun değildir. Sınıf kümelerinin niteliğinden dolayı, geri aldığınız nesne her zaman beklediğiniz türde olmayabilir. Bir sınıf kümesi döndüren bir yöntem çağırırsanız, yöntem tarafından döndürülen tam tür, bu nesne ile yapabilecekleriniz için en iyi göstergedir.

// DO NOT DO THIS! 
//if ([myArray isKindOfClass:[NSMutableArray class]]) 
//{ 
// Modify the object 
//}