self.myString = @"test";
tương đương với cách viết [self setMyString:@"test"];
. Cả hai đều gọi một phương thức.
Bạn có thể đã tự viết phương pháp đó. Nó có thể giống như thế này:
- (void)setMyString:(NSString*)newString
{
_myString = newString;
}
Bởi vì bạn sử dụng @synthesize
, bạn không cần phải thực sự bận tâm viết phương pháp đó, bạn có thể chỉ cho phép trình biên dịch để viết nó cho bạn. Vì vậy, khi nhìn vào phương pháp đó, có vẻ như việc gọi nó sẽ làm điều tương tự như chỉ gán một giá trị cho biến thể hiện, đúng không? Vâng, nó không đơn giản như vậy.
Thứ nhất, bạn có thể viết phương thức setter riêng của mình. Nếu bạn làm như vậy, phương pháp của bạn sẽ được gọi, và nó có thể làm tất cả các loại điều bổ sung cũng như thiết lập biến. Trong trường hợp đó, sử dụng self.myString =
sẽ gọi phương thức của bạn, nhưng làm _myString =
sẽ không, và do đó chức năng khác nhau sẽ được sử dụng.
Thứ hai, nếu bạn từng sử dụng Quan sát giá trị khóa, trình biên dịch thực hiện một số thủ thuật rất thông minh. Đằng sau hậu trường, nó phân lớp lớp của bạn và ghi đè phương thức setter của bạn (cho dù đó là cách bạn viết hoặc tạo ra bằng cách tổng hợp), để thực hiện các cuộc gọi đến willChangeValueForKey:
cần thiết cho Key Value Observing để hoạt động. Bạn không cần phải biết cách làm việc này (mặc dù nó khá thú vị nếu bạn muốn đọc một số giờ đi ngủ!), Nhưng bạn cần biết rằng nếu bạn muốn Key Value Observing hoạt động tự động, bạn phải sử dụng các phương thức setter.
Thứ ba, gọi phương thức setter ngay cả khi bạn đang dựa vào tổng hợp để viết một cái cho bạn sự linh hoạt cho tương lai. Bạn có thể muốn làm điều gì đó thêm bất cứ khi nào giá trị được thay đổi và tại thời điểm bạn phát hiện bạn muốn làm điều đó, bạn có thể viết phương pháp setter theo cách thủ công - nếu bạn có thói quen luôn sử dụng self.myString =
thì bạn sẽ không cần phải thay đổi phần còn lại của mã để bắt đầu gọi phương thức mới!
Thứ tư, điều tương tự cũng áp dụng cho các lớp con. Nếu ai đó đã phân lớp mã của bạn, nếu bạn sử dụng những người định cư thì họ có thể ghi đè lên chúng để điều chỉnh chức năng.
Bất cứ khi nào bạn truy cập trực tiếp biến mẫu, bạn rõ ràng không cung cấp cách để thêm chức năng để được nối vào lúc đó. Vì bạn hoặc ai đó có thể muốn móc trong các chức năng như vậy trong tương lai, nó trả tiền để sử dụng những người định cư tất cả các thời gian, trừ khi có một lý do chính đáng để không.
'self' là biểu tượng. '_' là một ký tự trong một số ký hiệu. 'myString' và' _myString' là hai biểu tượng khác nhau có liên quan, không phải do chính tả mà bởi vì chúng được đặt tên trong cùng một '@ synthezize'. –
Hãy thử câu trả lời sau đây: http://stackoverflow.com/questions/5170631/what-does-synthesize-window-window-do – Peres
Kiểm tra xem @ Jonathan trả lời cho câu hỏi này trước SO giúp http: // stackoverflow .com/questions/5466496/why-rename-synthesized-properties-in-ios-với-hàng đầu-gạch dưới – visakh7