Dựa trên một số câu trả lời cho this question có vẻ như + phân bổ thực hiện một số phép thuật hậu trường để cấp phát bộ nhớ cho một thể hiện của đối tượng trong Mục tiêu-C. Có bao giờ cần phải ghi đè + phân bổ không?Có bao giờ cần một lớp để ghi đè + phân bổ trong Objective-C không?
Trả lời
Khá hiếm.
NSString là ví dụ về lớp ghi đè + phân bổ dưới dạng chi tiết triển khai. Nếu bạn đã kiểm tra, bạn sẽ tìm thấy + [NSString alloc] trả về một cái gì đó của lớp NSPlaceholderString. Đây là một phần của việc thực hiện chuỗi class cluster.
Bạn cũng có thể ghi đè để phân bổ từ một phân bổ NSZone khác nhau làm mặc định. Hoặc, bạn có thể chơi các thủ thuật như gọi số NSAllocateObject với một số khác không cho extraBytes
để cung cấp lượng không gian động sau các thanh ngang của bạn. Ví dụ: bạn có thể nghĩ rằng lớp con riêng tư của NSString mà bạn thường kết thúc sẽ trông giống như sau:
@interface {
NSUInteger length;
unichar *data;
}
nhưng điều đó không đúng. Đó là một khối bộ nhớ chứa cả độ dài và dữ liệu ký tự. Các cá thể NSString khác nhau là các khối kích thước bộ nhớ khác nhau. Đây là loại điều bạn có thể sắp xếp bằng cách gọi trực tiếp NSAllocateObject.
Nhưng tất cả những điều này là thủ thuật và hack. Nếu bạn ghi đè + phân bổ, điều gì đó đặc biệt đang diễn ra.
+alloc
không thực hiện bất kỳ phép thuật nào, nó chỉ gọi một phương thức trong thời gian chạy Objective-C để lấy kích thước của một cá thể lớp và phân bổ số lượng bộ nhớ đó. Bạn có thể muốn ghi đè +alloc
khi viết một singleton thực (nghĩa là bạn muốn đảm bảo rằng chỉ có một phiên bản lớp học của bạn có thể được phân bổ). Mặc dù hiếm khi cần thiết để đi đến độ dài này khi viết một lớp đơn, bạn có thể. Nói chung, bạn sẽ ghi đè lên +alloc
để cung cấp thay thế (như không cấp phát bộ nhớ trong vùng khác, phân bổ lớp khác với lớp nhận - hành vi này có thể làm gì) hoặc bạn có thể gọi +[super alloc]
để thực hiện công việc chuẩn rồi thêm các tùy chỉnh của riêng bạn.
tôi ghi đè alloc cho các lớp Singleton, ví dụ .:
#import "Singleton.h"
static Singleton * instance;
@implementation Singleton
+ (void)initialize
{
if (!instance) {
instance = [[super allocWithZone:NULL] init];
}
}
+ (id)allocWithZone:(NSZone * const)notUsed
{
return instance;
}
@end
Đây thường không phải là cách thích hợp để làm điều đó, bởi vì bạn hiểu sai người dùng viết '[Singleton new] 'mà họ sẽ không nhận được một phiên bản mới. Trong thực tế, cá thể có 'init'-ed hai lần thay vì một lần. Thay vào đó, bạn chỉ nên trưng ra một phương thức 'class \ classInstance' + (instancetype); Và bảo vệ 'allocWithZone:' sẽ không bảo vệ bạn khỏi người dùng bằng cách sử dụng các hàm thời gian chạy để khởi tạo nhiều phiên bản. –
- 1. C# Ghi đè một thuộc tính trong một phân lớp
- 2. Ghi đè lên Setter trong Phân lớp
- 3. Mục tiêu-C - Phương pháp ghi đè trong phân lớp
- 4. Phương pháp riêng trong siêu lớp có bị ghi đè trong phân lớp không?
- 5. Trong mục tiêu-C, làm thế nào để + phân bổ biết bao nhiêu bộ nhớ để phân bổ?
- 6. Siêu lớp có không gọi phương thức ghi đè không?
- 7. Phân lớp C mục tiêu ghi đè lên một phương thức trong siêu lớp
- 8. Có thể ghi vào ổ cắm UDP bao giờ không?
- 9. Ghi đè BeanPropertyRowMapper để Hỗ trợ Ngày giờ JodaTime
- 10. Đối tượng NSString có cần phân bổ và init không?
- 11. Làm thế nào để ghi đè/mở rộng một lớp bên trong từ một lớp con?
- 12. phân bổ lớp tĩnh
- 13. Ghi đè lên các bộ chọn lớp CSS mà không cần quan trọng
- 14. Làm cách nào để ghi đè đúng một phương thức lớp trong một Objective-C trong một lớp con?
- 15. Làm thế nào để khởi tạo một ByteBuffer nếu bạn không biết có bao nhiêu byte để phân bổ trước?
- 16. ghi đè một phương thức sử dụng một lớp học
- 17. Cách ghi đè trường trong lớp cha
- 18. UICollectionViewCell lớp con init không bao giờ chạy
- 19. Đi qua lớp Derived đến một phương pháp mà cần phải ghi đè mong đợi một lớp cơ sở
- 20. Làm thế nào để đúng phân lớp dict và ghi đè __getitem__ & __setitem__
- 21. Ghi đè tên lớp cho XmlSerialization
- 22. Giá trị ghi đè của Python không cần thiết lập
- 23. Ghi đè từInteger trong Haskell
- 24. Có một lối tắt để ghi đè lên các phương thức trong một lớp Khung Android trong Eclipse không?
- 25. Có thể ghi đè lên một phương thức tĩnh trong lớp dẫn xuất không?
- 26. python: ghi đè lớp "là" hành vi
- 27. Có thể ghi đè #initialize trong mô-đun Ruby không?
- 28. Có thể ghi đè trường loại không?
- 29. Làm thế nào để ghi đè lên một thuộc tính lớp kế thừa trong C#?
- 30. Bắt buộc một lớp học ghi đè phương thức .equals
gì Ken nói. Nhưng ... để nhấn mạnh ... nó là cực kỳ hiếm hoi để làm như vậy. – bbum