12

このメモリリークで私を助けてください。Foundationリーク ツールでは、ライブラリResponsible Frame:内のリーク: NSCFString (32 バイト) が表示されますNSPropertyListSerialization。エラーを解除していますが、まだリークしています。私は何が欠けていますか?どうもありがとう!

    NSPropertyListFormat format; 
    NSString *anError = nil;
    id plist;
    plist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError];
    if (!plist){
          [anError release];
    } 
    NSArray *entries = (NSArray *)plist;
    for (NSDictionary *entry in entries) 
    {
      // DO SOMETHING
    }
4

5 に答える 5

1

まず、非推奨または廃止されたメソッド呼び出しを使用していないことを確認してください。アプリの構成によっては (これはユーザーが決定します)、廃止されたメソッド呼び出しを使用している可能性があります。アップルのドキュメントから:

propertyListFromData:mutabilityOption:format:errorDescription:

このメソッドは廃止されており、まもなく廃止される予定です。(非推奨。propertyListWithData:options:format:error:代わりに使用してください。)

推奨される API 呼び出しを使用した後、メモリ リークは検出されませんでした... テスト コード:

NSArray *somearray = @[@"One",@"Two",@"Three"];
NSData *rawCourseArray = [NSKeyedArchiver archivedDataWithRootObject:somearray];

NSPropertyListFormat format;
NSError *anError = nil;
id plist;
plist = [NSPropertyListSerialization propertyListWithData:rawCourseArray options:NSPropertyListImmutable format:&format error:&anError];
if (!plist){
    [anError release];
}
NSArray *entries = (NSArray *)plist;
for (NSDictionary *entry in entries)
{
    // DO SOMETHING
    NSLog(@"%@",entry);
}
于 2013-02-05T04:07:01.727 に答える
0

一時的に辞書を取得してこれを試してください

    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
    NSString *errorDesc = nil;
    NSPropertyListFormat format;
    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];
    if (!temp)
   {
        NSLog(@"Error reading plist: %@, format: %d", errorDesc, format);
    }
于 2013-04-04T11:55:12.943 に答える
0

このステートメントplist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError]; は、autorelease オブジェクトを作成します。によって自動解放プールが明示的に割り当てられていない別のスレッドでコードが実行されるようになった場合@autoreleasepool {...}、このオブジェクトは決して解放されず、リークになります。
そのため、コードが別のスレッドで実行される場合は、自動解放プールを設定したことを確認してください。

于 2013-02-03T20:54:59.390 に答える
0

次の方法で plist を読んでみてください。

NSDictionary *dTmp=[[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"]];


self.myarray=[dTmp valueForKey:@"Objects"];
于 2013-07-12T12:13:55.630 に答える