ใน Objective-C ฉันต้องการทราบว่า+
และ-
เครื่องหมายใดอยู่ถัดจากนิยามของวิธีการ
- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;
ใน Objective-C ฉันต้องการทราบว่า+
และ-
เครื่องหมายใดอยู่ถัดจากนิยามของวิธีการ
- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;
คำตอบ:
+
สำหรับวิธีการเรียนและ-
สำหรับวิธีการเช่น
เช่น
// 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".
มีคำถามอื่นจัดการกับความแตกต่างระหว่างการเรียนและวิธีการเช่น
@classmethod
และ@method
อื่น ๆ เช่นกัน ทำไมสั้น ...
(+) สำหรับวิธีการเรียนและ (-) สำหรับวิธีการเช่น
(+) วิธีการเรียน: -
เป็นวิธีการที่ประกาศเป็นแบบคงที่ วิธีการที่สามารถเรียกได้โดยไม่ต้องสร้างตัวอย่างของชั้นเรียน วิธีการเรียนสามารถทำงานได้เฉพาะกับสมาชิกในชั้นเรียนและไม่ได้อยู่ในสมาชิกอินสแตนซ์ในขณะที่วิธีการเรียนที่ไม่รู้จักสมาชิกเช่น วิธีการอินสแตนซ์ของคลาสนั้นไม่สามารถถูกเรียกจากภายในเมธอดคลาสได้นอกจากว่าพวกมันถูกเรียกบนอินสแตนซ์ของคลาสนั้น
(-) วิธีการตัวอย่าง: -
ในทางกลับกันจำเป็นต้องมีอินสแตนซ์ของคลาสที่มีอยู่ก่อนจึงจะสามารถเรียกได้ดังนั้นอินสแตนซ์ของคลาสจะต้องสร้างขึ้นโดยใช้คำหลักใหม่ วิธีการอินสแตนซ์ทำงานบนอินสแตนซ์ของคลาสที่เฉพาะเจาะจง วิธีการที่อินสแตนซ์จะไม่ประกาศว่าเป็นแบบคงที่
วิธีการสร้าง
@interface CustomClass : NSObject
+ (void)classMethod;
- (void)instanceMethod;
@end
วิธีใช้?
[CustomClass classMethod];
CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
+ methods เป็นวิธีการเรียน - นั่นคือวิธีการที่ไม่สามารถเข้าถึงคุณสมบัติอินสแตนซ์ ใช้สำหรับวิธีการเช่นการจัดสรรหรือวิธีการช่วยเหลือสำหรับชั้นเรียนที่ไม่ต้องการการเข้าถึงตัวแปรอินสแตนซ์
- เมธอดคือเมธอดอินสแตนซ์ - เกี่ยวข้องกับอินสแตนซ์เดียวของวัตถุ มักจะใช้วิธีการส่วนใหญ่ในชั้นเรียน
ดูข้อกำหนดภาษาสำหรับรายละเอียดเพิ่มเติม
self
แต่เป็นคลาส มันไม่ได้เกี่ยวข้องกับอินสแตนซ์และการค้นหาเมธอดไม่ได้ผ่านอินสแตนซ์ แต่ผ่านคลาส ถึงกระนั้นคุณสามารถทำได้+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
คำอธิบายที่ชัดเจนเกี่ยวกับเรื่องนี้จาก Apple อยู่ที่นี่ภายใต้หัวข้อ 'วิธีการและข้อความ':
โดยย่อ:
(วิธีการที่สามารถเรียกได้โดยไม่ต้องยกตัวอย่างของการเรียน) ดังนั้นคุณเรียกมันว่าสิ่งนี้:
[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";