Trong ví dụ của bạn, mapView1
là một biến đối tượng (ivar), một phần lưu trữ bộ nhớ thuộc về một thể hiện của lớp được định nghĩa trong example.h
và example.m
. mapView
là tên của một tài sản . Thuộc tính là thuộc tính của một đối tượng có thể được đọc hoặc đặt bằng cách sử dụng ký hiệu dấu chấm : myObject.mapView
. Một tài sản không có được dựa trên một Ivar, nhưng hầu hết tài sản này. Các @property
tuyên bố đơn giản là nói với thế giới rằng có một tài sản được gọi mapView
.
@synthesize mapView = mapView1;
Dòng này báo cho trình biên dịch tạo một setter và getter cho mapView
, và họ nên sử dụng ivar được gọi mapView1
. Không có = mapView1
phần này, trình biên dịch sẽ cho rằng thuộc tính và ivar có cùng tên. (Trong trường hợp này, điều đó sẽ tạo ra lỗi trình biên dịch, vì không có lệnh gọi ngà mapView
.)
Kết quả của @synthesize
tuyên bố này tương tự như nếu bạn đã tự thêm mã này:
-(MKMapView *)mapView
{
return mapView1;
}
-(void)setMapView:(MKMapView *)newMapView
{
if (newMapView != mapView1)
{
[mapView1 release];
mapView1 = [newMapView retain];
}
}
Nếu bạn tự thêm mã đó vào lớp, bạn có thể thay thế @synthesize
câu lệnh bằng
@dynamic mapView;
Điều chính là để có một sự phân biệt khái niệm rất rõ ràng giữa ngà voi và tài sản. Họ thực sự là hai khái niệm rất khác nhau.