Property trong Objective-C



PROPERTY TRONG OBJECTIVE-C

I. Khai báo
//Trong file .h
@property (thuộc tính 1, thuộc tính 2,...) <Kiểu Dữ Liệu> <Tên Property>;
//Trong file .m 
@synthesize <Tên Property>;

Ví dụ:
//Trong file .h
@property (nonatomic, assign) NSInteger tuSo;
//Trong file .m
@synthesize tuSo;

Ghi chú: Dùng từ khóa synthesize để trình biên dịch tự động tạo hai hàm getter và setter (trong điều kiện là ta chưa viết 2 hàm này), nếu ta đã tự viết các hàm setter và getter sẵn rồi thì trình biên dịch sẽ không tạo thêm getter và setter nữa.

II. Truy cập
<Tên Object>.<Tên Property>;

Ví dụ:
phanSoA.tuSo; //Get
phanSoA.tuSo = 2; //Set
Tương đương với:
[phanSoA tuSo]; //Get
[phanSoA setTuSo:2]; //Set

III. Các thuộc tính
-readwrite: property có thể đọc và ghi vào biến thể hiện, đây là thuộc tính mặc định.
-read-only: property chỉ có thể đọc.

-automic: kiểm tra đảm bảo đồng bộ khi nhiều tiểu trình cùng truy cập, là thuộc tính mặc định.
-nonatomic: không kiểm tra nếu nhiều tiểu trình cùng truy cập, nhanh hơn automic.

-assign: không cần giữ lại tham số truyền vào trước khi set, dùng cho các kiểu dữ liệu vô hướng, đây là thuộc tính mặc định.
-retain: giữ lại tham số truyền vào trước khi set, dùng cho kiểu dữ liệu là các lớp đối tượng.
-copy: tạo một bản sao của tham số truyền vào trước khi set, thường dùng khi là lớp NSString.

-strong: Được sử dụng trong ARC, ý nghĩa tương tự như retain trong MRC. Sử dụng strong khi bạn muốn sỡ hữu đối tượng, là thuộc tính mặc định.
-weak: Được sử dụng trong ARC, ý nghĩa tương tự như assign, khác ở chỗ là khi đối tượng được giải phóng, property sẽ tự động được gán bằng nil. Sử dụng khi bạn không muốn sỡ hữu đối tượng và khi bạn muốn tránh tình trạng retain cycles (đối tượng A retain đối tượng B và đối tượng B cũng retain đối tượng A dẫn đến cả A và B đều không thể được giải phóng). Trong MRC thì weak chính là unsafe_unretained.

IV. Mẹo sử dụng
1. Nên khai báo property cho biến thể hiện, và đặt tên cho property khác với biến thể hiện theo quy tắc sau :

//Trong file .h
@interface MyClass : NSObject {
PhanSo *_phanSo;
}
@property (nonatomicretainPhanSo *phanSo;
@end

//Trong file .m
@implementation MyClass
@synthesize phanSo = _phanSo;
@end

2. Nên sử dụng self.property để truy cập property thay vì truy cập biến thể hiện.

3. Property nào có thuộc tính retain hoặc copy đều cần phải giải phóng trong hàm dealloc (MRC) :

- (void)dealloc { 
    self.phanSo nil
    [super dealloc]; 
}

Ghi chú : Ở cách trên(self.phanSo = nil), trong hàm setter sẽ xảy ra ba việc, một là giữ lại đối tượng nil (thật ra giống như chẳng làm gì), hai là release giải phóng biến thể hiện cũ đi, và ba là gán biến mới bằng nil, cách giải phóng trên sẽ ngắn gọn hơn so với cách không dùng property là :

- (void)dealloc { 
    [_phanSo release];
    _phanSo nil
    [super dealloc]; 
}

4. Trong quá trình sử dụng property ở MRC tránh sử dụng câu lệnh sau :

self.phanSo = [[PhanSo allocinit];

Nguyên nhân: do khi thực hiện câu lệnh trên ta sở hữu đối tượng tới 2 lần, retain count = 2, và như vậy là không cần thiết và phung phí bộ nhớ.

Giải pháp :


+ Vẫn sử dụng property :
self.phanSo = [[[PhanSo allocinitautorelease];

+ Sử dụng biến thể hiện :
_phanSo = [[PhanSo allocinit];



Nguồn: LMinh

Nhận xét

  1. Cám ơn vì bài viết của ban.
    Mình hi vọng sẽ có bài chi tiết về thuộc tính của property. Cám ơn bạn lần nữa.

    Trả lờiXóa
  2. cảm ơn bạn. Bài viết rất bổ ích

    Trả lờiXóa
  3. bài viết hay quá. thanks bạn :)

    Trả lờiXóa

Đăng nhận xét

Bài đăng phổ biến từ blog này

Quản lý bộ nhớ trong Objective-C

Design pattern là gì?