2011-11-23 5 views
6

Tôi có mã này và cần đến cổng nó để arc nhưng tôi không biết làm thế nào:Làm cách nào để thay thế class_createInstance trong vòng cung?

 case FIELDTYPE_OBJECT: 
      className = [fieldType substringWithRange:NSMakeRange(2, [fieldType length]-3)]; 
      rel = class_createInstance(NSClassFromString(className), sizeof(unsigned)); 
      Class theClass = [rel class]; 

      if ([rel isKindOfClass:[DbObject class]]) { 
       //Load the record... 
       NSInteger Id = [rs intForColumn:[theClass relationName]]; 
       if (Id==0) { 
        fieldValue = [rel init]; 
       } else {      
        Db *db = [Db currentDb]; 

        fieldValue = [db loadById: theClass theId:Id]; 
       } 
      } 
      break; 

Lỗi này là:

error: 'class_createInstance' is unavailable: not available in automatic reference counting mode 

Làm thế nào thay thế nó?

Tôi cần tạo đối tượng lớp trong thời gian chạy.

Trả lời

1

Hãy thử điều này:

#include <objc/objc-runtime.h> 
id object = [[NSClassFromString(@"TheClassName") alloc] init]; 
+1

Điều đó sẽ không xử lý tham số extraBytes vào class_createInstance –

+0

Điều này vẫn được yêu cầu khi sử dụng phân bổ init? –

+0

Nếu mã sử dụng các byte thừa, có. Nếu không, không có –

3

Giải pháp đơn giản nhất là để thêm một tập tin trong đó có -fno-objc-arc đặt trên nó, và trong đó có một chức năng trong đó kêu gọi class_createInstance() như trên.

1

Tạo một tệp riêng biệt .h/.c và đặt một cái gì đó như thế này.

id const 
MyCreateInstanceOfClass(Class const class) 
{ 
    id  instance = class_createInstance(class, 0); 
    return instance; 
} 

#include các .h, và gọi nó. Không cần phải đặt -fno-bjc-arc chuyển đổi cho mỗi tệp.