2009-07-23 19 views

Trả lời

5

Sử dụng NSValue để bọc bộ chọn: giải pháp

// Set selector 
SEL inSelector = @selector(something:); 
NSValue *selectorAsValue = [NSValue valueWithBytes:&inSelector objCType:@encode(SEL)]; 
id dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"some text", @"text", selectorAsValue, @"selector", nil]; 

// Retrieve selector 
SEL outSelector; 
[(NSValue *)[dict objectForKey:@"selector"] getValue:&outSelector]; 
// Now outSelector can be used as a selector, e.g. [self performSelector:outSelector] 
+3

Theo dõi, NSValue là lớp đúng để gói bất kỳ loại không đối tượng nào trong đối tượng. NSPoint, NSRect và NSSize đều có các nhà xây dựng chuyên dụng và các kiểu số được bọc bởi lớp con NSNumber nhưng bạn cũng có thể bọc các cấu trúc tùy ý và thậm chí bao bọc các đối tượng mà không giữ lại chúng. Lưu ý mặc dù ... NSValue dành cho dữ liệu * đã nhập *. Các khối dữ liệu nhị phân tùy ý nên được gói bởi NSData. –

+1

Điều này yêu cầu một danh mục trên NSValue – cfischer

15

pix0r là tốt, nhưng tôi thường thích sử dụng chuỗi bởi vì họ đang vững vàng hơn để serialization và làm cho từ điển dễ dàng hơn để đọc trong debug đầu ra.

// Set selector 
SEL inSelector = @selector(something:); 
NSString *selectorAsString = NSStringFromSelector(inSelector); 
id dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"some text", @"text", selectorAsString, @"selector", nil]; 

// Retrieve selector 
SEL outSelector = NSSelectorFromString([dict objectForKey:@"selector"]); 
+0

Tôi đồng ý với điều này. SEL ánh xạ tự nhiên hơn vào một chuỗi (vì nó là một tên) so với một giá trị (thường đại diện cho các vô hướng và cấu trúc C). – Chuck

+0

Ngoài ra, bạn có thể gửi một chuỗi xuống từ một dịch vụ nếu bạn đang mở để chơi các trò chơi nguy hiểm như thế. –

Các vấn đề liên quan