2010-08-23 42 views
12

Hãy giúp tôi với sự rò rỉ bộ nhớ này. Trong công cụ rò rỉ nó cho thấy một rò rỉ: NSCFString (32 byte) trong thư viện Foundation Khung có trách nhiệm: NSPropertyListSerialization. Tôi đang phát hành lỗi nhưng vẫn bị rò rỉ. Tôi đang thiếu gì? Cảm ơn nhiều!Rò rỉ bộ nhớ với Serialist Plist

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 
    } 
+2

Có bài viết khác nhau về vấn đề này trên mạng nói đó là một lỗi táo, một số người nói sử dụng tùy chọn NSPropertyListSerialization: Định dạng: lỗi và những người khác nói chuyển sang JSON serialization nhưng tôi chưa tìm được câu trả lời hay. –

+5

Tôi thấy một lỗi: Bạn không nên thực hiện '[anError release]' trong mã của bạn; bạn không sở hữu tham chiếu đến 'anError'. 'propertyListFromData:' sẽ tự động phát hành nó trước khi trở về mã của bạn. Tuy nhiên, đây là lỗi * double-free *, không phải là * rò rỉ *. Tôi không thấy bất kỳ sự rò rỉ nào trong mã bạn đã đăng. – Quuxplusone

+0

Trong trình gỡ lỗi, po giá trị của chuỗi bị rò rỉ để xem liệu nó có cung cấp cho bạn bất kỳ gợi ý nào không. –

Trả lời

0

Tuyên bố plist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError]; tạo đối tượng autorelease. Nếu mã của bạn hiện đang chạy trong một luồng riêng biệt mà không có nhóm tự động phân phối nào được gán rõ ràng bởi @autoreleasepool {...}, đối tượng này không bao giờ có thể được phát hành và sẽ bị rò rỉ.
Vì vậy, hãy đảm bảo rằng bạn đã thiết lập một nhóm tự động phát hành nếu mã của bạn chạy trong một chuỗi riêng biệt.

1

Trước tiên, hãy đảm bảo rằng bạn không sử dụng các cuộc gọi phương thức không được chấp nhận hoặc lỗi thời. Tùy thuộc vào cấu hình ứng dụng của bạn (điều này là để bạn quyết định) bạn có thể đang sử dụng các cuộc gọi phương thức lỗi thời; từ Apple docs:

propertyListFromData:mutabilityOption:format:errorDescription: 

This method is obsolete and will be deprecated soon. (Deprecated. Use propertyListWithData:options:format:error: instead.)

tôi đã không phát hiện rò rỉ bộ nhớ sau khi sử dụng cuộc gọi api đề nghị ... Mã kiểm tra:

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); 
} 
+0

+1 Để nhận ra phương pháp lỗi thời, điều này thực sự có thể là vấn đề. Nhưng, hãy loại bỏ dòng '[lỗi release]', cảm ơn nhiều;) – Tricertops

+0

'propertyListWithData: options: format: error:' cũng có một lỗ hổng. – Leandros

0

Hãy thử điều này bởi chúng tôi có được từ điển trong tạm

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); 
    } 
0

không có rò rỉ. quấn nó tất cả trong một @autoreleasepool để chắc chắn rằng tất cả mọi thứ được autoreleased đi ngay lập tức như là một thử nghiệm.

THEN thoát khỏi sự cố có thể xảy ra do không bị lỗi kép: nó được tự động phát hành và bạn không phải phát hành lại!

0

Cố gắng đọc plist của bạn theo cách này:

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


self.myarray=[dTmp valueForKey:@"Objects"];