Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 9 của 9
  1. #1
    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ỉ?
    Bạn nào rành thì giải thích cho mình với [IMG]images/smilies/smile.png[/IMG]
    Cảm ơn nhiều!

  2. #2
    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ì

  3. #3
    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]

  4. #4
    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].

  5. #5
    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;
    }
    Kết quả:
    Mã:
    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 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;
    }
    LOG:
    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

  7. #7
    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

  8. #8
    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!

  9. #9
    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õ.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •