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ó.
Nguồn
2011-11-06 14:12:59
@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
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