2010-01-19 36 views

Trả lời

178

+ là cho phương pháp lớp và - là dành cho phương pháp thể hiện.

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

another question dealing with the difference between class and instance methods.

+47

Nó gần như là nếu thêm năm ký tự "tĩnh" bằng cách nào đó quá nhiều cho chúng. –

+2

Liên kết tới tài liệu: http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocDefiningClasses.html#//apple_ref/doc/uid/TP30001163-CH12-TPXREF122 – Seth

+0

@Seth: Cảm ơn, tôi đã tìm kiếm liên kết đó nhưng không tìm thấy. –

17

+ phương thức là các phương thức lớp - tức là, các phương thức không có quyền truy cập vào thuộc tính trường hợp. Được sử dụng cho các phương thức như các phương thức phân bổ 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 mẫu

- các phương thức là các phương thức thể hiện - liên quan đến một cá thể đơn lẻ. Thường được sử dụng cho hầu hết các phương thức trên một lớp.

Xem Language Specification để biết thêm chi tiết.

+0

Vâng, các phương thức lớp thực sự có quyền truy cập vào các biến cá thể, chúng chỉ không có một cá thể là 'self', mà đúng hơn là lớp.Chúng đơn giản không liên kết với một cá thể, và phương thức tra cứu không phải là thông qua cá thể, mà là thông qua lớp. Tuy nhiên, bạn có thể làm '+ exchangeIVarOf: (MYObject *) a với: (MYObject *) b {MYObject * x = a-> ivar; a-> ivar = b-> ivar; b-> ivar = x; } ' – uliwitness

-1

the objective c programming guide là nguồn lực tốt để bắt đầu với

+1

Liên kết đã chết. Đây là lý do tại sao các câu trả lời là các liên kết thường không được chấp nhận trên SO. – spechter

31

(+) cho các phương pháp lớp và (-) cho phương pháp dụ,

(+) các phương pháp lớp: -

Are phương pháp được khai báo là tĩnh. Phương thức này có thể được gọi mà không cần 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 và không phải trên các thành viên ví dụ như các phương thức lớp không biết các thành viên cá thể. Các phương thức thể hiện 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 trên một cá thể của lớp đó.

(-) các phương pháp sơ thẩm: -

Mặt khác đòi hỏi một thể hiện của lớp để tồn tại trước khi chúng có thể được gọi là, vì vậy một thể hiện của một lớp học cần phải được tạo bằng cách sử dụng các từ khóa mới. Các phương thức thể hiện hoạt động trên các cá thể cụ thể của các lớp. Các phương thức thể hiện không được khai báo là tĩnh.

4

Lời giải thích dứt khoát này của Apple là ở đây, dưới sự 'Phương pháp và Tin nhắn' phần:

https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

Tóm lại:

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

(phương thức này có thể được gọi mà không có một thể hiện của lớp được khởi tạo). Vì vậy, bạn gọi nó là như thế này:

[className classMethod]; 


- có nghĩa là 'phương pháp dụ'

Bạn cần tạo một đối tượng đầu tiên, sau đó bạn có thể gọi phương thức trên đối tượng).Bạn có thể tự tạo một đối tượng như thế này:

SomeClass* myInstance = [[SomeClass alloc] init]; 

(điều này chủ yếu phân bổ không gian bộ nhớ cho các đối tượng sau đó initalises đối tượng trong không gian đó - một sự đơn giản hóa nhưng một cách tốt để suy nghĩ về nó Bạn có thể alloc và init. đối tượng riêng rẽ 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 Ví dụ:

[myInstance instanceMethod] 

Một cách khác để có được một thể hiện của một đối tượng trong Objective C là như thế này:

NSNumber *myNumber = [NSNumber numberWithInt:123]; 

được gọi 'numberWithInt' lớp phương pháp của lớp NSNumber, mà là một phương pháp 'nhà máy' (I E một phương thức cung cấp cho bạn một 'cá thể đã sẵn sàng' của một đối tượng).

Objective C cũng cho phép tạo ra các trường hợp đối tượng nhất định trực tiếp sử dụ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";

Các vấn đề liên quan