memory management object c - quản lý bộ nhớ trong object c

20
MEMORY MANAGEMENT CÁCH QUẢN LÝ BỘ NHỚ TRONG IOS Presenter: Huong Nguyen Skype: lan_huong_a3

Upload: lanhuonga3

Post on 22-Apr-2015

729 views

Category:

Documents


0 download

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

Page 1: Memory Management Object C - Quản lý bộ nhớ trong Object C

MEMORY MANAGEMENTCÁCH QUẢN LÝ BỘ NHỚ TRONG IOSPresenter: Huong Nguyen

Skype: lan_huong_a3

Page 2: Memory Management Object C - Quản lý bộ nhớ trong Object C

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

Page 3: Memory Management Object C - Quản lý bộ nhớ trong Object C

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.

Page 4: Memory Management Object C - Quản lý bộ nhớ trong Object C

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

Page 5: Memory Management Object C - Quản lý bộ nhớ trong Object C

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

Page 6: Memory Management Object C - Quản lý bộ nhớ trong Object C

04

/11

/20

23

6

NON-ARC: VÍ DỤ (1)

UIButton *button = [UIButton alloc] init];//do something with button

//…

[button release];

Page 7: Memory Management Object C - Quản lý bộ nhớ trong Object C

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];

Page 8: Memory Management Object C - Quản lý bộ nhớ trong Object C

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

Page 9: Memory Management Object C - Quản lý bộ nhớ trong Object C

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.

Page 10: Memory Management Object C - Quản lý bộ nhớ trong Object C

04

/11

/20

23

10

ARC VS NON ARC

Page 11: Memory Management Object C - Quản lý bộ nhớ trong Object C

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

Page 12: Memory Management Object C - Quản lý bộ nhớ trong Object C

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

Page 13: Memory Management Object C - Quản lý bộ nhớ trong Object C

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.

Page 14: Memory Management Object C - Quản lý bộ nhớ trong Object C

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;

}

Page 15: Memory Management Object C - Quản lý bộ nhớ trong Object C

04

/11

/20

23

15

KẾT HỢP ARC &NON ARC

-fno-obj-arc & -fobjc-arc

Page 16: Memory Management Object C - Quản lý bộ nhớ trong Object C

04

/11

/20

23

16

CHUYỂN PROJECT NON-ARC SANG ARC

Page 17: Memory Management Object C - Quản lý bộ nhớ trong Object C

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.

Page 18: Memory Management Object C - Quản lý bộ nhớ trong Object C

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???

Page 20: Memory Management Object C - Quản lý bộ nhớ trong Object C

04

/11

/20

23

20

Thank you