2012-07-18 27 views
7

Tôi hơi bối rối về performSelector. Tôi đã googling. nhưng không rõ ràng với tôi. bất kỳ ai cũng có thể giải thích vai trò của performSelector.sử dụng performSelector trong iOS

nhờ

[self btnClicked]; 

[self performSelector:@selector(btnClicked)]; 


-(void)btnClicked 
{ 

    NSLog(@"Method Called"; 
} 

cả hai đều Woking tốt cho tôi. sự khác biệt giữa hai điều này là gì. [self btnClicked][self performSelector:@selector(btnClicked)];

Trả lời

10

Hai chữ này khá giống nhau khi được sử dụng như bạn đã trình bày, nhưng cái sau có lợi thế là bạn có thể xác định động lực nào sẽ chọn bộ gọi nào khi chạy.

SEL selector = [self gimmeASelectorToCall]; 
[self performSelector: selector]; 

[Source]

+0

cảm ơn câu trả lời nhanh .. – QueueOverFlow

1

performSelector gọi phương thức đã được khai báo và triển khai trong lớp học. Nó được sử dụng khi bạn cần đính kèm một hành động trong mã vào một sự kiện.

4

Một đối tượng selector cho phép bạn gọi một phương pháp mà bạn không biết tại thời gian biên dịch. Bạn chỉ cần biết tên của một phương thức như một chuỗi để gọi nó.

Khi tên của phương thức mà bạn đang gọi được biết đến tại thời gian biên dịch, việc sử dụng các bộ chọn sẽ phản tác dụng: mã trở nên ít có thể đọc được vì không có lợi thế rõ ràng. Khi bạn đang viết một thư viện cần gọi các phương thức trong mã khác được biên dịch riêng biệt với thư viện, các bộ chọn cung cấp một cách để tách hai đoạn mã. Ví dụ, nếu bạn đang viết một lớp hẹn giờ có thể gọi lại cho bạn khi một khoảng thời gian kết thúc, bộ hẹn giờ của bạn không biết tên của hàm cần gọi, vì vậy nó không thể viết một cái gì đó như thế này:

// We do not know if the function is called intervalHasExpired or something else 
[target intervalHasExpired]; 

Nhưng nếu bạn chọn bộ hẹn giờ, bộ hẹn giờ sẽ có thể gọi lại cho bạn.

[myTimer scheduleWithTarget:self andSelector:@selector(myCompletion)]; 
2

performSelector về cơ bản cho phép bạn quyết định thông điệp gì để vượt qua trong thời gian chạy (cuối ràng buộc), như trái ngược với các ngôn ngữ như đồng bằng C. Nếu bạn biết tên đến một phương pháp trong một lớp C mục tiêu, bạn có thể sử dụng

NSSelectorFromString() 

Để chuyển đổi chuỗi thành bộ chọn và yêu cầu lớp của bạn gọi bộ chọn đó bằng performSelector. Bằng cách này, bạn có thể chọn các chức năng khác nhau để gọi trong thời gian chạy. Bạn thậm chí có thể chọn chức năng nào để gọi bằng tập tin cấu hình.

8

Apple doc là bạn của bạn.

NSObject Protocol Reference

gửi một thông điệp cụ thể để người nhận và trả kết quả của tin nhắn.

Đặc biệt:

Các performSelector: phương pháp là tương đương với việc gửi một thông báo aSelector trực tiếp đến người nhận. Ví dụ, tất cả ba trong số thông điệp sau đây làm điều tương tự:

id myClone = [anObject copy]; 
id myClone = [anObject performSelector:@selector(copy)]; 
id myClone = [anObject performSelector:sel_getUid("copy")]; 

Tuy nhiên, performSelector: Phương pháp cho phép bạn gửi tin nhắn mà không được xác định cho đến khi thời gian chạy. Một bộ chọn biến thể được thông qua như lập luận:

SEL myMethod = findTheAppropriateSelectorForTheCurrentSituation(); 
[anObject performSelector:myMethod]; 

Đối số aSelector cần xác định một phương pháp mà mất không đối số. Đối với các phương thức trả lại bất kỳ điều gì khác ngoài một đối tượng, hãy sử dụng NSInvocation.

Hy vọng điều đó sẽ hữu ích.

+0

cảm ơn. để trả lời. – QueueOverFlow

+0

@stackBlue Bạn được chào đón. Tôi đã đánh dấu đậm các phần chính từ tài liệu của Apple. Upvote nếu bạn muốn :-) Chúc mừng. –

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