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

Đề tài: Objective C: alloc và Release ngay khi nó vẫn được sử dụng không bị lỗi, nghĩa là thế nào?

  1. #1
    Ngày gia nhập
    10 2008
    Nơi ở
    sài gòn
    Bài viết
    422

    Mặc định Objective C: alloc và Release ngay khi nó vẫn được sử dụng không bị lỗi, nghĩa là thế nào?

    trong objective C, khi mình cấp phát bằng alloc và sau đó dù có release thì biến vẫn có thể sử dụng được bình thường, thậm chí trong code sample của apple: mặc dù biến vẫn còn trong vòng lặp và đang được sử dụng thì họ vẫn release biến đó đi, mình không hiểu tại sao lại làm được như vậy
    Đã được chỉnh sửa lần cuối bởi haian : 24-10-2011 lúc 10:24 PM.
    cố gắng

  2. #2
    Ngày gia nhập
    06 2007
    Bài viết
    4

    Trích dẫn Nguyên bản được gửi bởi haian Xem bài viết
    trong objective C, khi mình cấp phát bằng alloc và sau đó dù có release thì biến vẫn có thể sử dụng được bình thường, thậm chí trong code sample của apple: mặc dù biến vẫn còn trong vòng lặp và đang được sử dụng thì họ vẫn release biến đó đi, mình không hiểu tại sao lại làm được như vậy
    bạn show 1 đoạn code như bạn nói lên thì mọi người mới cho giải thích cho bạn được chứ.

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

    Trích dẫn Nguyên bản được gửi bởi haian Xem bài viết
    trong objective C, khi mình cấp phát bằng alloc và sau đó dù có release thì biến vẫn có thể sử dụng được bình thường, thậm chí trong code sample của apple: mặc dù biến vẫn còn trong vòng lặp và đang được sử dụng thì họ vẫn release biến đó đi, mình không hiểu tại sao lại làm được như vậy
    Mình không hiểu bạn có nhầm lẫn ở đâu không, bởi tôi đoán bạn test bằng cách release biến NSString
    Code:
    NSString *str=[[NSString alloc]initWithFormat:@"Viet nam"];
    str=nil
    // sau đó lại gán thế này
    str=@"Ha Noi";// đây cũng là 1 cách để khởi tạo lại NSString 
    NSLog(@"%@",str);// kết quả vẫn là Hà nội
    Sở dĩ đoạn code ở trên vẫn chạy bình thường vì NSString nhận phương thức khởi tạo bằng cách gán trực tiếp 1 NSString

    Bây giờ bạn hãy thử với biến NSMutableString thì sẽ thấy sau khi release thì không thể dùng được,

    Code:
    NSMutableString *mstr=[[NSMutableString alloc]init];
    
    //bây giờ bạn bỏ thêm [mstr release] vào đây xem chạy có bị lỗi không
    [mstr appenString:@"Dai Viet"];
    NSLog(@"%@",mstr);

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

    Mặc định memory management

    Trích dẫn Nguyên bản được gửi bởi haian Xem bài viết
    trong objective C, khi mình cấp phát bằng alloc và sau đó dù có release thì biến vẫn có thể sử dụng được bình thường, thậm chí trong code sample của apple: mặc dù biến vẫn còn trong vòng lặp và đang được sử dụng thì họ vẫn release biến đó đi, mình không hiểu tại sao lại làm được như vậy
    Bạn nên đọc thêm về Memory management trong objective-c, khi nào 1 vùng nhớ được giải phóng, và releas không phải là giải phóng vùng nhớ đó mà là giảm retainCount, trước khi release object đó có thể đã có 1 function làm cho retaincount tăng lên > 1

    Trích dẫn Nguyên bản được gửi bởi slk_at Xem bài viết
    Mình không hiểu bạn có nhầm lẫn ở đâu không, bởi tôi đoán bạn test bằng cách release biến NSString
    Code:
    NSString *str=[[NSString alloc]initWithFormat:@"Viet nam"];
    str=nil
    // sau đó lại gán thế này
    str=@"Ha Noi";// đây cũng là 1 cách để khởi tạo lại NSString 
    NSLog(@"%@",str);// kết quả vẫn là Hà nội
    Sở dĩ đoạn code ở trên vẫn chạy bình thường vì NSString nhận phương thức khởi tạo bằng cách gán trực tiếp 1 NSString

    Bây giờ bạn hãy thử với biến NSMutableString thì sẽ thấy sau khi release thì không thể dùng được,

    Code:
    NSMutableString *mstr=[[NSMutableString alloc]init];
    
    //bây giờ bạn bỏ thêm [mstr release] vào đây xem chạy có bị lỗi không
    [mstr appenString:@"Dai Viet"];
    NSLog(@"%@",mstr);
    Có thể bạn chưa hiểu rõ vấn đề. Mình xin phân tích lại đoạn code ví dụ của bạn:

    Code:
    NSString *str=[[NSString alloc]initWithFormat:@"Viet nam"]; //(retainCount = 1) cấp phát vùng nhớ 
    str=nil // làm cho con trỏ str không còn trỏ tới vùng nhớ mới được tạo ra -> memory leak (retaincount vẫn = 1);
    
    str=@"Ha Noi";// trỏ tới @"Ha Noi" là 1 constant string, không thể release
    NSLog(@"%@",str);// kết quả vẫn là Hà nội -> cái này đuơng nhiên
    Code:
    NSMutableString *mstr=[[NSMutableString alloc]init];// cấp phát vùng nhớ cho 1 NSMutableString object-> retainCount = 1 vì MutableString có thể thay đổi được nội dung
    
    //bây giờ bạn bỏ thêm [mstr release] vào đây xem chạy có bị lỗi không
    //?? release đuơng nhiên làm cho retain count từ 1 giảm xuống 0 -> vùng nhớ bị xóa thì còn làm j được hả bạn
    [mstr appenString:@"Dai Viet"];
    NSLog(@"%@",mstr);
    Tóm lại ví dụ của bạn chưa giải quyết được vấn đề của bạn trên kia.
    Mình sẽ làm cái ví dụ này các bạn đọc sẽ hiểu rõ hơn.
    Code:
        NSMutableArray *myArray = [[NSArray alloc] init];
        NSNumber *myNum = [[NSNumber alloc] initWithInt:100];
        NSLog(@"Log1: %lx", [myNum retainCount]);// cấp phát vùng nhớ retaincount = 1
    
        [myArray addObject:myNum];
        NSLog(@"Log2: %lx", [myNum retainCount]); // add vào 1 array không copy ra vùng nhớ khác mà chỉ tăng retainCount lên 1 (lúc này retainCount =2), và [myArray objectAtIndex:0] trỏ tới vùng nhớ đó
        
        [myNum release]; 
         NSLog(@"Log3: %lx", [myNum retainCount]); // giảm retainCount xuống 1 -> retainCount = 1
        
        NSNumber *newNum = myNum; // gán newNum = myNum, mặc định phép gán là assign, tức không tăng retainCount cũng không copy ra vùng nhớ
        NSLog(@"Log4: %lx", [newNum retainCount]);// retaincount =1
    P/S: nếu không rõ hàm nào ảnh hưởng retainCount hay không thì chỉ cần in ra log.
    Thanks for reading
    Đã được chỉnh sửa lần cuối bởi Noob_ : 17-10-2011 lúc 05:08 PM.

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

  1. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; nghĩa là gì???
    Gửi bởi son8xvn trong diễn đàn Thắc mắc lập trình Objective-C
    Trả lời: 9
    Bài viết cuối: 26-04-2013, 10:51 AM
  2. Ý nghĩa các câu lệnh trong Objective-C?
    Gửi bởi nobeta911 trong diễn đàn Thắc mắc lập trình Objective-C
    Trả lời: 1
    Bài viết cuối: 26-09-2012, 01:58 PM
  3. Ý nghĩa của protocol trong Objective-C là gì ?
    Gửi bởi learntofly1 trong diễn đàn Thắc mắc lập trình Objective-C
    Trả lời: 2
    Bài viết cuối: 27-08-2012, 03:51 PM
  4. Lấy đường dẫn tương đối file .dll trong debug hoặc release thế nào?
    Gửi bởi phandung1511 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 12-05-2012, 10:27 AM
  5. Ý nghĩa dấu ^ trong objective-c?
    Gửi bởi richtran trong diễn đàn Thắc mắc lập trình Objective-C
    Trả lời: 3
    Bài viết cuối: 21-04-2012, 05:45 PM

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