2010-04-12 35 views
8

Tôi muốn thực thi một hàm có cấu trúc trong một Chủ đề riêng biệt nhưng không chắc chắn làm thế nào để vượt qua cấu trúc đúng.Chuyển cấu trúc dưới dạng id có thể?

Có này:

- (void) workOnSomeData:(struct MyData *)data; 

Làm thế nào để gọi đúng:

struct MyData data = ... ; 
[[[NSThread alloc] initWithTarget:self selector:@selector(workOnSomeData:) object: ... 

Sử dụng &data không hoạt động.

+0

(thẻ chỉ được cập nhật) – Vlad

Trả lời

8

Trong khi câu trả lời kennytm là đúng, có là một cách đơn giản hơn.

Sử dụng phương thức + valueWithPointer: của NSValue để đóng gói con trỏ trong đối tượng ani cho mục đích quay vòng chuỗi. NSValue không quản lý bộ nhớ tự động trên con trỏ-- nó thực sự là juste một wrapper đối tượng mờ cho các giá trị con trỏ.

8

objectphải là đối tượng ObjC. Một cấu trúc không phải là.

Bạn có thể tạo một ObjC để giữ các thông tin:

@interface MyData : NSObject { 
    ... 

hoặc mã hóa các struct trong một NSData, giả sử nó không chứa bất kỳ gợi ý:

NSData* objData = [NSData dataWithBytes:&data length:sizeof(data)]; 

... 

-(void)workOnSomeData:(NSData*)objData { 
    struct MyData* data = [objData bytes]; 
    ... 
+0

Đây chắc chắn là sự lựa chọn khác, nhưng sau đó tôi có thể sử dụng trên đối tượng ObjC ngay lập tức và thay đổi chức năng của tôi để chấp nhận một đối tượng. Tôi muốn sử dụng cấu trúc để tránh xác định một đối tượng bổ sung. – georgij

0

Bạn có thể chuyển cấu trúc qua khoảng trống * như thế này. Đã thử nghiệm và hoạt động.

struct MyData data = ... ; 

[[[NSThread alloc] initWithTarget:self selector:@selector(workOnSomeData:) object:(void *)(&data)]; 
Các vấn đề liên quan