2011-11-06 9 views
5

Tôi đang cố gắng tìm hiểu mục tiêu C và một trong những điều tôi thấy rất kỳ lạ để làm theo là khi nào nên sử dụng phân bổ và khi nào không. Ví dụ: mã số này:Mục tiêu C khi nào sử dụng phân bổ và khi không đến

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"]; 

Tại sao bạn không phải làm điều gì đó như thế này để phân bổ trước?

UIAlert *alert = [[UIAlertView alloc]] 

Tôi chắc chắn chỉ có một số điều cơ bản trong mục tiêu C tôi thiếu, nhưng đủ kỳ lạ là bạn gặp khó khăn khi tìm giải thích mà không đăng bài. Cảm ơn!!

+0

@jrturton: như tôi đã nói, vâng tôi có và điều đó không có ý nghĩa đối với tôi, tôi thường nhận được giải thích tốt ở đây, vì vậy tôi nghĩ ai đó có thể đưa ra câu trả lời hay. Tài liệu nhà phát triển của Apple là khủng khiếp và được biết đến là khủng khiếp. Vui lòng trả lời thực tế cho các câu hỏi khi trả lời nội dung của tôi. tôi sẽ đánh giá cao nó. – gcoleman0828

+0

Không nơi nào trong câu hỏi của bạn, bạn có nói bất cứ điều gì về việc đọc tài liệu hoặc phần nào bạn gặp vấn đề. Đừng quá phòng thủ! – jrturton

Trả lời

6

Sự cố với +alloc là rằng nó vẫn giữ được kết quả của nó, đó là lý do tại sao nó phải được cân bằng với một cuộc gọi đến -release hoặc -autorelease sau này. Để tránh phải loại bỏ nó lặp đi lặp lại mỗi khi một lớp được sử dụng, nhà thiết kế API thường tạo ra cái gọi là phương tiện tiện lợi tiện ích hoặc phương thức tiện lợi. +URLWithString: là một trong số họ, và trong nội bộ nó trông như thế này:

+ (id)URLWithString: (NSString *)str { 
    return [[[self alloc] initWithString: str] autorelease]; 
} 

Vì vậy +alloc là nhận được gọi cho bạn, và như vậy là -autorelease.

nền

Có hai loại rộng của phương pháp trong Objective-C: phương pháp lớp học và phương pháp dụ. Các phương thức lớp được gửi đến một lớp chính nó và không yêu cầu tạo ra một cá thể của lớp đó. Các phương thức thể hiện được gửi đến một cá thể và có thể truy cập vào bộ nhớ mà cá thể chiếm giữ. Các phương thức lớp bắt đầu bằng +; các phương thức mẫu với -.

+alloc là một phương pháp lớp học. Nó không phải là một phép thuật với sức mạnh tạo đối tượng cụ thể. Tất cả nội dung trong nội bộ là một cái gì đó như:

+ (id)alloc { 
    id result = malloc(class_getInstanceSize(self)); 
    if (result) { 
     memset(result, 0, class_getInstanceSize(self)); 
     result->isa = self; 
     result->retainCount = 1; 
    } 
    return result; 
} 

(Nó thực sự phức tạp hơn một chút nhưng phải đủ ở đây.) Lưu ý rằng +alloc được định nghĩa là một phần của NSObject, không một phần của tất cả các đối tượng. Quản lý bộ nhớ Cocoa, với +alloc, -init, -retain, -release, vv không phải lúc nào cũng là một phần của Objective-C, và các đối tượng có thể được tạo mà không sử dụng nó.

Bạn thực sự có thể tạo các phiên bản của một lớp mà không cần gọi +alloc nếu bạn biết đúng câu thần chú. Tôi sẽ không giới thiệu nó.

+0

Cảm ơn bạn đã trả lời chi tiết. Điều đó làm sáng tỏ thêm một chút về những gì tôi đã nhầm lẫn. Cảm ơn một lần nữa! – gcoleman0828

2

Sử dụng phương pháp phân bổ để tạo đối tượng mới, do bạn sở hữu. Ý tôi là tạo ra nó như thế này

NSURL *url =[[NSURL allo]initWithString:@"http://www.apple.com"], bạn trở thành chủ sở hữu của đối tượng này. Sau khi bạn sử dụng nó, cho phép nói

NSLog ("Url path is %@",url); 

Bạn phải thả đối tượng này (url)

[url release]; 

Đây là một trong những chủ đề chính về managment bộ nhớ trong Objective C

gì về Statment của bạn,

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];

Tôi phải nói rằng hệ thống sẽ trả về một url với một chuỗi, nhưng không phải do bạn sở hữu, vì vậy bạn không cần phải phát hành nó, bởi vì hệ thống sẽ tự động phát hành nó (đối tượng này tự động gửi tin nhắn tự động phát lại)

+1

@devcode, ok có ý nghĩa, nhưng tôi đoán sau đó câu hỏi tiếp theo của tôi sẽ là, tại sao phải quan tâm nếu bạn "Sở hữu nó" Tại sao không phải lúc nào cũng không sử dụng phân bổ và sau đó không bao giờ phải lo lắng về việc phát hành nó? Điều này làm bạn mua gì? – gcoleman0828

+0

Vì với đối tượng bạn sở hữu, bạn có thể kiểm soát bộ nhớ được ứng dụng của bạn sử dụng. Bạn biết rằng sau khi bạn sử dụng đối tượng này, bạn nên giải phóng nó, bằng cách sử dụng hàm tạo thuận tiện (như bạn đã làm), hệ thống không giải phóng đối tượng đó ngay lập tức, vì vậy ứng dụng của bạn vẫn giữ một khối bộ nhớ không cần thiết. Sử dụng phân bổ là lựa chọn tốt nhất theo quy tắc –