2011-12-19 26 views
10

Đây là mã của tôi:Cast một BOOL để id trong Objective-C

[delegate performSelectorOnMainThread:@selector(setVariablePremierAffichage:) withObject:TRUE waitUntilDone:NO]; 

Vấn đề là lập luận "withObject" chỉ mất một "id" loại, vì vậy, làm thế nào tôi có thể đúc giá trị của tôi " TRUE "đến một loại id? Tôi cũng sử dụng quản lý bộ nhớ ARC trong Xcode cho iOS 5.

+0

Câu trả lời bạn đã nhận là đúng. Nhưng, thay vì nhảy qua hoops để buộc một cái gì đó như thế này để làm việc bạn nên tự hỏi tại sao bạn đang sử dụng 'performoSelectorOnMainThread' ở nơi đầu tiên? Tại sao không chỉ sử dụng '[delegate setVariablePremierAffichage: YES]' trực tiếp? – Abizern

+1

@Abizem, bạn đúng tùy thuộc vào ngữ cảnh. OP có thể gọi điều này từ một luồng khác. Ngay cả trong trường hợp đó, bằng cách sử dụng 'dispatch_async' thay vì' performSelectorOnMainThread: 'sẽ cho phép phương thức được gọi là w/o sử dụng NSNumber. Tuy nhiên, tôi sẽ không gọi đây là "nhảy qua hoops". Đó là một lựa chọn thực hiện hợp lý, một lần nữa, tùy thuộc vào ngữ cảnh. – XJones

Trả lời

20

Vượt qua một NSNumber. Sử dụng boolNumber = [NSNumber numberWithBool:TRUE]. Phương pháp của bạn phải được xác định là:

-(void)setVariablePremierAffichage:(NSNumber *)boolNumber 
{ 
    BOOL value = [boolNumber boolValue]; 
    // do something 
} 
+2

Tôi nghĩ rằng bạn có nghĩa là để nói '[NSNumber numberWithBool: YES]' như là đối tượng-C quy ước cho BOOLs là 'YES' và' NO' thay vì 'TRUE' và' FALSE' – Abizern

+0

TRUE/FALSE làm việc là tốt. – XJones

+2

Có nó hoạt động, nhưng có những quy ước và YES/NO là một cho mục tiêu-C. – Abizern

0

Không có cách nào để truyền nguyên thủy cho id. Nếu bạn cần gọi phương thức động như là performSelector, bạn sẽ cần phải sử dụng NSInvocation:

NSMethodSignature *sig = [self methodSignatureForSelector:@selector(setVariablePremierAffichage:)]; 
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; 
BOOL yes = YES; 
[invocation setArgument:&yes atIndex:2]; 
[invocation setTarget:self]; 
[invocation setSelector:@selector(setVariablePremierAffichage:)]; 
[invocation invoke]; 

Chúc mừng!

4

Sử dụng CFbooleanreference và đúc nó

[delegate performSelectorOnMainThread:@selector(setVariablePremierAffichage:) withObject:(id)kCFBooleanTrue waitUntilDone:NO]; 
+0

Thanx cho phần chia sẻ! – smileBot

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