2011-07-28 31 views
8

Có sự khác biệt đáng kể trong hoạt động khi bạn gọiperformSelector vs hiệu suất cuộc gọi trực tiếp

[someObject performSelector:@selector(testMethod:) withObject:anotherObject]; 

vs

[someObject testMethod:anotherObject]; 

?

+0

Tôi đã gặp một sự khác biệt quan trọng khi chuyển dữ liệu sang bộ điều khiển chế độ xem khác trong PrepareForSegue. sử dụng: [viewController performSelector: @selector (aMethod :) withObject: anObject]; aMethod được gọi là SAU viewDidLoad và viewWillAppear của viewController đích. sử dụng: [viewController aMethod: anObject]; aMethod được gọi là TRƯỚC KHI viewDidLoad và viewWillAppear của viewController đích. Vì vậy, nếu bạn đang gửi dữ liệu quan trọng cho việc thiết lập chế độ xem đíchController, hãy sử dụng cách thứ hai. –

Trả lời

7

Đầu tiên gây ra một cuộc gọi bổ sung tới objc_msgGửi() không cần thiết trong trường hợp thứ hai.

Sự khác biệt về hiệu suất không có vấn đề gì từ xa trừ khi bạn gọi phương thức đã nói nhanh như bạn có thể nhiều 10 nghìn lần bạn không thực hiện bất kỳ công việc quan trọng nào trong testMethod:.

I.e. đừng lo lắng về nó trừ khi bạn đo lường một vấn đề hiệu suất thực tế.

0

Không có bất kỳ hiệu suất nào mà tôi biết, và nếu có bất kỳ điều gì không quan trọng.

-1

Đối với kinh nghiệm của tôi, có hai sự khác biệt:

  1. Người đầu tiên có thể thêm afterDelay: (CGFloat) giây, và đây là trường hợp duy nhất mà tôi sử dụng đầu tiên.

    [someObject performSelector:@selector(testMethod:) withObject:anotherObject afterDelay:1.0]; 
    
  2. Thứ hai, bạn cần xác định nó trong someObject.h. Nếu không, bạn sẽ nhận được cảnh báo biên dịch.

+1

'performSelector: withObject:' và 'performSelector: withObject: afterDelay:' là hai phương thức hoàn toàn khác nhau. Đối với (2), đó không phải là trường hợp thực sự; có nhiều cách mà lỗi trình biên dịch có thể tránh được. – bbum

+0

Sai. Xác định nó là hoàn toàn không cần thiết. –

2

Thực tế thú vị, thực hiện bộ chọn có độ trễ 0 khiến phương thức đó được gọi ở đầu vòng lặp chạy tiếp theo của ứng dụng. Bạn có thể sử dụng điều đó để trì hoãn các sự kiện nhất định xảy ra thường xuyên (sử dụng rất nhiều trong tối ưu hóa giao diện người dùng, như hình ảnh được tải lại trong UIScrollView)

+0

Không thực sự trả lời câu hỏi, nhưng chắc chắn là một thực tế thú vị. Tôi muốn đề nghị thêm điều này như là một bình luận về câu hỏi của OP. – bbum

0

Có nhiều khác biệt ở trên cả hai phương pháp .... Tôi đang cố gắng nhận được hình ảnh động của hai nút đến từ phía bên phải và dừng lại ở trung tâm nhưng nút thứ hai đã đến với 0,3 giây chậm trễ ... Bây giờ các điểm chính đến đây ... Tôi đã sử dụng một phương pháp hoạt hình cho cả 2 nút. Bây giờ tôi muốn rằng khi tôi nhấp vào nút Finish, sau đó cả hai nút nên đi sang trái và một lần nữa nút mới đến ... Điều này là tốt cho đến khi đọc ...

Bây giờ khi tôi đã viết phương pháp cho nút Finish ... Tôi đã thực hiện đi ra khỏi nút Animation đầu tiên và sau đó đến trong các nút .... nhưng khi tôi sử dụng phương pháp trên thứ hai tức là [someObject testMethod:anotherObject]; sau đó những gì xảy ra là tôi đã không thể nhìn thấy Đi ra hoạt hình và trực tiếp đến trong hoạt hình của các nút thể hiện ...

đây thực sự đến việc sử dụng các phương pháp đầu tiên tức là [someObject performSelector:@selector(testMethod:) withObject:anotherObject withDelay:delay];

lý do tôi tìm thấy là khi tôi nhấp vào nút Finish chạy hoạt hình trong chủ đề khác nhau và các mã khác chạy trong chủ đề khác nhau để hành động đi ra ngoài được thực hiện trong chủ đề khác và sắp tới trong được thực hiện trong chủ đề khác .. vì vậy chủ đề đầu tiên được không được hiển thị ..

Sau khi sử dụng phương pháp đầu tiên với thời gian trễ của tổng số hình ảnh động ... Tôi đã đạt được mục tiêu của mình .. Vì vậy, cả hai phương pháp đều có ý nghĩa riêng ... njoy lập trình ...

0

Tôi đã đi qua một sự khác biệt quan trọng khi đi qua dữ liệu đến một bộ điều khiển xem trong prepareForSegue.

sử dụng:

[viewController performSelector: @selector (aMethod :) withObject: anObject];

aMethod được gọi SAU viewDidLoad và viewWillAppear của chế độ xem đíchController.

sử dụng:

[viewController aMethod: anObject];

aMethod được gọi là TRƯỚC KHI viewDidLoad và viewWillAppear của viewController đích.

Vì vậy, nếu bạn đang gửi dữ liệu quan trọng cho việc thiết lập chế độ xem đíchController, hãy sử dụng cách thứ hai.

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