SlideShare ist ein Scribd-Unternehmen logo
1 von 39
Quản lý bộ nhớ khi
lập trình Apple iOS
     Trịnh Minh Cường
    http://techmaster.vn

                           http://techmaster.vn
Bài trình bày này tập trung vào vấn
đề kỹ thuật trong phát triển native
 app cho Apple iPhone/iPod/iPad.

   Dành riêng cho lập trình viên
                              http://techmaster.vn
Android (Java) – Windows Phone (C#)


 Bộ nhớ được cấp         Không có biến trỏ
                                                         Garbage Collector
phát khi có nhu cầu     đến, hoặc biến đã
                                                         sẽ thu hồi bộ nhớ
      sử dụng           hết hạn trong stack




                 ObjY
    P2
    P1           ObjX




   Stack         Heap   http://www.simple-talk.com/dotnet/.net-
                        framework/understanding-garbage-collection-in-.net/
                                                                  http://techmaster.vn
iOS khác với Android, Windows Phone
• Native iOS app lập trình bằng Objective-C.



          C language       Smalltalk



                 Objective C


                                           http://techmaster.vn
iOS không thu hồi bộ nhớ tự động
          hiện đại như Android hay .NET



                                         Quản lý bộ nhớ khi lập
                                         trình là công việc nhàm
                                           chán nhưng vẫn cần
                                          làm đúng ngay từ đầu


Bít nước rò rỉ tại đập thủy điện sông Gianh               http://techmaster.vn
Pointer – Con trỏ
• Pointer trỏ đến đối tượng. Nó giúp đối tượng
  được giữ lại trong heap.
• Khi đối tượng không còn bất kỳ ai trỏ đến, nó
  cần được loại bỏ để giải phóng bộ nhớ.



            A
                          Object in heap

            B

                                           http://techmaster.vn
• Con trỏ có thể là biến cục bộ trỏ tới đối tượng ở
  heap
• Hoặc nó là thành phần của đối tượng, trỏ đến đối
  tượng khác



                 *p



                Stack          Heap

                                            http://techmaster.vn
[object release]
NSArray *array = [[NSArray alloc] initWithObjects:
@"Honda", @"Yamaha”, nil];
NSLog(@“Retain count: %d", [array retainCount]);
[array release];

                                RetainCount = 1
                      Honda
  array              Yamaha




   Stack             Heap
                                                     http://techmaster.vn
Nếu không release dẫn đến vùng nhớ do
array trước đây trỏ tới trở nên vô chủ. App
vẫn chạy nhưng bộ nhớ bị rò rỉ, leaking.




                                      http://techmaster.vn
Product – Analyze để phân tích kiểm tra




                                  http://techmaster.vn
Product - Profile




                    http://techmaster.vn
LEAK !!!


                                    Thủ phạm gây ra Leak




Nên sử dụng thường xuyên đối với các dự án Non ARC !
                                              http://techmaster.vn
NSArray *array = [[NSArray alloc] initWithObjects:
@"Honda", @"Yamaha”, nil];
[array release];//Cần phải release




UIImage *aImage = [UIImage imageNamed:@”A.png"];
[aImage release]; //Không cần phải release. TẠI SAO?




                                                http://techmaster.vn
[UIImage imageNamed… ] trả về đối tượng
autorelease (tự nhả). Do đó không cần gửi
message release đến đối tượng này nữa.




                                     http://techmaster.vn
[object autorelease]
• Dùng khi tạo một object trong hàm rồi trả
  về qua return.

• [object autorelease] : object sẽ được quản
  lý trong AutoRelease pool

• Lạm dụng autorelease không tốt. Tại sao?


                                      http://techmaster.vn
Kết thúc mỗi chu kỳ xử lý sự kiện, CocoaTouch sẽ
gửi message release đến tất cả các autorelease
object.




                                           http://techmaster.vn
RetainCount = 2


   RetainCount = 0


   RetainCount = 3



   RetainCount = 0


Autorelease pool
                     Heap


                        http://techmaster.vn
[object retain] dùng khi nào?
NSArray *resultArray = [self returnAnArray];

NSArray *anotherArrayPointer = resultArray;




[resultArray release];

[anotherArrayPointer doSomething];

                  Bad memory access !d
                                               http://techmaster.vn
Trước khi chuyển con trỏ đến đối
tượng khác cần release đối tượng cũ


              objX

                     [p release]
*p

              objY

              Heap             http://techmaster.vn
@property

Giúp định nghĩa biến thành phần
tinh tế hơn bằng cách bổ xung
thêm attributes

                             http://techmaster.vn
Attribute                         Ý nghĩa

             Không hỗ trợ truy xuất đồng bộ nhưng sẽ
nonatomic
             nhanh hơn
retain       Tăng ref count của đối tượng thêm 1

             Dành riêng cho kiểu căn bản (primitive data
assign       type), struct hoặc đối tượng nếu không tăng
             ref count
readonly     Chỉ đọc, tạo duy nhất getter

readwrite    Cả đọc ghi. Tạo cả getter và setter

             Copy đối tượng gán sang vùng nhớ mới. Chỉ
copy
             có tác dụng với kiểu MutableXXX   http://techmaster.vn
*p1




Dead Lock in memory



          *p2

                      http://techmaster.vn
• Pointer trong Objective-C mặc định là
  strong
• Cyclic reference gây nên dead lock. Đối
  tượng trong dead lock không thể giải
  phóng, gây thất thoát bộ nhớ
• Cách xử lý, sử dụng __weak


@property (nonatomic, assign)   __weak   A *pA;
                                            http://techmaster.vn
ARC saves you from
mem leak or crash !



      ARC

               http://techmaster.vn
Tính năng quản lý bộ nhớ trong iOS SDK

iOS 1.2               iOS 4.0   iOS 5.0           iOS 5.1       iOS 6.0
                                          5.0.1


3/2008                6/2010    10/2011           3/2012       6/2012



• Trước iOS 5: Manual Retain / Release (Giữ - nhả
  thủ công đối tượng ở heap)

• Sau iOS 5: Automatic Reference Counting (Tự
  động đếm con trỏ trỏ đến đối tượng ở heap)
                                                            http://techmaster.vn
ARC
• LTV không dùng retain, release, autorelease,
  dealloc thủ công nữa.

• Trình biên dịch tự động chèn retain,
  release, autorelease, dealloc khi cần.

• Thêm một số tính năng mới: strong,
  weak


                                       http://techmaster.vn
ARC
• Không phải là cơ chế quản lý bộ nhớ hoàn
  toàn mới
• Không là Garbage Collector như nhiều
  người hiểu nhầm
• Bộ nhớ vẫn có thể thất thoát, ứng dụng đổ
  vỡ nếu dùng sai
• Giải phóng bộ nhớ không tinh tế như JVM
  hay .NET runtime, nhưng rất phù hợp thiết
  bị smartphone                      http://techmaster.vn
strong vs weak
• Mặc định con trỏ là strong

__weak NSString *weakP = textField.text;

      @”Mobile Day              @”Mobile Day
         2011”                     2012”


NIL

         *weakP                textField.text
                                                http://techmaster.vn
Kinh nghiệm
• Dùng strong pointer để giữ đối
  tượng mình tạo ra.

• Không dùng strong pointer để giữ
  đối tượng không thực sự của
  mình  không thể giải phóng bộ
  nhớ. Dùng weak pointer là đủ.
                              http://techmaster.vn
• Gán strong pointer = nil ở hàm viewDidUnload để
  iOS giải phóng đối tượng không cần dùng nữa.
- (void)viewDidUnload
{
   [super viewDidUnload];
   myString = nil;
   myImage = nil;
}

• Không nhất thiết phải dùng strong để trỏ tới
  phần tử giao diện trong XIB.

@property (nonatomic, weak) IBOutlet UIButton *myButton;

                                                http://techmaster.vn
???



      http://techmaster.vn
ARC cần IOS SDK 5.x nhưng hỗ trợ iOS SDK
                   4.x

• LTV bắt buộc phải dùng iOS SDK 5.x để bật ARC
  nhưng có thể chọn deployment target xuống iOS
  4.x.

• Lưu ý iOS 4.x không hỗ trợ automatic weak
  reference zeroing.



                                          http://techmaster.vn
Trên menu của XCode, chọn
Edit -> Refactor -> Convert to Objective-C ARC




                                        http://techmaster.vn
bridge trong ARC
__bridge_transfer: cast đối tượng miền CFObject
sang miền NSObject sau đó release CFObject

__bridge_retained: cast đối tượng miền
NSObject sang CFObject nhưng giữ đối tượng
cũ.

__bridge: chuyển đổi qua lại đối tượng giữa miền
CFObject và NSObject, không quan tâm reference
counter.
                                         http://techmaster.vn
Ứng dụng ARC vẫn có thể xài mã nonARC

• Một số thư viện không dùng ARC như
  ASIHttpRequest, AFNetworking,…




• Làm thế nào để dùng chúng trong dự
  án bật ARC ?

                                    http://techmaster.vn
Bật compiler flags –fno-objc-arc lên !
                                 http://techmaster.vn
Còn nhiều vấn đề nữa…..


• Truy vấn biến trong phạm vi block
• Xử lý khi bộ nhớ dùng cạn
• Lazy Loading
• Quản lý bộ nhớ khi lập trình đồng bộ
• Chuyển đổi vùng nhớ C++ với Objective_C

                                         http://techmaster.vn
Sao phức tạp thế
                 !!!?




Đừng lo lắng, cứ lập trình
đi rồi sẽ quen !
                               http://techmaster.vn
Xin chân thành cảm ơn các bạn đã
          chú ý lắng nghé




                            http://techmaster.vn

Weitere ähnliche Inhalte

Ähnlich wie Quản lý bộ nhớ trong khi phát triển ứng dụng Apple iOS

gioi thieu ve java
gioi thieu ve javagioi thieu ve java
gioi thieu ve javaDat Ngo
 
Lập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệLập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệTrần Thiên Đại
 
Giới thiệu Nuxt.js
Giới thiệu Nuxt.jsGiới thiệu Nuxt.js
Giới thiệu Nuxt.jsRobin Huy
 
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng YênGiáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng YênTrần Thiên Đại
 
Ebook lập trình Java hướng đối tượng (Tiếng việt)
Ebook lập trình Java hướng đối tượng (Tiếng việt)Ebook lập trình Java hướng đối tượng (Tiếng việt)
Ebook lập trình Java hướng đối tượng (Tiếng việt)Duy Lê Văn
 
Khóa học lập trình ios
Khóa học lập trình iosKhóa học lập trình ios
Khóa học lập trình iosĐào tạo Seo
 
VMD2017 - Sử dụng React Native cho môi trường Production: khả thi đến đâu? kh...
VMD2017 - Sử dụng React Native cho môi trường Production: khả thi đến đâu? kh...VMD2017 - Sử dụng React Native cho môi trường Production: khả thi đến đâu? kh...
VMD2017 - Sử dụng React Native cho môi trường Production: khả thi đến đâu? kh...Thanh Nguyen
 
Php crawler and parser
Php crawler and parserPhp crawler and parser
Php crawler and parserNgoc Bui Dinh
 
Thêm sửa-xóa-combobox - c#
Thêm sửa-xóa-combobox - c#Thêm sửa-xóa-combobox - c#
Thêm sửa-xóa-combobox - c#Văn Dũng
 
BÀI THÍ NGHIỆM SỐ XÂY DỰNG HIBERNATE CHO ỨNG DỤNG JAVA_10441312092019
BÀI THÍ NGHIỆM SỐ XÂY DỰNG HIBERNATE CHO ỨNG DỤNG JAVA_10441312092019BÀI THÍ NGHIỆM SỐ XÂY DỰNG HIBERNATE CHO ỨNG DỤNG JAVA_10441312092019
BÀI THÍ NGHIỆM SỐ XÂY DỰNG HIBERNATE CHO ỨNG DỤNG JAVA_10441312092019TiLiu5
 
Cấp phát bộ nhớ động trong C
Cấp phát bộ nhớ động trong CCấp phát bộ nhớ động trong C
Cấp phát bộ nhớ động trong CIam Me
 
Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...
Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...
Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...VKhang Yang
 
Sử dụng dịch vụ crawler và parser trong PHP
Sử dụng dịch vụ crawler và parser trong PHPSử dụng dịch vụ crawler và parser trong PHP
Sử dụng dịch vụ crawler và parser trong PHPAiTi Education
 
7. xu ly bat dong bo
7. xu ly bat dong bo7. xu ly bat dong bo
7. xu ly bat dong boJustin Hoang
 
Hướng Dẫn Lập Trình Android: 7. Xu ly bat dong bo
Hướng Dẫn Lập Trình Android: 7. Xu ly bat dong boHướng Dẫn Lập Trình Android: 7. Xu ly bat dong bo
Hướng Dẫn Lập Trình Android: 7. Xu ly bat dong boWendy587439
 

Ähnlich wie Quản lý bộ nhớ trong khi phát triển ứng dụng Apple iOS (20)

Gioi thieu ve_java
Gioi thieu ve_javaGioi thieu ve_java
Gioi thieu ve_java
 
gioi thieu ve java
gioi thieu ve javagioi thieu ve java
gioi thieu ve java
 
Node.js căn bản
Node.js căn bảnNode.js căn bản
Node.js căn bản
 
Apache+ q logs
Apache+ q logsApache+ q logs
Apache+ q logs
 
Lập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệLập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất Nghệ
 
Giới thiệu Nuxt.js
Giới thiệu Nuxt.jsGiới thiệu Nuxt.js
Giới thiệu Nuxt.js
 
Gt java080102005
Gt java080102005Gt java080102005
Gt java080102005
 
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng YênGiáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
 
Ebook lập trình Java hướng đối tượng (Tiếng việt)
Ebook lập trình Java hướng đối tượng (Tiếng việt)Ebook lập trình Java hướng đối tượng (Tiếng việt)
Ebook lập trình Java hướng đối tượng (Tiếng việt)
 
Khóa học lập trình ios
Khóa học lập trình iosKhóa học lập trình ios
Khóa học lập trình ios
 
VMD2017 - Sử dụng React Native cho môi trường Production: khả thi đến đâu? kh...
VMD2017 - Sử dụng React Native cho môi trường Production: khả thi đến đâu? kh...VMD2017 - Sử dụng React Native cho môi trường Production: khả thi đến đâu? kh...
VMD2017 - Sử dụng React Native cho môi trường Production: khả thi đến đâu? kh...
 
Php crawler and parser
Php crawler and parserPhp crawler and parser
Php crawler and parser
 
Thêm sửa-xóa-combobox - c#
Thêm sửa-xóa-combobox - c#Thêm sửa-xóa-combobox - c#
Thêm sửa-xóa-combobox - c#
 
BÀI THÍ NGHIỆM SỐ XÂY DỰNG HIBERNATE CHO ỨNG DỤNG JAVA_10441312092019
BÀI THÍ NGHIỆM SỐ XÂY DỰNG HIBERNATE CHO ỨNG DỤNG JAVA_10441312092019BÀI THÍ NGHIỆM SỐ XÂY DỰNG HIBERNATE CHO ỨNG DỤNG JAVA_10441312092019
BÀI THÍ NGHIỆM SỐ XÂY DỰNG HIBERNATE CHO ỨNG DỤNG JAVA_10441312092019
 
Cấp phát bộ nhớ động trong C
Cấp phát bộ nhớ động trong CCấp phát bộ nhớ động trong C
Cấp phát bộ nhớ động trong C
 
Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...
Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...
Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...
 
Sử dụng dịch vụ crawler và parser trong PHP
Sử dụng dịch vụ crawler và parser trong PHPSử dụng dịch vụ crawler và parser trong PHP
Sử dụng dịch vụ crawler và parser trong PHP
 
7. xu ly bat dong bo
7. xu ly bat dong bo7. xu ly bat dong bo
7. xu ly bat dong bo
 
Cac bai tap .net
Cac bai tap .netCac bai tap .net
Cac bai tap .net
 
Hướng Dẫn Lập Trình Android: 7. Xu ly bat dong bo
Hướng Dẫn Lập Trình Android: 7. Xu ly bat dong boHướng Dẫn Lập Trình Android: 7. Xu ly bat dong bo
Hướng Dẫn Lập Trình Android: 7. Xu ly bat dong bo
 

Mehr von action.vn

Bao cao tai nguyen Internet VN 2013
Bao cao tai nguyen Internet VN 2013Bao cao tai nguyen Internet VN 2013
Bao cao tai nguyen Internet VN 2013action.vn
 
ComScore - Southeast Asia Digital Future in Focus 2013
ComScore - Southeast Asia Digital Future in Focus 2013ComScore - Southeast Asia Digital Future in Focus 2013
ComScore - Southeast Asia Digital Future in Focus 2013action.vn
 
comScore's Presentation Google's Think Digital Vietnam 11-Dec-2012
comScore's Presentation Google's Think Digital Vietnam 11-Dec-2012comScore's Presentation Google's Think Digital Vietnam 11-Dec-2012
comScore's Presentation Google's Think Digital Vietnam 11-Dec-2012action.vn
 
Toan canh thuong mai dien tu 2012
Toan canh thuong mai dien tu 2012Toan canh thuong mai dien tu 2012
Toan canh thuong mai dien tu 2012action.vn
 
White book 2012 - Các vấn đề thương mại/đầu tư và kiến nghị
White book 2012 - Các vấn đề thương mại/đầu tư và kiến nghịWhite book 2012 - Các vấn đề thương mại/đầu tư và kiến nghị
White book 2012 - Các vấn đề thương mại/đầu tư và kiến nghịaction.vn
 
Amazon Annual Report
Amazon Annual ReportAmazon Annual Report
Amazon Annual Reportaction.vn
 
HIGH IMPACT ENTREPRENEURS
HIGH IMPACT ENTREPRENEURSHIGH IMPACT ENTREPRENEURS
HIGH IMPACT ENTREPRENEURSaction.vn
 
Bao cao EBI TMDT 2012
Bao cao EBI TMDT 2012Bao cao EBI TMDT 2012
Bao cao EBI TMDT 2012action.vn
 
VC-Corp Intro
VC-Corp IntroVC-Corp Intro
VC-Corp Introaction.vn
 
Mobile Trends: Cơ hội còn bỏ ngỏ
Mobile Trends: Cơ hội còn bỏ ngỏMobile Trends: Cơ hội còn bỏ ngỏ
Mobile Trends: Cơ hội còn bỏ ngỏaction.vn
 
Mobile VAS market in Vietnam
Mobile VAS market in VietnamMobile VAS market in Vietnam
Mobile VAS market in Vietnamaction.vn
 
Vietnam’s Web in 2012
Vietnam’s Web in 2012Vietnam’s Web in 2012
Vietnam’s Web in 2012action.vn
 
Mạng quảng cáo gia tăng hiệu quả cho quảng cáo hiển thị
Mạng quảng cáo gia tăng hiệu quả cho quảng cáo hiển thịMạng quảng cáo gia tăng hiệu quả cho quảng cáo hiển thị
Mạng quảng cáo gia tăng hiệu quả cho quảng cáo hiển thịaction.vn
 
IDC Q3 2012 Mobile Developer Report
IDC Q3 2012 Mobile Developer ReportIDC Q3 2012 Mobile Developer Report
IDC Q3 2012 Mobile Developer Reportaction.vn
 
Why not to do a startup?
Why not to do a startup?Why not to do a startup?
Why not to do a startup?action.vn
 
Mobiles share of the mix marketing evolution
Mobiles share of the mix marketing evolutionMobiles share of the mix marketing evolution
Mobiles share of the mix marketing evolutionaction.vn
 
Khảo sát lứa tuổi Teen Việt Nam 2012
Khảo sát lứa tuổi Teen Việt Nam 2012Khảo sát lứa tuổi Teen Việt Nam 2012
Khảo sát lứa tuổi Teen Việt Nam 2012action.vn
 
Creative design for mobile social game
Creative design for mobile social gameCreative design for mobile social game
Creative design for mobile social gameaction.vn
 
Balance in SNS by Energy
Balance in SNS by EnergyBalance in SNS by Energy
Balance in SNS by Energyaction.vn
 
Training and developing human resources in a game studio
Training and developing human resources in a game studioTraining and developing human resources in a game studio
Training and developing human resources in a game studioaction.vn
 

Mehr von action.vn (20)

Bao cao tai nguyen Internet VN 2013
Bao cao tai nguyen Internet VN 2013Bao cao tai nguyen Internet VN 2013
Bao cao tai nguyen Internet VN 2013
 
ComScore - Southeast Asia Digital Future in Focus 2013
ComScore - Southeast Asia Digital Future in Focus 2013ComScore - Southeast Asia Digital Future in Focus 2013
ComScore - Southeast Asia Digital Future in Focus 2013
 
comScore's Presentation Google's Think Digital Vietnam 11-Dec-2012
comScore's Presentation Google's Think Digital Vietnam 11-Dec-2012comScore's Presentation Google's Think Digital Vietnam 11-Dec-2012
comScore's Presentation Google's Think Digital Vietnam 11-Dec-2012
 
Toan canh thuong mai dien tu 2012
Toan canh thuong mai dien tu 2012Toan canh thuong mai dien tu 2012
Toan canh thuong mai dien tu 2012
 
White book 2012 - Các vấn đề thương mại/đầu tư và kiến nghị
White book 2012 - Các vấn đề thương mại/đầu tư và kiến nghịWhite book 2012 - Các vấn đề thương mại/đầu tư và kiến nghị
White book 2012 - Các vấn đề thương mại/đầu tư và kiến nghị
 
Amazon Annual Report
Amazon Annual ReportAmazon Annual Report
Amazon Annual Report
 
HIGH IMPACT ENTREPRENEURS
HIGH IMPACT ENTREPRENEURSHIGH IMPACT ENTREPRENEURS
HIGH IMPACT ENTREPRENEURS
 
Bao cao EBI TMDT 2012
Bao cao EBI TMDT 2012Bao cao EBI TMDT 2012
Bao cao EBI TMDT 2012
 
VC-Corp Intro
VC-Corp IntroVC-Corp Intro
VC-Corp Intro
 
Mobile Trends: Cơ hội còn bỏ ngỏ
Mobile Trends: Cơ hội còn bỏ ngỏMobile Trends: Cơ hội còn bỏ ngỏ
Mobile Trends: Cơ hội còn bỏ ngỏ
 
Mobile VAS market in Vietnam
Mobile VAS market in VietnamMobile VAS market in Vietnam
Mobile VAS market in Vietnam
 
Vietnam’s Web in 2012
Vietnam’s Web in 2012Vietnam’s Web in 2012
Vietnam’s Web in 2012
 
Mạng quảng cáo gia tăng hiệu quả cho quảng cáo hiển thị
Mạng quảng cáo gia tăng hiệu quả cho quảng cáo hiển thịMạng quảng cáo gia tăng hiệu quả cho quảng cáo hiển thị
Mạng quảng cáo gia tăng hiệu quả cho quảng cáo hiển thị
 
IDC Q3 2012 Mobile Developer Report
IDC Q3 2012 Mobile Developer ReportIDC Q3 2012 Mobile Developer Report
IDC Q3 2012 Mobile Developer Report
 
Why not to do a startup?
Why not to do a startup?Why not to do a startup?
Why not to do a startup?
 
Mobiles share of the mix marketing evolution
Mobiles share of the mix marketing evolutionMobiles share of the mix marketing evolution
Mobiles share of the mix marketing evolution
 
Khảo sát lứa tuổi Teen Việt Nam 2012
Khảo sát lứa tuổi Teen Việt Nam 2012Khảo sát lứa tuổi Teen Việt Nam 2012
Khảo sát lứa tuổi Teen Việt Nam 2012
 
Creative design for mobile social game
Creative design for mobile social gameCreative design for mobile social game
Creative design for mobile social game
 
Balance in SNS by Energy
Balance in SNS by EnergyBalance in SNS by Energy
Balance in SNS by Energy
 
Training and developing human resources in a game studio
Training and developing human resources in a game studioTraining and developing human resources in a game studio
Training and developing human resources in a game studio
 

Quản lý bộ nhớ trong khi phát triển ứng dụng Apple iOS

  • 1. Quản lý bộ nhớ khi lập trình Apple iOS Trịnh Minh Cường http://techmaster.vn http://techmaster.vn
  • 2. Bài trình bày này tập trung vào vấn đề kỹ thuật trong phát triển native app cho Apple iPhone/iPod/iPad. Dành riêng cho lập trình viên http://techmaster.vn
  • 3. Android (Java) – Windows Phone (C#) Bộ nhớ được cấp Không có biến trỏ Garbage Collector phát khi có nhu cầu đến, hoặc biến đã sẽ thu hồi bộ nhớ sử dụng hết hạn trong stack ObjY P2 P1 ObjX Stack Heap http://www.simple-talk.com/dotnet/.net- framework/understanding-garbage-collection-in-.net/ http://techmaster.vn
  • 4. iOS khác với Android, Windows Phone • Native iOS app lập trình bằng Objective-C. C language Smalltalk Objective C http://techmaster.vn
  • 5. iOS không thu hồi bộ nhớ tự động hiện đại như Android hay .NET Quản lý bộ nhớ khi lập trình là công việc nhàm chán nhưng vẫn cần làm đúng ngay từ đầu Bít nước rò rỉ tại đập thủy điện sông Gianh http://techmaster.vn
  • 6. Pointer – Con trỏ • Pointer trỏ đến đối tượng. Nó giúp đối tượng được giữ lại trong heap. • Khi đối tượng không còn bất kỳ ai trỏ đến, nó cần được loại bỏ để giải phóng bộ nhớ. A Object in heap B http://techmaster.vn
  • 7. • Con trỏ có thể là biến cục bộ trỏ tới đối tượng ở heap • Hoặc nó là thành phần của đối tượng, trỏ đến đối tượng khác *p Stack Heap http://techmaster.vn
  • 8. [object release] NSArray *array = [[NSArray alloc] initWithObjects: @"Honda", @"Yamaha”, nil]; NSLog(@“Retain count: %d", [array retainCount]); [array release]; RetainCount = 1 Honda array Yamaha Stack Heap http://techmaster.vn
  • 9. Nếu không release dẫn đến vùng nhớ do array trước đây trỏ tới trở nên vô chủ. App vẫn chạy nhưng bộ nhớ bị rò rỉ, leaking. http://techmaster.vn
  • 10. Product – Analyze để phân tích kiểm tra http://techmaster.vn
  • 11. Product - Profile http://techmaster.vn
  • 12. LEAK !!! Thủ phạm gây ra Leak Nên sử dụng thường xuyên đối với các dự án Non ARC ! http://techmaster.vn
  • 13. NSArray *array = [[NSArray alloc] initWithObjects: @"Honda", @"Yamaha”, nil]; [array release];//Cần phải release UIImage *aImage = [UIImage imageNamed:@”A.png"]; [aImage release]; //Không cần phải release. TẠI SAO? http://techmaster.vn
  • 14. [UIImage imageNamed… ] trả về đối tượng autorelease (tự nhả). Do đó không cần gửi message release đến đối tượng này nữa. http://techmaster.vn
  • 15. [object autorelease] • Dùng khi tạo một object trong hàm rồi trả về qua return. • [object autorelease] : object sẽ được quản lý trong AutoRelease pool • Lạm dụng autorelease không tốt. Tại sao? http://techmaster.vn
  • 16. Kết thúc mỗi chu kỳ xử lý sự kiện, CocoaTouch sẽ gửi message release đến tất cả các autorelease object. http://techmaster.vn
  • 17. RetainCount = 2 RetainCount = 0 RetainCount = 3 RetainCount = 0 Autorelease pool Heap http://techmaster.vn
  • 18. [object retain] dùng khi nào? NSArray *resultArray = [self returnAnArray]; NSArray *anotherArrayPointer = resultArray; [resultArray release]; [anotherArrayPointer doSomething]; Bad memory access !d http://techmaster.vn
  • 19. Trước khi chuyển con trỏ đến đối tượng khác cần release đối tượng cũ objX [p release] *p objY Heap http://techmaster.vn
  • 20. @property Giúp định nghĩa biến thành phần tinh tế hơn bằng cách bổ xung thêm attributes http://techmaster.vn
  • 21. Attribute Ý nghĩa Không hỗ trợ truy xuất đồng bộ nhưng sẽ nonatomic nhanh hơn retain Tăng ref count của đối tượng thêm 1 Dành riêng cho kiểu căn bản (primitive data assign type), struct hoặc đối tượng nếu không tăng ref count readonly Chỉ đọc, tạo duy nhất getter readwrite Cả đọc ghi. Tạo cả getter và setter Copy đối tượng gán sang vùng nhớ mới. Chỉ copy có tác dụng với kiểu MutableXXX http://techmaster.vn
  • 22. *p1 Dead Lock in memory *p2 http://techmaster.vn
  • 23. • Pointer trong Objective-C mặc định là strong • Cyclic reference gây nên dead lock. Đối tượng trong dead lock không thể giải phóng, gây thất thoát bộ nhớ • Cách xử lý, sử dụng __weak @property (nonatomic, assign) __weak A *pA; http://techmaster.vn
  • 24. ARC saves you from mem leak or crash ! ARC http://techmaster.vn
  • 25. Tính năng quản lý bộ nhớ trong iOS SDK iOS 1.2 iOS 4.0 iOS 5.0 iOS 5.1 iOS 6.0 5.0.1 3/2008 6/2010 10/2011 3/2012 6/2012 • Trước iOS 5: Manual Retain / Release (Giữ - nhả thủ công đối tượng ở heap) • Sau iOS 5: Automatic Reference Counting (Tự động đếm con trỏ trỏ đến đối tượng ở heap) http://techmaster.vn
  • 26. ARC • LTV không dùng retain, release, autorelease, dealloc thủ công nữa. • Trình biên dịch tự động chèn retain, release, autorelease, dealloc khi cần. • Thêm một số tính năng mới: strong, weak http://techmaster.vn
  • 27. ARC • Không phải là cơ chế quản lý bộ nhớ hoàn toàn mới • Không là Garbage Collector như nhiều người hiểu nhầm • Bộ nhớ vẫn có thể thất thoát, ứng dụng đổ vỡ nếu dùng sai • Giải phóng bộ nhớ không tinh tế như JVM hay .NET runtime, nhưng rất phù hợp thiết bị smartphone http://techmaster.vn
  • 28. strong vs weak • Mặc định con trỏ là strong __weak NSString *weakP = textField.text; @”Mobile Day @”Mobile Day 2011” 2012” NIL *weakP textField.text http://techmaster.vn
  • 29. Kinh nghiệm • Dùng strong pointer để giữ đối tượng mình tạo ra. • Không dùng strong pointer để giữ đối tượng không thực sự của mình  không thể giải phóng bộ nhớ. Dùng weak pointer là đủ. http://techmaster.vn
  • 30. • Gán strong pointer = nil ở hàm viewDidUnload để iOS giải phóng đối tượng không cần dùng nữa. - (void)viewDidUnload { [super viewDidUnload]; myString = nil; myImage = nil; } • Không nhất thiết phải dùng strong để trỏ tới phần tử giao diện trong XIB. @property (nonatomic, weak) IBOutlet UIButton *myButton; http://techmaster.vn
  • 31. ??? http://techmaster.vn
  • 32. ARC cần IOS SDK 5.x nhưng hỗ trợ iOS SDK 4.x • LTV bắt buộc phải dùng iOS SDK 5.x để bật ARC nhưng có thể chọn deployment target xuống iOS 4.x. • Lưu ý iOS 4.x không hỗ trợ automatic weak reference zeroing. http://techmaster.vn
  • 33. Trên menu của XCode, chọn Edit -> Refactor -> Convert to Objective-C ARC http://techmaster.vn
  • 34. bridge trong ARC __bridge_transfer: cast đối tượng miền CFObject sang miền NSObject sau đó release CFObject __bridge_retained: cast đối tượng miền NSObject sang CFObject nhưng giữ đối tượng cũ. __bridge: chuyển đổi qua lại đối tượng giữa miền CFObject và NSObject, không quan tâm reference counter. http://techmaster.vn
  • 35. Ứng dụng ARC vẫn có thể xài mã nonARC • Một số thư viện không dùng ARC như ASIHttpRequest, AFNetworking,… • Làm thế nào để dùng chúng trong dự án bật ARC ? http://techmaster.vn
  • 36. Bật compiler flags –fno-objc-arc lên ! http://techmaster.vn
  • 37. Còn nhiều vấn đề nữa….. • Truy vấn biến trong phạm vi block • Xử lý khi bộ nhớ dùng cạn • Lazy Loading • Quản lý bộ nhớ khi lập trình đồng bộ • Chuyển đổi vùng nhớ C++ với Objective_C http://techmaster.vn
  • 38. Sao phức tạp thế !!!? Đừng lo lắng, cứ lập trình đi rồi sẽ quen ! http://techmaster.vn
  • 39. Xin chân thành cảm ơn các bạn đã chú ý lắng nghé http://techmaster.vn

Hinweis der Redaktion

  1. http://stackoverflow.com/questions/6991142/writable-atomic-property-result-cannot-pair-a-synthesized-setter-getter-with-a
  2. Objective-C is a thin layer on top of C, and moreover is a strict superset of C; it is possible to compile any C program with an Objective-C compiler, and to freely include C code within an Objective-C class.Objective-C derives its object syntax from Smalltalk. All of the syntax for non-object-oriented operations (including primitive variables, pre-processing, expressions, function declarations, and function calls) are identical to that of C, while the syntax for object-oriented features is an implementation of Smalltalk-style messaging.
  3. http://www.asgteach.com/blog/?p=73
  4. http://www.asgteach.com/blog/?p=73
  5. http://stackoverflow.com/questions/7747783/is-arc-really-supported-in-ios-4-the-ios-4-2-sdk-is-missing-arc-related-symbols