2011-10-29 22 views
15

Nói rằng tôi có một lớp học với một loại tài sản vô hướng:Trộn C tăng/giảm trước/sau với toán tử Objective-C dot?

@property (nonatomic, assign) int myInt; 

Và cho rõ ràng, tổng hợp như:

@synthesize myInt = _myInt; 

Nếu ai đó đã hỏi tôi nếu dòng sau sẽ làm việc:

self.myInt++; 

Tôi đã nói "Không". Lý do là tất cả chúng ta đều biết rằng toán tử dấu chấm chỉ là cú pháp cú pháp để gọi phương thức getter do trình biên dịch tạo ra. Vì vậy, dòng đó theo nghĩa đen là:

[self myInt]++; 

Nếu bạn nhập dòng thứ hai đó vào Xcode, nó sẽ không biên dịch, ghi rõ: "Chỉ định cho 'readonly' trả về kết quả của thông điệp khách quan không được phép". Điều này làm cho cảm giác hoàn hảo, và đó là những gì tôi đã mong đợi. Ngay cả khi được biên dịch, tôi đã có thể mong đợi kết quả để tăng một bản sao của ivar sao lưu trên ngăn xếp, chứ không phải chính nó.

Nhưng, hướng dẫn self.myInt++ không biên dịch và hoạt động. Nó hoạt động giống như khi toán tử dấu chấm đó truy cập trực tiếp vào _myInt. Bằng cách cung cấp getter và setter của riêng tôi, tôi có thể thấy rằng cả hai phương thức getter và setter được sử dụng trong quá trình này, theo thứ tự đó, như nó đã thực sự:

[self setMyInt:[self myInt] + 1]; 

Vì vậy, đây là một ngoại lệ đối với quy tắc đó toán tử dấu chấm chính xác giống như một cuộc gọi phương thức, hoặc là các toán tử {--, ++, +=, -=} được chú ý đặc biệt bởi trình biên dịch Object-C khi được sử dụng với ký hiệu dấu chấm? Tôi đã luôn luôn nghĩ về chúng như là một tính năng ngôn ngữ C mà không có cân nhắc đặc biệt cho Objective-C. Tôi có thể thấy rằng dòng đơn giản đó rất khó hiểu đối với một người không quen thuộc với ký hiệu chấm điểm Objective-C.

Trả lời

11

Bạn có thể xem đầu ra của bộ kết hợp và thấy rằng nó tạo ra hai cuộc gọi _objc_msgSend.

tôi đoán đó là hơn một trường hợp áp dụng các quy tắc đó a++ là cú pháp đường cho a = a + 1

khai thác
+0

Đỗ prefix ('++ self.myInt') cũng được áp dụng? –

+0

Nhìn vào đầu ra disassembler, tôi thấy hai 'objc_msgSend' để có. Bạn đang tăng tài sản. –