-
24-09-2011, 07:43 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Cài đặt của cơ chế quản lý bộ nhớ với retain/release/autorelease
Mình đang nghiên cứu thằng Objective-C này, vì sở thích thôi chứ k dính líu lắm với iOS hay Mac OS.
Mình biên dịch bằng gcc 4.5.2 trên Ubuntu.
Đọc mấy tài liệu thấy có nhắc đến kỹ thuật quản lý bộ nhớ với reference counting, mình thắc mắc không biết cái retainCount và Autorelease Pool được cài đặt thế nào nhỉ? Có phải cho chạy trên 1 thread khác không hay dùng 1 biến đếm refCount nào đó?
Lớp Object mặc định của libobjc thì không có retain/release này mà xài alloc/free thủ công.
Nếu dùng biến refCount nào đó trong lớp gốc NSObject thì làm sao cài đặt được lớp NSString, vì lớp NSString là lớp chuỗi hằng được khởi tạo lúc biên dịch với chỉ thị @"..." và phải có cấu trúc instance variables bắt buộc như sau:
Mã:@interface ..String : ..Object { char *c_string; unsigned int length; } ... @end Làm sao mình nhét 1 biến đếm liên kết vô trong được nhỉ?
Cảm ơn nhiều!View more random threads:
- Cách tạo chương trình bản đồ số giống google maps mobile cho iOs?
- Mọi người test giúp em file .c này được k ạ. Em viết function sắp xếp 1 mảng nhưng sao chạy k đc , cám ơn mọi người nhiều
- Thắc mắc cách tạo project Java đơn giản bằng Xcode
- Làm sao để nhận biết được khi người dùng bắt đầu kết nối vào wifi?
- Thắc mắc xóa phần tử lớn nhất trong mảng ?
- Cách thay đổi kích thước của UIview???
- Làm thế nào để bắt sự kiện hiển thị thay đổi trong app iOS?
- So sánh điểm giống và khác nhau giữa Objective c và c/c++
- How can I create gantt Chart in IOS objective C
- Code thông dụng của lập trình IOS (Tiếng Việt)
-
26-09-2011, 05:08 PM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
thực sự là đọc bài của bạn mình không hiểu bạn đình trình bày cái gì
-
26-09-2011, 05:16 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mình thắc mắc sâu 1 tí về quản lý bộ nhớ trong objc thôi [IMG]images/smilies/smile.png[/IMG] sắp tới định học lt iOS nên giờ muốn tường tận objc cái đã, cà cách dùng lẫn cài đặt sâu bên trong [IMG]images/smilies/biggrin.png[/IMG]
-
16-10-2011, 09:26 AM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Đọc xong mà chẳng hiểu cái gì hết bạn à,
Nếu muốn khởi tạo obj nào thì chỉ việc Obj *obj =[[Obj alloc] init]; là được, muốn giải póng nó thì dùng
[obj release].
-
16-10-2011, 05:59 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Haizzz mất một lúc để viết cái này cho bạn....
Retain và Release
Khởi tạo mỗi đối tượng bằng [Class alloc], hàm này cấp phát bộ nhớ cho đối tượng;
Mỗi đối tượng có một bộ đếm dùng để theo dõi số lượng tham chiếu của nó.
[object retain] tăng bộ đếm lên 1.
[object release] giảm bộ đếm xuống 1.
[object retainCount] đếm số lượng tham chiếu. Khi giá trị này bằng 0, đối tượng dealloc, giải phóng bộ nhớ.
Autorelease Pool
Một số phương thức khởi tạo đối tượng có phương thức autorelease. Đối tượng sẽ được chương trình quản lý và giải phóng khi cần thiết.
Mã:#import <Foundation/Foundation.h> int main( int argc, const char *argv[] ) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSString *str1 = @"constant string"; NSString *str2 = [NSString stringWithString: @"string managed by the pool"]; NSString *str3 = [[NSString alloc] initWithString: @"self managed string"]; // print the strings printf( "%s retain count: %x ", [str1 cString], [str1 retainCount] ); printf( "%s retain count: %x ", [str2 cString], [str2 retainCount] ); printf( "%s retain count: %x ", [str3 cString], [str3 retainCount] ); // free memory [str3 release]; // free pool [pool release]; return 0; }
Mã:constant string retain count: ffffffff string managed by the pool retain count: 1 self managed string retain count: 1
str2: Khởi tạo bằng phương thức [NSString stringWithString:@"String"], hương thức này cũng sử dụng Autorelease Pool.
str3: Khởi tạo bằng phương thức [[NSString alloc] initWithString:@"String"], phương thức này không sử dụng Autorelease Pool nên cuối class phải release đối tượng.
Chú ý: Khi đối tượng đã được quản lý bởi Autorelease Pool thì không sử dụng phương thức release ... ngắn gọn vậy thôi
-
17-10-2011, 12:39 PM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
http://diendan.congdongcviet.com/sho...54&postcount=4
Các bạn đọc comment này sẽ hiểu!
Mình vẫn chưa nắm được hoàn toàn cách sử dụng của autoreleasepool nhưng mình không đồng ý với cách giải thích của bạn slk_at: bạn giải thích mình cái ví dụ này đc ko:??
Mã:int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; /ew 1 pool NSString *str = [[NSString alloc] initWithFormat:@"viet nam"]; //cái này hình như là copy vùng nhớ của string @"viet nam" NSString *str2 = [[[NSString alloc] initWithFormat:@"viet nam2"] autorelease]; // gán mác autorelease NSString *str3 = [NSString stringWithString:@"viet nam3"]; //trỏ tới constant string @"viet nam3" NSString *str4 = [[NSString alloc] initWithString:@"Viet Nam4"]; // ??? mình k hiểu tại sao retain count lại là -1 (constant string) NSLog(@"1.%lx", (unsigned long)[str retainCount]); //retain count 1 NSLog(@"2.%lx", (unsigned long)[str2 retainCount]); // retain count 1 NSLog(@"3.%lx", (unsigned long)[str3 retainCount]); // retain count ffffffffffffffff NSLog(@"4.%lx", (unsigned long)[str4 retainCount]); //retain count ffffffffffffffff [str retain]; // tang retaincount lên 1 -> retainCount = 2 [str release]; // giảm retainCount xuống 1 -> retainCount = 1 [str2 retain]; // tăng retaincount lên 1 -> retainCount = 2 [pool drain]; // drain pool, làm cho các object có autorelease sẽ tự động release (giảm 1 retainCount) NSLog(@"1.%lx", (unsigned long)[str retainCount]); NSLog(@"2.%lx", (unsigned long)[str2 retainCount]); NSLog(@"3.%lx", (unsigned long)[str3 retainCount]); NSLog(@"4.%lx", (unsigned long)[str4 retainCount]); return 0; }
Mã:2011-10-17 17:38:45.481 testNSString[4775:4303] 1.1 2011-10-17 17:38:45.489 testNSString[4775:4303] 2.1 2011-10-17 17:38:45.490 testNSString[4775:4303] 3.ffffffffffffffff 2011-10-17 17:38:45.490 testNSString[4775:4303] 4.ffffffffffffffff 2011-10-17 17:38:45.491 testNSString[4775:4303] 1.1 2011-10-17 17:38:45.492 testNSString[4775:4303] 2.1 2011-10-17 17:38:45.494 testNSString[4775:4303] 3.ffffffffffffffff 2011-10-17 17:38:45.495 testNSString[4775:4303] 4.ffffffffffffffff
-
17-10-2011, 04:34 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
[IMG]images/smilies/daydreaming.gif[/IMG] Okie bạn, đúng là vấn đề này mình chưa nghiên cứu sâu , có gì cùng trao đổi và học hỏi
-
17-10-2011, 05:49 PM #8Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Retain - release - alloc thì mình đã hiểu hoàn toàn vấn đề.
Problem ở đây là cái autorelease pool, khi nào thêm object và khi nào sẽ release.
Có phải là chỉ gán autorelease cho từng object sau đó gọi pool drain thì release object đó, hay còn cách nào khác.
Mong các pro chỉ giáo!
-
18-10-2011, 07:58 PM #9Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Cảm ơn các bạn đã chỉ giáo [IMG]images/smilies/biggrin.png[/IMG] có lẽ câu hỏi của mình hơi khó hiểu vì thật sự nó liên quan đến cài đặt của objc runtime, chứ không phải cách dùng retain/release. Mặc kệ nó vậy.
Cách quản lý, các nguyên tắc thì các bạn có thể coi trong tài liệu của Apple (Programming in Objective-C), mình thấy nó viết rất rõ.
Ngọc Bích xanh bản chất thuộc dòng đá đá hoa (jade). Và cẩm thạch là tên gọi chung của ngọc bích. Vì thực chất chúng thuộc dòng đá đa khoáng được hình thành từ chất Silicat dưới dạng dioxy. Ngọc bích...
Chia sẻ Vòng tay ngọc bích xanh là...