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 10 của 10
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; nghĩa là gì???

    chào các bác, em mới chập chững học ObjectiveC thắc mắc về dòng lệnh:

    Mã:
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    em muốn hỏi ý nghĩa của nó là gì và khi nào thì dùng nó ??? vì thấy trong hàm main có lúc dùng nó, có lúc ko.

    Mong các bác giúp đỡ, em mới tập tọe nên nhờ các bác chỉ bảo [IMG]images/smilies/online.gif[/IMG]

  2. #2
    Ủa trong này có hàm main hả cậu.
    Theo mình biết thì cái này dùng để tạo ra thôi giống như new bên C vậy thôi.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Bạn tìm hiểu thêm về quản lý bộ nhớ trong Objective-C nhé. _http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

    Việc giải phóng bộ nhớ của object, ngoài thủ công thông qua phương thức release, thì còn có thể được tự động hóa bằng phương thức autorelease.

    [object autorelease];

    Khi phương thức này được gọi trên một object, object đó sẽ được thêm vào cái NSAutoreleasePool nói trên, và từ đó trở đi ta không cần bận tâm việc giải phóng object đó nữa. Khi pool được giải phóng, tất cả các object trong nó cũng tự động được giải phóng theo.

    Bạn để ý cuối hàm main có câu lệnh:

    [pool release];

    hoặc

    [pool drain];

    dùng để giải phóng (release, pool sẽ mất) hoặc "đổ" hết object trong pool ra (drain, pool vẫn còn dùng lần sau được)

    Việc dùng autorelease là rất quan trọng khi bạn có phương thức trả về một object, chi tiết ra sao bạn xem ở link trên nhé. Tốt hơn bạn cứ khai báo cái NSAutoreleasePool ở đầu main, và release nó ở cuối main.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    [NSAutoreleasePool alloc] là alloc (cấp phát) đối tượng của lớp NSAutoreleasePool. Có thể hiểu đơn giản là khởi tạo đối tượng giống malloc trong C/C++

    Sau khi đã có đối tượng rồi thì gọi method init, init thường là sẽ chỉ làm nhiệm vụ khởi tạo các thành phần cho đối tượng! Kết quả object được trả về cho biến pool là object đã được khởi tạo!

    Với cách viết như của bạn, ref count sẽ là 1, object sẽ tự động được giải phóng. Bạn có thể sử dụng new tuy nhiên trong lập trình Objective C người ta thường tránh dùng new.

    Nó gần như tương đương với dòng lệnh sau trong C++ với điều kiện là C++ có auto release như kiểu Qt C++:
    NSAutoreleasePool *pool = (new NSAutoreleasePool)->init();

    Kevin xin bổ sung một chút ngoài lề: Vấn đề của bạn là vấn đề cơ bản khi bạn tìm hiểu lập trình Objective-C, nếu bạn đã từng học C/C++ thì cũng xin chúc mừng bạn trong việc tiếp cận Objective-C. Hầu hết các cuốn sách dạy Objective-C đều yêu cầu bạn nắm được lập trình C!

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Bạn nên đọc cuốn Programming in ObjectiveC 2.0, nó bao gồm tất cả những vấn đề căn bản nhất. Kể cả cái autoreleasepool.
    Mã:
    When the pool is set up, Foundation automatically adds certain arrays, strings, dictionaries, 
    and other objects to this pool.When you’re done using the pool, 
    you can release the memory it uses by sending it a drain message:
    [pool drain];
    The autorelease pool gets its name from the fact that any objects that have been marked for autorelease 
    and, therefore, recorded in the pool are automatically released when the pool itself is released. 
    In fact, you can have more than one autorelease pool in your program, and they can be nested as well.
    Chúc bạn thành công trong việc học objective-c [IMG]images/smilies/smile.png[/IMG]

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Lúc trước thì nên học AutoRelease nhưng nếu học để viết chương trình dành cho IOS thì có thể bỏ qua chức năng này vì Xcode giờ đây đã có ARC để quản lý bộ nhớ.
    Một khi dùng ARC bạn sẽ không cần phải release nữa (Có muốn sử dụng cũng không sử dụng được)

    Hãy sử dụng những chức năng mới của Xcode để chương trình của bạn viết nhanh hơn

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ARC đúng là rất tiện, nhưng chỉ khi nào bạn thực sự nắm rõ cơ chế quản lý bộ nhớ đã.
    Mình xài ARC được 1 2 project rồi cũng phải quay lại với non-ARC...

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Vậy cho hỏi tại sao bạn phải quay về với non-ARC ?
    Còn về phần cơ chế, thực sự bạn không cần quan tâm thì hiểu rõ để làm gì?

    Đây là bài nghiên cứu của tôi về ARC
    http://diendan.congdongcviet.com/sho...d.php?t=170320

    Nếu bạn vẫn thấy chưa hài lòng thì tôi sẵn sàng tìm thêm những định nghĩa và kiến thức về nó nữa.
    Còn chỉ vì cảm thấy khộng quen hay không thích cái mới thì chịu thua thoai

  9. #9
    Ngày tham gia
    Sep 2015
    Đang ở
    89 Tam Trinh - Hoàng Mai - Hà Nội
    Bài viết
    0
    Tại sao thế bạn, mình thấy ARC rất ổn mà, dĩ nhiên là mình phải nắm rõ cơ chế release của nó, không thì nhiều khi thấy biến nil mà ko hiểu sao bị nil . Nhưng tóm lại mình thấy nó vô cùng hay.

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi speedbeeqs
    Tại sao thế bạn, mình thấy ARC rất ổn mà, dĩ nhiên là mình phải nắm rõ cơ chế release của nó, không thì nhiều khi thấy biến nil mà ko hiểu sao bị nil . Nhưng tóm lại mình thấy nó vô cùng hay.
    Nói chung là nên tự release để kiểm soát tốt chương trình hơn. Bản thân mình ko mấy khi dùng ARC.

    Mã:
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    Chỉ cần hiểu đơn giản thế này. Pool nghĩ là bể chứa. Đối tượng NSAutoreleasePool dùng để khởi tạo 1 biến tham chiếu đến toàn bộ các biến bạn cấp phát vùng nhớ trong chuơng trình của mình. Khi tạo như vậy thì chuơng trình của bạn có thể kiểm soát toàn bộ các vùng nhớ cấp phát. Điều này tạo thuận lợi khi giải phóng bộ nhớ. Khi chuơng trình kết thúc, chỉ cần giải phóng đối tượng NSAutoreleasePool thì tự động toàn bộ các biến và vùng nhớ đã cấp phát sẽ được giải phóng luôn.
    Bạn cứ tưởng tượng là trong 1 cái bể bơi, chính là đối tượng NSAutoreleasePool, nước trong bể chính là biến và vùng nhớ đã cấp phát. Khi cần giải phóng nước trong bể thì người ta chỉ cần giải phóng cái bể thì tự động nước trong bể cũng được giải phóng theo [IMG]images/smilies/biggrin.png[/IMG]

 

 

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
  •