3. KHÁI NIỆM
10/30/2013
Quản lý bộ nhớ là quá trình cấp phát, sử dụng và giải
phóng bộ nhớ của ứng dụng.
Giải phóng bộ nhớ bằng tay:
Không giải phóng bộ nhớ -> Gây ra rò rỉ -> Làm chậm
chương trình hoặc crash.
Giải phóng bộ nhớ quá tay -> memory corruption ->
Crash.
2
4. CÁCCÁCHQUẢNLÝ
10/30/2013
Khi tạo 1 project, Cách quản lý bộ nhớ của 1 project sẽ
được thiết lập ở 1 trong 2 loại cơ bản:
Non-ARC
ARC
Ngoài ra, có thể sử dụng kết hợp ARC và Non-ARC
trong 1 project
3
5. NON-ARC-QUY TẮC CƠ BẢN
10/30/2013
Chúngtasởhữuđối tượng (owned)
khisửdụnglệnhallochoặc copy đối tượngalloc,
allocWithZone:, copy, copyWithZone:, mutableCopy
mutableCopyWithZone: (1)
Nếukhôngsởhữuđốitượng, nhưngvẫnmuốn lưu đối
tượng vào bộ nhớ để sử dụng lại (ownership
interest) retain (2)
(1), (2) Khi không cần dùng đối tượng nữa phải
dùng release, autorelease để giải phóng đối tượng.
Không phải (1), (2) thì không được phép release
đối tượng
4
9. ARC
10/30/2013
Khi làm việc với Non-ARCmất nhiều thời gian
phải quản lý bộ nhớ, viết lệnh retain, release,
autorelease ARC: Tính năng quản lý bộ nhớ tự
động, trong quá trình project được compile, trình
biên dịch tự động chèn release, dealloc function
vào thay vì suy nghĩ xem nên đặt release, retain thế
nào.
Code ngắn gọn hơn, ít stress hơn, hiệu quả hơn.
Chỉ chạy được trên IOS 4.3 trở lên.
8
11. ARC-QUY TẮC CƠ BẢN
10/30/2013
Không dùng hàm dealloc, retain, release,
retainCount, autorelease nữa.
Có thể implement hàm dealloc để quản lý tài
nguyên chứ không giải phóng bộ nhớ (VD: Set lại
delegate [systemClassInstance setDelegate:nil])
không gọi hàm [super dealloc].
Không được sử dụng object NSAutoreleasepool
10
12. ARC-QUY TẮC CƠ BẢN (2)
Tránh đặt tên varible bắt đầu bằng new, nếu lỡ rồi
thì phải sửa
10/30/2013
@property NSString *newTitle; Lỗi
@property (getter=theNewTitle) NSString *newTitle;
Tham khảo thêm:Transaction To Arc Release Notedeveloper.apple.com
11
14. ARC-LIFE TIME-VARIBLE QUALIFIER
__strong (default) sở hữu đối tượng
__weak có thể trỏ tới đối tượng, nhưng không thể sở
hữu đối tượng.
10/30/2013
__weak NSString *weakName = self.textField.text;
__unsafe_unretained: Được dùng cho những TH đặc
biệt như kiểu struct
struct MyStruct {
NSString __unsafe_unretained *text;
};
__autoreleasing: Được tự động giải phóng khi kết thúc
hàm
- (BOOL) doSomething:(NSError * __autoreleasing *)myError {
*myError = [[NSError alloc] init];
// ...
return NO;
}
13
17. NÊN DÙNG THẾ NÀO? KẾT
Nếu không vì lý do đặc biệt nào (đòi hỏi chạy trên
IOS version thấp hơn) nên dùng ARC.
10/30/2013
16
18. BONUS: NHỮNG ĐIỀU CẦN BIẾT
Iphone 3G có dung lượng Ram 128Mb, nhưng
phần lớn bộ nhớ được sử dụng cho HĐH, dung
lượng phục vụ cho app vào khoảng <40MB. Chúng
ta có thể gặp memory warning ngay cả khi sử dụng
3MB???
10/30/2013
17
19. THAM KHẢO
10/30/2013
Căn bản về quản lý bộ nhớ-Apple
Transition To ARC Release Note-Apple
Nên dùng ARC hay không?-Stackoverflow
Một số lưu ý về quản lý bộ nhớ-akosma.com
Tutorial về quản lý bộ nhớ
18