Làm cách nào để ghi đè getters @synthesized?


75

làm thế nào để ghi đè một getter tổng hợp thuộc tính?


2
Đây không phải là iPhone hoặc iOS cụ thể. Nó thậm chí không dành riêng cho bất kỳ nền tảng hoặc khuôn khổ nào.

"Ghi đè" có một ý nghĩa cụ thể trong OOP và Objective-C. Than ôi, bạn có thể có ý khác: "Làm thế nào để ngăn việc tổng hợp một getter và thay vào đó triển khai nó theo cách thủ công?" Nếu tôi giải thích cho bạn một cách chính xác, bạn đã chấp nhận câu trả lời sai.
Nikolai Ruhe

2
@ user142019: Tại sao điều đó lại quan trọng?
Stewart Macdonald

Câu trả lời:


55

Bên trong định nghĩa thuộc tính của bạn, bạn có thể chỉ định các phương thức getter và setter như sau:

@property (nonatomic, retain, getter = getterMethodName, setter = setterMethodName) NSString *someString;

Bạn có thể chỉ định getter only, setter only hoặc cả hai.


Làm thế nào để chỉ định getter only / setter only?
Pedro Rolo

Trong dự án Xcode của tôi, tôi không cần phải @synthesize someString, trong trường hợp này tôi có thể đặt giá trị của nó bằng cách nào? Lỗi Xcode cho biết đó là tài sản chưa được khai báo .. Thx
Ông Frank

5
@ Mr.Frank: Xcode bây giờ tự động tổng hợp các thuộc tính theo mặc định. Điều này đã được thêm vào một trong các phiên bản Xcode (4.5?). Vì vậy, về cơ bản, bạn không cần phải có @synthesizecác biến của mình nữa, bạn chỉ cần @property, và trong đó bạn chỉ cần chỉ định getter và / hoặc setter của mình.
matsr

76

Chỉ cần triển khai phương pháp theo cách thủ công, ví dụ:

- (BOOL)myBoolProperty
{
    // do something else
    ...
    return myBoolProperty;
}

Sau đó, trình biên dịch sẽ không tạo ra một phương thức getter.


12
Lưu ý rằng nếu @propertylà của bạn atomic(mặc định), bạn không thể trộn một cách chính xác @synthesized getter / setter với getter / setter được viết thủ công.
bbum

12
Sợ cái gì? điều đóatomic không hữu ích; nó không làm gì để đảm bảo tính toàn vẹn của dữ liệu trong một ứng dụng phân luồng. Nó chỉ ngăn ứng dụng bị treo do điều kiện chủng tộc rõ ràng. Nếu bạn đang dựa vào rất nhiều, bạn gần như chắc chắn làm nó sai ... :)atomic
bbum

2
@bbum: bạn có thể giải thích rõ hơn về ý của bạn khi "bạn không thể kết hợp chính xác getter / setter tổng hợp với getter / setter được viết thủ công" khi thuộc tính là nguyên tử? Tôi không hiểu cái này có liên quan gì đến cái kia. Cảm ơn.
Ole Begemann

6
Chắc chắn rồi; stackoverflow.com/questions/588866/… có thể hữu ích. Cụ thể, vì cơ chế khóa để triển khai atomickhông được tiếp xúc, không có cách nào bạn có thể triển khai thủ công chỉ setter hoặc chỉ getter và đảm bảo tính nguyên tử bằng @synthesized atomicsetter / getter.
bbum

1
Nếu bạn viết một phương thức getter như vậy, liệu thuộc tính có tự động được chỉ đọc không? nếu không, dữ liệu sẽ được lưu trữ ở đâu nếu thuộc tính được gán giá trị?
matthias_buehlmann

43

Chỉ cần triển khai getter của riêng bạn và trình biên dịch sẽ không tạo ra một getter. Tương tự đối với setter.

Ví dụ:

@property float value;

tương đương với:

- (float)value;
- (void)setValue:(float)newValue;

10

Tôi chỉ muốn thêm, tôi không thể ghi đè thuộc tính BOOL bằng getter / setter, cho đến khi tôi thêm cái này:

@synthesize myBoolProperty = _myBoolProperty;

vì vậy mã hoàn chỉnh là:

trong tệp tiêu đề:

@property  BOOL myBoolProperty;

trong tệp thực hiện:

@synthesize myBoolProperty = _myBoolProperty;


-(void)setMyBoolProperty:(BOOL) myBoolPropertyNewValue
{
    _myBoolProperty = myBoolPropertyNewValue;
}

-(BOOL) myBoolProperty
{
    return _myBoolProperty;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.