2012-07-11 30 views
7

Làm cách nào để tôi có thể viết lại lớp tiện ích sau để nhận tất cả các giá trị chuỗi lớp cho một loại cụ thể - bằng cách sử dụng các hàm thời gian chạy Objective-c như được hiển thị bên dưới?realloc() & ARC

Các tài liệu ARC đặc biệt khẳng định rằng realloc nên tránh và tôi cũng nhận được lỗi biên dịch sau đây về vấn đề này dòng này:

classList = realloc(classList, sizeof(Class) * numClasses); 

"chuyển đổi ngầm của một loại con trỏ không Objective-C 'void * 'to' __unsafe_unretained Class * 'không được phép với ARC "

Mã bên dưới là tham chiếu đến bài viết gốc có thể được tìm thấy here.

+ (NSArray *)classStringsForClassesOfType:(Class)filterType { 

    int numClasses = 0, newNumClasses = objc_getClassList(NULL, 0); 
    Class *classList = NULL; 

    while (numClasses < newNumClasses) { 
     numClasses = newNumClasses; 
     classList = realloc(classList, sizeof(Class) * numClasses); 
     newNumClasses = objc_getClassList(classList, numClasses); 
    } 

    NSMutableArray *classesArray = [NSMutableArray array]; 

    for (int i = 0; i < numClasses; i++) { 
     Class superClass = classList[i]; 
     do { 
      superClass = class_getSuperclass(superClass); 
      if (superClass == filterType) { 
       [classesArray addObject:NSStringFromClass(classList[i])]; 
       break; 
      }   
     } while (superClass);  
    } 

    free(classList); 

    return classesArray; 
} 

Trợ giúp của bạn sẽ được đánh giá cao.

+0

Tạo danh sách lớp rõ ràng (void *). Cũng xem xét không sử dụng realloc. Bạn đang cố gắng làm gì ở đây? – Dustin

+2

Bạn có thực sự cần phải chạy mã với ARC, hoặc nó sẽ được chấp nhận để bạn chạy mã trong chế độ không ARC (cờ '-fno-objc-arc' trong cài đặt xây dựng đích cho các lớp mà bạn muốn vô hiệu hóa ARC). Xem: http://stackoverflow.com/questions/6646052/how-can-i-disable-arc-for-a-single-file-in-a-project –

+0

@WolfgangSchreurs Cảm ơn, tôi hoàn toàn quên về tùy chọn cờ liên kết . – RynoB

Trả lời

13

ARC buộc bạn rõ ràng hơn với việc quản lý bộ nhớ của bạn. Trong trường hợp này, bạn chỉ cần truyền rõ ràng đầu ra của realloc:

classList = (Class *)realloc(classList, sizeof(Class) * numClasses); 
+0

Cảm ơn, đây chính xác là những gì tôi đang tìm kiếm! – RynoB

+0

Cảm ơn bạn đã tiết kiệm giờ thất vọng. –