Dấu cộng và dấu trừ có ý nghĩa gì trong Objective-C bên cạnh một phương thức?


180

Trong Objective-C, tôi muốn biết ý nghĩa +-dấu hiệu bên cạnh định nghĩa phương thức là gì.

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;

Câu trả lời:


226

+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".

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 .


63
Gần như thể có thêm năm ký tự "tĩnh" là quá nhiều đối với họ.
Anon.

23
@Anon: Các phương thức không tĩnh. Chúng là các phương thức lớp. Chúng có thể bị ghi đè và là một phần của hệ thống phân cấp lớp. static ngụ ý một cái gì đó rất khác trong C.
bbum

4
@Avon, đó là táo cho bạn, họ cũng sẽ để lại đèn flash trên máy ảnh của họ và một nút bên phải trên chuột của họ. =)
pokstad

13
@bbum là trên tiền. Việc Java chiếm lại từ khóa "tĩnh" có nghĩa là một cái gì đó khác biệt không phải là lỗi của C. cũ hơn. Mặc dù cách sử dụng của nó có thể không hoàn toàn trực quan trong C, nhưng nó dường như thậm chí còn ít hơn trong Java. Tôi hy vọng tĩnh sẽ trái ngược với động - thứ gì đó không thay đổi. Và tất nhiên, ngôn ngữ Objective-C đã tồn tại gần 15 năm trước khi Apple chấp nhận nó trong OS X.
Quinn Taylor

3
Sự khác biệt giữa phương thức tĩnh và phương thức lớp: Xác định phương thức + foo trong MYBaseClass và lớp con MYSubClass của nó. NSArray * class = @ [[lớp MYBaseClass], [lớp MYSubClass]]; [các lớp makeObjectsPerformSelector: @selector (foo)]; Sẽ không làm việc với một phương thức tĩnh. Điều đó nói rằng, tôi cũng sẽ thích @classmethod@methodhơn thế nữa. Tại sao quá ngắn ...?
uliwitness

45

(+) 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];

18

+ 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.


Chà, thực ra các phương thức lớp có quyền truy cập vào các biến thể hiện, chúng chỉ không có một thể hiện như 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; }
uliwitness

5

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':

https: //developer.apple.com/l Library / mac / referencel Library / G cượcStarted / LoadMapOSX / books / WinObjective-CCode / WriteObjective-CCode / WriteObjective-CCode.html

Tóm lại:

+ có nghĩa là 'phương thức lớp'

(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]; 


- có nghĩa là 'phương thức cá thể'

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";

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.