Câu trả lời:
+
là cho một phương thức lớp và -
là một phương thức cá thể.
Ví dụ
// Not actually Apple's code.
@interface NSArray : NSObject {
}
+ (NSArray *)array;
- (id)objectAtIndex:(NSUInteger)index;
@end
// somewhere else:
id myArray = [NSArray array]; // see how the message is sent to NSArray?
id obj = [myArray objectAtIndex:4]; // here the message is sent to myArray
// Btw, in production code one uses "NSArray *myArray" instead of only "id".
Có một câu hỏi khác liên quan đến sự khác biệt giữa các phương thức lớp và thể hiện .
@classmethod
và @method
hơn thế nữa. Tại sao quá ngắn ...?
(+) cho các phương thức lớp và (-) cho phương thức ví dụ,
(+) Các phương thức lớp: -
Là các phương thức được khai báo là tĩnh. Phương thức có thể được gọi mà không tạo một thể hiện của lớp. Các phương thức lớp chỉ có thể hoạt động trên các thành viên lớp chứ không phải các thành viên thể hiện vì các phương thức lớp không biết về các thành viên thể hiện. Các phương thức sơ thẩm của lớp cũng không thể được gọi từ bên trong một phương thức lớp trừ khi chúng được gọi trong một thể hiện của lớp đó.
(-) Phương pháp sơ thẩm: -
Mặt khác, yêu cầu một thể hiện của lớp tồn tại trước khi chúng có thể được gọi, do đó, một thể hiện của một lớp cần được tạo bằng cách sử dụng từ khóa mới. Phương thức sơ thẩm hoạt động trên các trường hợp cụ thể của các lớp. Các phương thức sơ thẩm không được khai báo là tĩnh.
Làm thế nào để tạo ra?
@interface CustomClass : NSObject
+ (void)classMethod;
- (void)instanceMethod;
@end
Sử dụng như thế nào?
[CustomClass classMethod];
CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
+ các phương thức là các phương thức lớp - nghĩa là các phương thức không có quyền truy cập vào một thuộc tính cá thể. Được sử dụng cho các phương thức như phương thức cấp phát hoặc trợ giúp cho lớp không yêu cầu quyền truy cập vào các biến thể hiện
- các phương thức là các phương thức thể hiện - liên quan đến một thể hiện của một đối tượng. Thường được sử dụng cho hầu hết các phương thức trên một lớp.
Xem Đặc tả ngôn ngữ để biết thêm chi tiết.
self
, mà là lớp. Đơn giản là chúng không được liên kết với một thể hiện và việc tìm kiếm phương thức không thông qua thể hiện mà thông qua lớp. Tuy nhiên, bạn có thể làm+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
Lời giải thích dứt khoát về điều này từ Apple có ở đây, trong phần 'Phương thức và Nhắn tin':
Tóm lại:
(phương thức có thể được gọi mà không cần một thể hiện của lớp được khởi tạo). Vì vậy, bạn gọi nó như thế này:
[className classMethod];
Bạn cần khởi tạo một đối tượng trước, sau đó bạn có thể gọi phương thức trên đối tượng). Bạn có thể tự khởi tạo một đối tượng như thế này:
SomeClass* myInstance = [[SomeClass alloc] init];
(điều này về cơ bản phân bổ không gian bộ nhớ cho đối tượng sau đó kích hoạt đối tượng trong không gian đó - một sự đơn giản hóa nhưng là một cách tốt để suy nghĩ về nó. Bạn có thể phân bổ và khởi tạo đối tượng một cách riêng biệt nhưng không bao giờ làm điều này - nó có thể dẫn đến các vấn đề khó chịu liên quan đến con trỏ và quản lý bộ nhớ)
Sau đó gọi phương thức thể hiện:
[myInstance instanceMethod]
Một cách khác để lấy một thể hiện của một đối tượng trong Objective C là như sau:
NSNumber *myNumber = [NSNumber numberWithInt:123];
đang gọi phương thức lớp 'numberWithInt' của lớp NSNumber, đây là phương thức 'nhà máy' (nghĩa là một phương thức cung cấp cho bạn một 'thể hiện đã sẵn sàng' của một đối tượng).
Mục tiêu C cũng cho phép tạo ra một số trường hợp đối tượng nhất định trực tiếp bằng cú pháp đặc biệt, như trong trường hợp của một chuỗi như thế này:
NSString * myStringInstance = @ "abc";