Tôi vừa mới đi qua một số mã trong three20 trông như thế này:Tại sao sử dụng performSelector: withObject: withObject tại thời gian chạy nếu bạn biết cả bộ chọn và đối số của nó tại thời gian biên dịch?
SEL sel = @selector(textField:didAddCellAtIndex:);
if ([self.delegate respondsToSelector:sel]) {
[self.delegate performSelector:sel withObject:self withObject:(id)_cellViews.count-1];
}
On LLVM 2.0, điều này gây ra lỗi biên dịch:
error: arithmetic on pointer to interface 'id', which is not a constant size in non-fragile ABI
Tôi biết tại sao lỗi rằng đang xảy ra và tôi biết cách sửa nó. Tôi chỉ cần gọi phương thức trực tiếp, như vậy:
SEL sel = @selector(textField:didAddCellAtIndex:);
if ([self.delegate respondsToSelector:sel]) {
[self.delegate textField:self didAddCellAtIndex:(_cellViews.count - 1)];
}
Câu hỏi của tôi là, nếu bạn biết cả hai bộ chọn và lập luận của mình tại thời gian biên dịch, tại sao bạn sẽ cần phải sử dụng performSelector:withObject:withObject:
khi chạy? Tôi không hiểu tại sao mã được viết theo cách này ngay từ đầu. Nếu bộ chọn và đối số được tự động chuyển vào phương thức, tôi có thể hiểu, nhưng chúng không, bộ chọn và đối số của nó được mã hóa cứng, (ngay cả khi chỉ mục thay đổi trong thời gian chạy, phương pháp của nó có được chỉ mục là khó được mã hóa.)
Nếu ai đó có thể giải thích cho tôi lý do chính đáng tại sao điều này là cần thiết, tôi sẽ rất biết ơn. Nếu không, tôi sẽ ở đây thay đổi tất cả các mã này.
Ba20 không được chuyển giá trị số nguyên làm con trỏ. Naughty, Naughty. Cảm ơn bạn đã sửa chữa. – justice