Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Cài đặt của cơ chế quản lý bộ nhớ với retain/release/autorelease

  1. #1
    Ngày gia nhập
    08 2010
    Bài viết
    17

    Question 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:

    Code:
    @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ỉ?
    Bạn nào rành thì giải thích cho mình với
    Cảm ơn nhiều!

  2. #2
    Ngày gia nhập
    08 2011
    Bài viết
    117

    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ì :(

  3. #3
    Ngày gia nhập
    08 2010
    Bài viết
    17

    Mình thắc mắc sâu 1 tí về quản lý bộ nhớ trong objc thôi 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

  4. #4
    Ngày gia nhập
    10 2011
    Bài viết
    11

    Đọ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].

  5. #5
    Ngày gia nhập
    07 2010
    Bài viết
    28

    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.
    Code:
    #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\n", [str1 cString], [str1 retainCount] );
    	printf( "%s retain count: %x\n", [str2 cString], [str2 retainCount] );
    	printf( "%s retain count: %x\n", [str3 cString], [str3 retainCount] );
    
    	// free memory
    	[str3 release];
    	
    	// free pool
    	[pool release];
    	return 0;
    }
    Kết quả:
    Code:
    constant string retain count: ffffffff
    string managed by the pool retain count: 1
    self managed string retain count: 1
    Ở đây str1: là một hằng số, được quản lý bởi Autorelease Pool.
    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

  6. #6
    Ngày gia nhập
    10 2010
    Nơi ở
    Hồ Chí Minh
    Bài viết
    49

    Mặc định NSString

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

    Code:
    int main (int argc, const char * argv[])
    {
    
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; //new 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;
    }
    LOG:
    Code:
    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
    Đã được chỉnh sửa lần cuối bởi Noob_ : 17-10-2011 lúc 10:56 PM.

  7. #7
    Ngày gia nhập
    07 2010
    Bài viết
    28

    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

  8. #8
    Ngày gia nhập
    10 2010
    Nơi ở
    Hồ Chí Minh
    Bài viết
    49

    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!

  9. #9
    Ngày gia nhập
    08 2010
    Bài viết
    17

    Cảm ơn các bạn đã chỉ giáo 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õ.

Các đề tài tương tự

  1. Cách release bộ nhớ ở 2 dll khác nhau?
    Gửi bởi clone trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 27-12-2013, 11:38 AM
  2. VC++ 2008 Setting lại đường dẫn Release
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 3
    Bài viết cuối: 02-02-2011, 02:03 AM
  3. Chạy Debug không lỗi,chạy Release lỗi <Bad PTR> Kiểu char* ?
    Gửi bởi C&C++ trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 2
    Bài viết cuối: 02-08-2010, 11:15 PM
  4. source IAT Hook bug with Release
    Gửi bởi trần trân trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 5
    Bài viết cuối: 17-06-2009, 12:08 PM
  5. Release QT Trong QT creator chạy được, chạy trực tiếp không được
    Gửi bởi AdminPro trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 13-05-2009, 10:24 PM

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn