memory management object c - quản lý bộ nhớ trong object c
DESCRIPTION
Quản lý bộ nhớ trong Object C Trả lời câu hỏi: - Quy tắc cơ bản quản lý bộ nhớ ARC, Non ARC. - Nên dùng bộ nhớ nào? ARC hay Non ARC?TRANSCRIPT
MEMORY MANAGEMENTCÁCH QUẢN LÝ BỘ NHỚ TRONG IOSPresenter: Huong Nguyen
Skype: lan_huong_a3
04
/11
/20
23
2
NỘI DUNG
Khái niệm Các cách quản lý Chuyển đổi giữa ARC và Non-ARC Nên dùng thế nào? Kết luận Bonus: Những điều cần biết
04
/11
/20
23
3
KHÁI NIỆM
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.
04
/11
/20
23
4
CÁC CÁCH QUẢN LÝ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
04
/11
/20
23
5
NON-ARC-QUY TẮC CƠ BẢN
Chúng ta sở hữu đối tượng (owned) khi sử dụng lệnh alloc hoặc copy đối tượngalloc, allocWithZone:, copy, copyWithZone:, mutableCopy mutableCopyWithZone: (1)
Nếu không sở hữu đối tượng, nhưng vẫn muố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
04
/11
/20
23
6
NON-ARC: VÍ DỤ (1)
UIButton *button = [UIButton alloc] init];//do something with button
//…
[button release];
04
/11
/20
23
7
NON-ARC: VÍ DỤ (2)
UIButton *button = [UIButton alloc] init];UIButton *button2 = [button retain];
//do sth with button 2[button release];[button2 release];
04
/11
/20
23
8
NON ARC-CHIA SẺ
UIButton *button = [[UIButton alloc] init];
button.titleLabel.text = @"click me"; [button release];
NSLog(@"Button title %@",button.titleLabel.text);
LEAK >< Crash
04
/11
/20
23
9
ARC
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.
04
/11
/20
23
10
ARC VS NON ARC
04
/11
/20
23
11
ARC-QUY TẮC CƠ BẢN
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
04
/11
/20
23
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
@property NSString *newTitle; Lỗi
@property (getter=theNewTitle) NSString *newTitle;
Tham khảo thêm:Transaction To Arc Release Note-developer.apple.com
04
/11
/20
23
13
ARC-LIFE TIME-PROPERTY ATTRIBUTES
Non-ARC:@property (retain) MyClass *myObject ARC: @property (strong) MyClass *myObject;
Non-ARC@property (assign) MyClass *myObject ARC: @property (weak) MyClass *myObject; Nếu mặc định không khai báo strong hay
weak Hiểu là strong.
04
/11
/20
23
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.__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;
}
04
/11
/20
23
15
KẾT HỢP ARC &NON ARC
-fno-obj-arc & -fobjc-arc
04
/11
/20
23
16
CHUYỂN PROJECT NON-ARC SANG ARC
04
/11
/20
23
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.
04
/11
/20
23
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???
04
/11
/20
23
19
THAM KHẢO
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ớ
04
/11
/20
23
20
Thank you