2012-01-11 28 views

Trả lời

12

Mô tả

Vấn đề là trình biên dịch nhìn thấy nhiều phương pháp có tên là tag trong th e đơn vị dịch hiện tại và các khai báo này có các loại trả về khác nhau. Một người có thể là -[UIView tag], trả về một số NSInteger. Nhưng nó cũng nhìn thấy một tuyên bố tag, có lẽ:

@interface MONDate 
- (NSString *)tag; 
@end 

sau đó trình biên dịch thấy một sự mơ hồ - là sender một UIView? hoặc là một MONDate?

Trình biên dịch cảnh báo bạn rằng cần phải đoán loại của sender là gì. Đó là thực sự yêu cầu cho hành vi không xác định.

Nghị quyết

Nếu bạn biết kiểu của tham số, sau đó xác định nó:

khác, sử dụng một cái gì đó như một điều kiện isKindOfClass: để xác định loại để khai báo biến như trước gửi tin nhắn nó . như các câu trả lời khác cho thấy, bạn cũng có thể định kiểu.

+1

+1 giải thích rất rõ. Nhưng nó sẽ làm việc trong mọi trường hợp (sử dụng id), mặc dù cảnh báo .. phải không? –

+0

@Ankit Nó * sẽ không * làm việc (ref: nó yêu cầu cho hành vi không xác định). Nếu tất cả các phương thức 'tag' có thể nhìn thấy trả về một đối tượng objc, thì nó có thể dự đoán được. Nếu một trả về một 'CGRect' và một đối tượng objc khác, trình biên dịch có thể kết thúc gọi nhầm biến' objc_msgSend' mà bạn có thể đập vỡ một phần của ngăn xếp của bạn. Nếu trình biên dịch đoán theo cách khác và sai, 'CGRect' có thể được gửi đi như một đối tượng objc. Bạn cũng có thể cắt bộ nhớ, và nếu C++ ở trong đó, nó thậm chí còn phức tạp hơn. (tiếp theo) – justin

+0

(tiếp) Cách khác là xem xét lắp ráp được tạo ra, cho mỗi cảnh báo được tạo ra. Cái gì tệ hơn? Bạn có thể không nhận được cảnh báo nếu bạn không #included loại đối tượng được chuyển thành 'người gửi' trong TU. – justin

3

Vấn đề là sender được định nghĩa là một đối tượng (id). Tại thời gian biên dịch xcode không biết loại đối tượng nào sẽ được truyền cho hàm của bạn.

Nếu bạn viết chức năng này cho một loại đối tượng cụ thể, bạn có thể giúp bạn có thể viết ví dụ

- (IBAction)shareThisActionSheet:(UIButton*)sender 

hoặc bạn có thể gợi ý các trình biên dịch các loại đối tượng với các cuộc gọi

int row = [(UIButton*)sender tag]; 
2

Bastian là đúng bạn nên chuyển đổi người gửi của bạn để nút như thế này:

UIButton * button = (UIButton *)sender; 
int row = button.tag; 
+3

nếu bạn nghĩ rằng tôi là đúng, tại sao bạn đăng câu trả lời tương tự thay vì của upvoting mỏ? – Bastian

+1

Vì tôi đã đăng một cách truyền khác nhau của người gửi (tôi nghĩ nó chính xác hơn vì nó trực quan hơn) – Stas

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