0

私のアプリでは、3 つの異なる plist を使用しています。そのうちの 2 つは正常に動作しますが、3 番目にアクセスしようとすると、iPad でクラッシュします。シミュレーターで正常に動作します。

これが私のplistにアクセスするために使用するコードです

NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];
self.path = [documentsDirectory stringByAppendingPathComponent:@"profiles.plist"];
self.path2 = [documentsDirectory stringByAppendingPathComponent:@"services.plist"];

NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:path])
{
    NSString *bundle = [[NSBundle mainBundle] pathForResource:@"profiles" ofType:@"plist"];
    [fileManager copyItemAtPath:bundle toPath:path error:&error];
}

if (![fileManager fileExistsAtPath:path2])
{
    NSString *bundle = [[NSBundle mainBundle] pathForResource:@"services" ofType:@"plist"];
    [fileManager copyItemAtPath:bundle toPath:path2 error:&error];
}

私がそれに書きに行くとき

NSString *pName = profileName;
[self dismissModalViewControllerAnimated:YES];

NSMutableArray *profilesArr = [[[NSMutableArray alloc] initWithContentsOfFile:path]autorelease];
NSMutableDictionary *tempDict = [[[NSMutableDictionary alloc] init ]autorelease] ;

NSMutableArray *tempArr = [[[NSMutableArray alloc] init]autorelease];

for (int i = 0; i < [self.visibleLegend count]; i++)
{
    NSMutableDictionary *legendDict = [[[NSMutableDictionary alloc] init]autorelease];
    AGSLayerDefinition *layer = [self.visibleLegend objectAtIndex:i];
    NSString *layerDef = layer.definition;
    NSString *layerId = [NSString stringWithFormat:@"%d", layer.layerId];
    NSLog(@"save ID %@, save DEF %@", layerId, layerDef);

    [legendDict setObject:layerId forKey:@"layerID"];
    [legendDict setObject:layerDef forKey:@"layerDEF"];

    [tempArr addObject:legendDict];
}

NSString *dynamicURL = [self findServiceName:[self.dynamicLayer.URL absoluteString]];
NSString *tiledURL = [self findServiceName:[self.tiledLayer.URL absoluteString]];

[tempDict setObject:pName forKey:@"profileName"];
[tempDict setObject:dynamicURL forKey:@"dynamicLayer"];
[tempDict setObject:tiledURL forKey:@"backgroundLayer"];
[tempDict setObject:tempArr forKey:@"visibleLegend"];

[profilesArr addObject:tempDict];
if ([profilesArr containsObject:tempDict])
    NSLog(@"added");
if ([profilesArr writeToFile:path atomically:NO])
    NSLog(@"new saved");

パスに保存されている plist は、iPad でクラッシュするように見える唯一のものです。何が悪いのかわかりません。デバッグは、アセンブリ言語のコード行への不正なアクセスを示しているだけです。

4

1 に答える 1

0

アーク モードをオンにして、オブジェクトの自動解放コマンドをすべて削除することで修正しました。私のplist配列がそれ自体で解放され、iPadで問題を引き起こしているようです。

于 2012-10-04T19:35:27.427 に答える