Tôi đang cố tạo danh sách đối số biến "giả", sử dụng kỹ thuật được mô tả here, nhưng đối với dự án có hỗ trợ ARC và tôi không thể tìm ra cách để loại bỏ lỗi tôi nhận được.Cách chuyển đổi từ char * sang id * bằng ARC bật
Dưới đây là mã trong câu hỏi:
NSMutableArray* argumentsArray = [NSMutableArray array];
// ... Here I fill argumentsArray with some elements
// And then, I want to construct a "fake" variable argument list
char* fakeArgList = (char*) malloc(sizeof(NSString*) * [argumentsArray count]);
[argumentsArray getObjects: (id*) fakeArgList];
NSString* content = [[NSString alloc] initWithFormat: formatString arguments:fakeArgList];
XCode phàn nàn trên (id) fakeArgList * đúc, nói:
Cast của phi Objective-C kiểu con trỏ 'char * 'to' _ id tự động điền * ' không được phép với ARC
Lý thuyết ban đầu của tôi là thứ tôi chỉ cần thêm __unsafe_unretained vào (id *) casting để cho ARC biết rằng tôi chịu trách nhiệm về khối bộ nhớ đó và nó không nên giữ lại/giải phóng nó, nhưng điều đó không hiệu quả và tôi không thể tìm ra cách để khắc phục sự cố này.
Cập nhật: Đây là chức năng đầy đủ. Nó sẽ lấy một chuỗi định dạng kiểu printf và một danh sách biến các tên trường bên trong .plist và xuất ra một chuỗi được định dạng với dữ liệu được tải từ .plist. Ví dụ, nếu tôi có một file plist với các lĩnh vực "field1" = "foo" và "field2" = 3 và tôi gọi [loadStringFromFixture: @"?param1=%@¶m2=%d", @"field1", @field2]
sau đó tôi sẽ nhận được chuỗi "? Param1 = foo & param2 = 3"
- (NSString*) loadStringFromFixture:(NSString*) format, ...
{
NSString* path = [[NSBundle mainBundle] bundlePath];
NSString* finalPath = [path stringByAppendingPathComponent:@"MockAPI-Fixtures.plist"];
NSDictionary* plistData = [NSDictionary dictionaryWithContentsOfFile:finalPath];
va_list argumentsList;
va_start(argumentsList, format);
NSString* nextArgument;
NSMutableArray* argumentsArray = [NSMutableArray array];
while((nextArgument = va_arg(argumentsList, NSString*)))
{
[argumentsArray addObject: [plistData objectForKey:nextArgument]];
}
NSRange myRange = NSMakeRange(0, [argumentsArray count]);
id* fakeArgList = (__bridge id *)malloc(sizeof(NSString *) * [argumentsArray count]);
[argumentsArray getObjects:fakeArgList range:myRange];
NSString * content = [[NSString alloc] initWithFormat:formatString
arguments:(__bridge va_list)fakeArgList];
free(fakeArgList);
return content;
}
Có phải là một cách tốt hơn để làm điều này ... – semisight
Nghiêm túc; một đọc nhanh của bài viết nguồn lá tôi nghĩ rằng nó chỉ hoạt động bằng sự trùng hợp ngẫu nhiên và nằm ngoài giới hạn của ABI hoặc spec. – bbum
Đó là sự thật, nhưng tôi chỉ cần nó cho mã kiểm tra đơn vị của tôi, vì vậy tôi ít quan tâm đến thực tế rằng nó là một "hack khá" bẩn. Mặc dù nếu ai đó có thể chỉ ra một cách tốt hơn để xây dựng một danh sách các đối số biến, tôi thực sự quan tâm. –