2013-06-10 41 views
8

Vì vậy, tôi có một tài sản NSString tên mô tả, quy định như sau:iOS Setters và Getters và nhấn Tên tài sản

@property (strong, nonatomic) NSMutableString *description; 

Tôi có thể coi nó như _description khi tôi xác định getter, như sau:

- (NSString *)description 
{ 
    return _description; 
} 

Tuy nhiên, khi tôi định nghĩa một setter, như sau:

-(void)setDescription:(NSMutableString *)description 
{ 
    self.description = description; 
} 

Nó phá vỡ _description từ bộ thu thập nói trên (số nhận dạng không khai báo). Tôi biết tôi có thể chỉ sử dụng self.description thay vào đó, nhưng tại sao điều này lại xảy ra?

+0

Đó là vì bạn đang ghi đè phương pháp mô tả đã có sẵn trong lớp NSObject. Hãy thử sử dụng một số tên khác cho tài sản của bạn. – Mrunal

+3

Cũng thay đổi kiểu trả về getter của bạn để tương tự như những gì tài sản của bạn tuyên bố. – Zen

Trả lời

15

câu trả lời của @borrrden rất tốt. Tôi chỉ muốn thêm một số chi tiết.

Thuộc tính thực sự chỉ là đường cú pháp. Vì vậy, khi bạn khai báo một thuộc tính như bạn đã làm:

@property (strong, nonatomic) NSMutableString *description; 

Nó được tổng hợp tự động. Điều đó nghĩa là gì: nếu bạn không cung cấp bộ setter + setter riêng (xem câu trả lời của borrrden), một biến cá thể được tạo ra (theo mặc định nó có tên "underscore + propertyName"). Và getter + setter được tổng hợp theo mô tả đặc tính mà bạn cung cấp (mạnh mẽ, nonatomic). Vì vậy, khi bạn nhận được/thiết lập các tài sản, nó thực sự là bằng cách gọi getter hoặc seter. Vì vậy,

self.description; 

bằng [self description]. Và

self.description = myMutableString; 

bằng [self setDescription: myMutableString];

Vì vậy khi bạn định nghĩa một setter như bạn đã làm:

-(void)setDescription:(NSMutableString *)description 
{ 
    self.description = description; 
} 

Nó gây ra một vòng lặp vô hạn, vì self.description = description; cuộc gọi [self setDescription:description];.

+0

Có cần thiết phải viết '@synthesize description = _description;' sau đó? – muttley91

+1

Bạn chỉ cần khai báo một thuộc tính. Sau đó, một biến mẫu, getter và setter sẽ được tạo tự động cho bạn. Nhưng nếu bạn khai báo getter và setter của riêng bạn, thì biến cá thể không được tạo ra. Vì vậy, bạn nên hoặc '@ tổng hợp' nó hoặc khai báo nó theo cách thủ công trong' @interface {NSMutableString * _description} '. Nhưng nó là một lựa chọn hiếm hoi ngày nay :) Nếu bạn cần cả getter và setter tùy chỉnh, bạn có thể sử dụng '@ synthesize'. Nếu không, bạn có thể bỏ qua nó. Và trên thực tế, nếu bạn không thực hiện một số hành vi tùy chỉnh, bạn cũng có thể bỏ qua getter và setter. Khai báo '@ property' là đủ. – FreeNickname

+0

Cảm ơn! Vì vậy, về cơ bản, nếu tôi không có bất kỳ hành vi tùy chỉnh nào cho việc thiết lập/nhận, tôi chỉ có thể khai báo nó. Nếu không, hãy xác định các phương thức và tổng hợp. – muttley91

10

1) NSObject đã có phương thức có tên là mô tả. Chọn một tên khác

2) setter của bạn là một vòng lặp vô hạn

Nhưng khi cho câu hỏi thực tế của bạn: Trình biên dịch sẽ chỉ AutoGenerate biến sự ủng hộ nếu bạn không ghi đè lên cả hai phương pháp.

P.S. Không, bạn không thể chỉ "sử dụng self.description thay vì" bởi vì sau đó getter của bạn cũng sẽ là một vòng lặp vô hạn.

+2

Cảm ơn! Tôi sẽ thay đổi tên và thay đổi setter. Tôi nghĩ rằng việc sử dụng '@synthesize description = _description;' có thể giải quyết vấn đề của tôi (hoặc, sau khi tôi phải đổi tên). – muttley91

+0

Vâng, đó là một cách để buộc trình biên dịch tổng hợp biến ngay cả khi bạn ghi đè cả hai. – borrrden

+0

Lưu ý nhanh rằng "biến sao lưu" được tham chiếu ở trên được gọi là ivars. – MattD

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