มีวิธีใดบ้างที่ฉันสามารถทดสอบว่ามีวิธีการอยู่ใน Objective-C หรือไม่
ฉันพยายามเพิ่มยามเพื่อดูว่าวัตถุของฉันมีวิธีการก่อนที่จะเรียกมันหรือไม่
มีวิธีใดบ้างที่ฉันสามารถทดสอบว่ามีวิธีการอยู่ใน Objective-C หรือไม่
ฉันพยายามเพิ่มยามเพื่อดูว่าวัตถุของฉันมีวิธีการก่อนที่จะเรียกมันหรือไม่
คำตอบ:
if ([obj respondsToSelector:@selector(methodName:withEtc:)]) {
[obj methodName:123 withEtc:456];
}
นอกจากนี้ยังมีอินสแตนซ์ข้อความคงที่RespondToSelector: (SEL) ตัวเลือก คุณจะเรียกสิ่งนี้ว่า
[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]
หรือเช่นนี้:
[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]
สิ่งนี้อาจมีประโยชน์หากคุณต้องการเรียกตัวสร้างหนึ่งตัวหรืออีกตัวหนึ่งขึ้นอยู่กับสิ่งนี้ (ฉันหมายถึงก่อนที่จะมีอินสแตนซ์เอง)
ใช้respondsToSelector:
. จากเอกสารประกอบ :
responseToSelector:
ส่งคืนค่าบูลีนที่ระบุว่าผู้รับดำเนินการหรือสืบทอดวิธีการที่สามารถตอบสนองต่อข้อความที่ระบุ
- (BOOL)respondsToSelector:(SEL)aSelector
พารามิเตอร์
aSelector - ตัวเลือกที่ระบุข้อความคืนค่า
YES
ถ้าการดำเนินการรับหรือสืบทอดวิธีการที่สามารถตอบสนองต่อการaSelectorNO
มิฉะนั้น
คุณกำลังมองหาresponseToSelector: -
if ([foo respondsToSelector: @selector(bar)] {
[foo bar];
}
ในฐานะที่เป็นDonal กล่าวข้างต้นจะบอกคุณว่า foo สามารถแน่นอนจัดการที่ได้รับแถบตัวเลือก อย่างไรก็ตามหาก foo เป็นพร็อกซีที่ส่งต่อแถบไปยังอ็อบเจ็กต์พื้นฐานบางอย่างที่จะรับข้อความ bar ดังนั้น responseToSelector: จะบอกคุณว่า NO แม้ว่าข้อความจะถูกส่งต่อไปยังอ็อบเจ็กต์ที่ตอบสนองต่อบาร์
การตรวจสอบตัวเลือกด้วย responseToSelector โดยปกติจะใช้สำหรับวิธีการมอบหมายเท่านั้น คุณไม่ควรใช้ forwardInvocation หรือ proxies สำหรับวิธีการมอบหมาย หากคุณจำเป็นต้องใช้ responseToSelector ในสถานการณ์อื่น ๆ คุณอาจต้องการตรวจสอบให้แน่ใจว่าไม่มีวิธีที่เหมาะสมกว่าในการออกแบบโปรแกรมของคุณ
- forwardInvocation:
)