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.
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
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
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