เครื่องหมายบวกและลบหมายถึงอะไรใน Objective-C ถัดจากวิธีการ


180

ใน Objective-C ฉันต้องการทราบว่า+และ-เครื่องหมายใดอยู่ถัดจากนิยามของวิธีการ

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

คำตอบ:


226

+สำหรับวิธีการเรียนและ-สำหรับวิธีการเช่น

เช่น

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

มีคำถามอื่นจัดการกับความแตกต่างระหว่างการเรียนและวิธีการเช่น


63
มันเกือบจะเหมือนกับว่าตัวละครห้าตัวของ "สแตติก" นั้นมากเกินไปสำหรับพวกเขา
อานนท์

23
@Anon: วิธีการไม่คงที่ พวกเขาเป็นวิธีการเรียน พวกเขาสามารถแทนที่ได้และเป็นส่วนหนึ่งของลำดับชั้นของชั้นเรียน คงหมายถึงบางสิ่งบางอย่างที่แตกต่างกันมากใน C.
bbum

4
@ Avon นั่นคือแอปเปิ้ลสำหรับคุณพวกเขาจะทิ้งแฟลชไว้ในกล้องของพวกเขาด้วยและปุ่มขวาบนเมาส์ของพวกเขา =)
pokstad

13
@bbum เป็นเงิน ความจริงที่ว่า Java ได้ปรับคำสำคัญ "คงที่" ใหม่เพื่อหมายถึงสิ่งที่แตกต่างไม่ใช่ความผิดของ C ที่เก่ากว่ามากในขณะที่การใช้งานอาจไม่ง่ายนักใน C แต่ดูเหมือนว่าน้อยมากดังนั้นใน Java ฉันคาดหวังว่าสเตติกจะเป็นสิ่งตรงกันข้ามกับไดนามิก - สิ่งที่ไม่เปลี่ยนแปลง และแน่นอนภาษา Objective-C มีมาเกือบ 15 ปีแล้วก่อนที่ Apple จะนำมาใช้ใน OS X
Quinn Taylor

3
ความแตกต่างระหว่างวิธีการคงที่และคลาส: กำหนดวิธีการ + foo ใน MYBaseClass และคลาสย่อย MYSubClass NSArray * คลาส = @ [[คลาส MYBaseClass], [คลาส MYSubClass]]; [คลาส makeObjectsPerformSelector: @selector (foo)]; จะไม่ทำงานกับวิธีการคงที่ ที่กล่าวว่าฉันจะชอบ@classmethodและ@methodอื่น ๆ เช่นกัน ทำไมสั้น ...
uliwitness

45

(+) สำหรับวิธีการเรียนและ (-) สำหรับวิธีการเช่น

(+) วิธีการเรียน: -

เป็นวิธีการที่ประกาศเป็นแบบคงที่ วิธีการที่สามารถเรียกได้โดยไม่ต้องสร้างตัวอย่างของชั้นเรียน วิธีการเรียนสามารถทำงานได้เฉพาะกับสมาชิกในชั้นเรียนและไม่ได้อยู่ในสมาชิกอินสแตนซ์ในขณะที่วิธีการเรียนที่ไม่รู้จักสมาชิกเช่น วิธีการอินสแตนซ์ของคลาสนั้นไม่สามารถถูกเรียกจากภายในเมธอดคลาสได้นอกจากว่าพวกมันถูกเรียกบนอินสแตนซ์ของคลาสนั้น

(-) วิธีการตัวอย่าง: -

ในทางกลับกันจำเป็นต้องมีอินสแตนซ์ของคลาสที่มีอยู่ก่อนจึงจะสามารถเรียกได้ดังนั้นอินสแตนซ์ของคลาสจะต้องสร้างขึ้นโดยใช้คำหลักใหม่ วิธีการอินสแตนซ์ทำงานบนอินสแตนซ์ของคลาสที่เฉพาะเจาะจง วิธีการที่อินสแตนซ์จะไม่ประกาศว่าเป็นแบบคงที่

วิธีการสร้าง

@interface CustomClass : NSObject

+ (void)classMethod;
- (void)instanceMethod;

@end

วิธีใช้?

[CustomClass classMethod];

CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];

18

+ methods เป็นวิธีการเรียน - นั่นคือวิธีการที่ไม่สามารถเข้าถึงคุณสมบัติอินสแตนซ์ ใช้สำหรับวิธีการเช่นการจัดสรรหรือวิธีการช่วยเหลือสำหรับชั้นเรียนที่ไม่ต้องการการเข้าถึงตัวแปรอินสแตนซ์

- เมธอดคือเมธอดอินสแตนซ์ - เกี่ยวข้องกับอินสแตนซ์เดียวของวัตถุ มักจะใช้วิธีการส่วนใหญ่ในชั้นเรียน

ดูข้อกำหนดภาษาสำหรับรายละเอียดเพิ่มเติม


จริง ๆ แล้วเมธอดของคลาสมีการเข้าถึงตัวแปรอินสแตนซ์พวกเขาไม่มีอินสแตนซ์เหมือนselfแต่เป็นคลาส มันไม่ได้เกี่ยวข้องกับอินสแตนซ์และการค้นหาเมธอดไม่ได้ผ่านอินสแตนซ์ แต่ผ่านคลาส ถึงกระนั้นคุณสามารถทำได้+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
uliwitness

5

คำอธิบายที่ชัดเจนเกี่ยวกับเรื่องนี้จาก Apple อยู่ที่นี่ภายใต้หัวข้อ 'วิธีการและข้อความ':

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

โดยย่อ:

+ หมายถึง 'วิธีการเรียน'

(วิธีการที่สามารถเรียกได้โดยไม่ต้องยกตัวอย่างของการเรียน) ดังนั้นคุณเรียกมันว่าสิ่งนี้:

[className classMethod]; 


- หมายถึง 'วิธีการอินสแตนซ์'

คุณจำเป็นต้องยกตัวอย่างวัตถุก่อนจากนั้นคุณสามารถเรียกวิธีการบนวัตถุ) คุณสามารถยกตัวอย่างวัตถุด้วยตนเองดังนี้:

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

(นี่คือการจัดสรรพื้นที่หน่วยความจำสำหรับวัตถุแล้ว initalises วัตถุในพื้นที่นั้น - oversimplification แต่เป็นวิธีที่ดีที่จะคิดเกี่ยวกับมันคุณสามารถจัดสรรและเริ่มวัตถุแยกกัน แต่ไม่เคยทำ - มันสามารถนำไปสู่ปัญหาที่น่ารังเกียจที่เกี่ยวข้องกับพอยน์เตอร์ และการจัดการหน่วยความจำ)

จากนั้นเรียกใช้เมธอดอินสแตนซ์:

[myInstance instanceMethod]

วิธีอื่นในการรับอินสแตนซ์ของวัตถุใน Objective C เป็นดังนี้:

NSNumber *myNumber = [NSNumber numberWithInt:123];

ซึ่งกำลังเรียกใช้เมธอดคลาส 'numberWithInt' ของคลาส NSNumber ซึ่งเป็นเมธอด 'factory' (เช่นวิธีการที่ให้คุณมี 'อินสแตนซ์ที่ทำพร้อม' ของวัตถุ)

Objective C ยังอนุญาตให้สร้างอินสแตนซ์ของวัตถุบางอย่างโดยตรงโดยใช้ไวยากรณ์พิเศษเช่นในกรณีของสตริงเช่นนี้:

NSString * myStringInstance = @ "abc";

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.