2010-02-19 27 views
5

Tôi nghĩ rằng tôi đã làm điều này sai trong một năm rưỡi kinh nghiệm phát triển iPhone của tôi ... Tôi có thể sử dụng một số làm rõ am hiểu xin vui lòng!Thiết lập hoạt ảnhDidStopSelector: trên hoạt hình của UIView ủy quyền

Như bạn có thể hoặc có thể không biết, các thuộc tính UIView có thể hoạt hình khá dễ dàng bằng cách sử dụng phương thức beginAnimations:forContext: và kết hợp với cuộc gọi commitAnimations.

Bạn cũng có thể thiết lập một đại biểu hoạt hình để thực hiện những hành động khi một số phần của các hình ảnh động xảy ra, chẳng hạn như bắt đầu, kết thúc, vv

Tôi đã sử dụng UIView hình ảnh động trong mã của tôi trong một thời gian dài và không bao giờ có bất kỳ vấn đề nghiêm trọng nào, nhưng tôi đã xem qua một phần tài liệu mà tôi phải bỏ qua.

Các tài liệu cho setAnimationDidStopSelector: bang UIView rằng bất kỳ selector truyền vào phương pháp này nên có dạng:

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context; 

tôi đã không được làm điều đó cả. Tôi đã đặt các công cụ chọn loại cũ doThisdoThat loại không có tham số.

Có phải những gì tôi đã làm không? Tôi có nên viết lại tất cả mã của mình để sử dụng biểu mẫu được tài liệu không? Hoặc là hình thức đó chỉ đơn giản là để thuận tiện nếu tôi cần phải biết hay không các hình ảnh động hoàn thành trước khi bị dừng lại hoặc cần thiết để vượt qua một số dữ liệu ngữ cảnh cụ thể cho phương pháp này?

Trả lời

9

Có thể chấp nhận.


Trong mức lắp ráp, gọi một phương thức Objective-C

id something = [obj method:arg0 and:arg1 also:arg2 asWellAs:arg3]; 

sẽ trông giống như (không mã ARM thực tế):

load r0  <- obj 
load r1  <- @selector(method:and:also:asWellAs:) 
load r2  <- arg0 
load r3  <- arg1 
load [sp, 0] <- arg2 
load [sp, 4] <- arg3 
call   objc_msgSend 
store r0  -> something 

nơi objc_msgSend sẽ giữ tất cả các thanh ghi , tìm -method:and:also:asWellAs: và chuyển đến nó. Trong -method:… trình biên dịch sẽ liên kết các thông số trở lại đăng ký, ví dụ:

store r0  -> self 
store r1  -> _cmd 
store r2  -> param0 
store r3  -> param1 
store [sp, ?] -> param2 
store [sp, ?+4] -> param3 
// rest of execution 

Bây giờ những gì xảy ra nếu phương pháp của bạn chỉ là -doThis hoặc -doThat?

store r0  -> self 
store r1  -> _cmd 
// rest of execution 

Sẽ không có tham số để đăng ký r2, r3 và giá trị ngăn xếp được ghi đè miễn phí. Nói cách khác, trình biên dịch/thời gian chạy sẽ đơn giản bỏ qua các tham số bổ sung.

Sự cố sẽ chỉ phát sinh nếu bạn nhận quá nhiều tham số.

+0

Tuyệt vời, cảm ơn lời giải thích. – Jasarien

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