Có thể tạo lớp không có phương thức init để buộc tất cả người gọi tạo đối tượng bằng phương pháp nhà máy thay thế không?Tạo một lớp không có phương thức init (Mục tiêu-c)
Trả lời
Vì vậy, về cơ bản, bạn muốn đảm bảo rằng lớp học của bạn không bao giờ được khởi tạo bằng -init, phải không? Bạn không thể làm chính xác những gì bạn muốn làm, nhưng bạn có thể đến gần.
Vì bạn kế thừa từ NSObject, bạn có phương thức init và bạn không thể làm gì để ngăn không cho nó được gọi.Điều đó nói rằng, bạn có thể ghi đè lên init này:
- (id)init
{
[self dealloc];
@throw [NSException exceptionWithName:@"MyExceptionName" reason:@"Reason" userInfo:nil];
return nil;
}
Bằng cách này, bất cứ lúc nào có ai đó gọi phương pháp init của bạn, nó cũng giết đối tượng, vì vậy nói thực tế, phương pháp init của bạn là khá nhiều un-callable.
Mục tiêu-c có cái gì đó giống như một ngoại lệ không được thực hiện? – Casebash
Bạn thực sự không cần trả lại ở cuối - nó sẽ không bao giờ đạt được – Casebash
Mục tiêu-C là ngoại lệ-không thân thiện vì nó có thể khiến các đối tượng bị rò rỉ khắp nơi (vì các lệnh gọi 'release' của họ không bao giờ có thể đạt được) . Nếu bạn không sử dụng thời gian chạy được thu gom rác, tuy nhiên bạn có thể buồn, nhưng tốt hơn là bạn không nên sử dụng chúng. – zneak
Chắc chắn. Trong Mục tiêu-C, không có các nhà thầu thực tế . init
phương pháp kiểu thường được sử dụng để khởi tạo một lớp, trong cùng một tĩnh mạch như một hàm tạo, nhưng chúng chỉ là một phương thức "bình thường" (không có gì đặc biệt về chúng như có, ví dụ, Java constructors).
Điều đó nói rằng, trừ khi lớp học của bạn không không khởi cho trường hợp của mình, bạn có thể muốn để có một số loại init
phương pháp.
NSObject
triển khai phương thức init
cho bạn thực hiện bất kỳ thao tác nào. Nếu lớp của bạn không có gì để thiết lập khi nó được khởi tạo thì chỉ cần không ghi đè phương thức -(id)init
được cung cấp bởi NSObject
. Nhưng bạn vẫn gọi nó khi bạn tạo cá thể.
Tùy thuộc. Nếu bạn có lớp của bạn được kế thừa từ NSObject
, nó sẽ có phương thức init
được kế thừa (không làm gì với các biến đối tượng của bạn). Vì vậy, trong ý nghĩa đó, ngay cả khi bạn thực sự thực sự muốn không có phương thức init
, bạn vẫn có thể có một phương pháp. Vì vậy, nếu câu hỏi của bạn là "Tôi có cần triển khai phương pháp init
tầm thường không?", Câu trả lời là "không, bạn không cần phải". Tuy nhiên, nếu câu hỏi của bạn là "Tôi có cần gọi phương thức init
nếu tôi không ghi đè nó không?", Thì câu trả lời là "có, bạn làm". Dù bạn làm gì với lớp con NSObject, tại một số điểm bạn vẫn cần gọi init
sau khi đối tượng được tạo. Đó là cách sống.
Điều đó đang được nói, bạn nhiều khả năng là muốn có phương thức init
, trừ khi khởi tạo đối tượng của bạn không yêu cầu gì khác hơn là lấy toàn bộ đối tượng của bạn.
Ngược lại, nếu bạn chọn để không kế thừa từ NSObject
hoặc bất kỳ lớp con của nó và chỉ cần kế thừa từ không có gì, mà rõ ràng là một ý tưởng tồi vì cách NSObject
giao lớp học với tất cả những gì runtime ObjC cần làm và yêu cầu khá cao, sau đó bạn sẽ có khả năng kết thúc với phương thức init
ở tất cả. Nhưng nghiêm túc, đừng thử ở nhà.
Nếu bạn thực sự muốn gây rắc rối cho người dùng của lớp người sử dụng init
, bạn có thể làm:
@implementation MyClass
- (id) init
{
// Still have to make sure the runtime has initialised everything for "self"
self = [super init];
if (!self) return nil;
[self release]; // some say you should use [super dealloc]
[super doesNotRecognizeSelector:_cmd];
return nil;
}
@end
Bạn có thể gọi super
's doesNotRecognizeSelector:
bởi vì bạn có thể muốn thực hiện hành vi của riêng bạn cho selectors không được công nhận cho lớp của bạn.
- 1. Mục tiêu c init trong giao thức
- 2. phương thức init() v không tìm thấy
- 3. Có phương thức init nào cho lớp hành động struts2 không?
- 4. Phương thức init của NSDateFormatter không được chấp nhận?
- 5. Trình tạo giao diện có sử dụng phương thức -init để khởi tạo bộ điều khiển chế độ xem không?
- 6. Tham số phương thức init mùa xuân
- 7. Tạo danh sách các phương thức của một lớp với các kiểu phương thức
- 8. Tạo một phương thức đồng thời là một thể hiện và phương thức lớp
- 9. Phương thức init gọi Guice sau khi khởi tạo một đối tượng
- 10. Tôi có nên tự giải phóng các phương thức init không thành công không?
- 11. iOS Subclass UICollectionViewCell phương thức init tùy chỉnh
- 12. Phương thức gọi trên lớp con từ phương thức lớp cha (Mục tiêu-c 2.0)
- 13. Liệu instancetype có nên được sử dụng trên các phương thức phân bổ/new/init không?
- 14. Không có ngoại lệ cho phương thức như vậy Hadoop <init>
- 15. NSKeyedUnarchiver unarchiveObjectWithFile: trả về nil bằng init: phương thức
- 16. Phương thức HttpModule Init được gọi nhiều lần - tại sao?
- 17. Mục tiêu C - Cách thêm phương thức vào một lớp hiện có?
- 18. viewController phương thức init tùy chỉnh với bảng phân cảnh
- 19. Khởi tạo lớp Ruby (hàm tạo) là phương thức riêng hoặc phương thức công khai?
- 20. Siêu lớp có không gọi phương thức ghi đè không?
- 21. Phương thức giao diện Java Phương pháp: Mỗi lớp có thực hiện một giao diện không?
- 22. Hai Danh mục trên cùng một Lớp có cùng tên phương thức
- 23. Phân lớp UIView. phương pháp init không bao giờ được gọi là
- 24. Mục đích của các phương thức ví dụ trong Mô-đun không có lớp là gì?
- 25. Mục tiêu-c: Làm thế nào tôi có thể lấy dụ lớp trong phương thức lớp
- 26. Có bao nhiêu phương thức mặc định của một lớp?
- 27. Phân lớp C mục tiêu ghi đè lên một phương thức trong siêu lớp
- 28. phương thức gọi lớp php từ phương thức tĩnh bên trong cùng một lớp nhưng không được thực hiện
- 29. Phương thức khởi tạo riêng trong lớp trừu tượng
- 30. Thêm phương thức vào một lớp miền
Có thể hữu ích khi giải thích những gì bạn thực sự muốn thực hiện. – Chuck
Dường như là một câu hỏi hoàn toàn hợp pháp đối với tôi, điều đó không cần bối cảnh để có ý nghĩa. Có rất nhiều lý do tại sao bạn sẽ có một lớp học mà sẽ không cần bất kỳ thiết lập cụ thể. –
@Squeegy: Chuck đã đúng - câu hỏi ban đầu nên giải thích những gì tôi muốn thực hiện. Từ những câu trả lời dưới đây, rõ ràng một số người trả lời không chắc tôi đang hỏi gì (tôi thực sự đã bình chọn bình luận của Chuck) – Casebash