การใช้คุณสมบัติ BOOL


111

Apple แนะนำให้ประกาศคุณสมบัติ BOOL ด้วยวิธีนี้:

@property (nonatomic, assign, getter=isWorking) BOOL working;

ขณะที่ฉันใช้คุณสมบัติ Objective-C 2.0 และสัญกรณ์จุดฉันจึงเข้าถึงคุณสมบัตินี้โดยใช้self.working. ฉันรู้ว่าฉันสามารถใช้[self isWorking]- แต่ฉันไม่จำเป็นต้องใช้

ดังนั้นเนื่องจากฉันใช้สัญกรณ์จุดทุกที่ทำไมฉันจึงต้องกำหนดคุณสมบัติพิเศษ มันจะโอเคไหมที่จะเขียน

@property (nonatomic, assign) BOOL working;

หรือฉันมีประโยชน์getter=isWorkingในการเขียนกรณีของฉัน (การใช้สัญลักษณ์จุด) หรือไม่?

ขอบคุณ!


4
นี่ไม่ใช่คำแนะนำตามความหมายหรือไม่? ดังนั้น myCar.isWorking จะมีความแม่นยำมากกว่า myCar.working
justcompile

คำตอบ:


206

Apple เพียงแค่แนะนำให้ประกาศisXgetter เพื่อจุดประสงค์ทางโวหาร ไม่สำคัญว่าคุณจะกำหนดชื่อ getter เองหรือไม่ตราบใดที่คุณใช้สัญกรณ์จุดหรือสัญกรณ์ข้อความด้วยชื่อที่ถูกต้อง หากคุณจะใช้สัญกรณ์จุดซึ่งไม่ทำให้เกิดความแตกต่างคุณยังคงเข้าถึงได้โดยใช้ชื่อคุณสมบัติ:

@property (nonatomic, assign) BOOL working;

[self setWorking:YES];         // Or self.working = YES;
BOOL working = [self working]; // Or = self.working;

หรือ

@property (nonatomic, assign, getter=isWorking) BOOL working;

[self setWorking:YES];           // Or self.working = YES;, same as above
BOOL working = [self isWorking]; // Or = self.working;, also same as above

4
แน่นอนว่าจะต้องทำอย่างไรกับการเป็นรหัสค่าหลักที่สอดคล้องกับวัตถุประสงค์เชิงโวหาร?
Jasarien

5
เป็นเรื่องแปลกเล็กน้อยที่ Apple แนะนำให้ประกาศisXgetters เหล่านั้นแต่ Xcode ไม่สามารถแสดงรายการในป๊อปอัปการเติมข้อความอัตโนมัติได้ (ในตัวอย่างของฉัน) workingแสดงอยู่ที่นั่น แต่isWorkingไม่ใช่ ดังนั้นฉันจึงไม่เห็นประโยชน์ใด ๆ ในการประกาศตัวรับ BOOL ฉันต้องทำมากกว่านี้เพื่อให้สามารถใช้งานได้ (ประกาศ getter) แต่ฉันได้รับน้อยลง (ไม่มีการเติมอัตโนมัติ)
Patrick

4

Apple ขอแนะนำเพื่อวัตถุประสงค์ในการจัดโวหารหากคุณเขียนโค้ดนี้:

@property (nonatomic,assign) BOOL working;

จากนั้นคุณไม่สามารถใช้ [object isWorking]
มันจะแสดงข้อผิดพลาด แต่ถ้าคุณใช้รหัสด้านล่างหมายถึง

@property (assign,getter=isWorking) BOOL working;

คุณจึงใช้ [object isWorking] ได้


-27

ไม่มีประโยชน์ที่จะใช้คุณสมบัติที่มีประเภทดั้งเดิม @propertyจะใช้กับกองจัดสรรNSObjectsเช่นNSString*, NSNumber*, UIButton*และอื่น ๆ เพราะการจัดการหน่วยความจำ accessors ถูกสร้างขึ้นสำหรับฟรี เมื่อคุณสร้าง a BOOLค่าจะถูกจัดสรรบนสแต็กเสมอและไม่ต้องการตัวเข้าถึงพิเศษใด ๆ เพื่อป้องกันการรั่วไหลของหน่วยความจำ isWorkingเป็นเพียงวิธียอดนิยมในการแสดงสถานะของค่าบูลีน

ในภาษา OO อื่นคุณจะสร้างตัวแปรprivate bool working;และตัวเข้าถึงสองตัว: SetWorkingสำหรับตัวตั้งค่าและIsWorkingสำหรับตัวเข้าถึง


1
คุณไม่ได้ตอบคำถามของเขานั่นคือจุดประสงค์ของการตั้งชื่ออย่างชัดเจนว่าอะไรคือสิ่งอื่นที่ไม่ใช่คุณสมบัติ (เขาไม่ได้ถามว่าคุณสมบัติเป็นความคิดที่ดีหรือไม่) นอกจากนี้คุณสมบัติยังอนุญาตสำหรับ KVO และ KVC ดังนั้นประเด็นที่คุณทำจึงทำให้เข้าใจผิด
Martin Gjaldbaek

คุณคิดถูกแล้วที่ฉันมองข้ามการใช้ KVO และ KVC ที่มีคุณสมบัติดั้งเดิม ฉันคิดว่าทุกคนในชุดข้อความกำลังตอบคำถามของเขาเกี่ยวกับ isWorking - มันเป็นหลักการตั้งชื่อ
Thomson Comer

25
สิ่งนี้ไม่ถูกต้องทั้งหมด @propertyมีวัตถุประสงค์อย่างมากที่จะใช้กับประเภทดั้งเดิมและเพื่อประโยชน์ของความสม่ำเสมอเพียงอย่างเดียวมีข้อดีที่สำคัญ นอกจากนี้ประเภทดั้งเดิมบางประเภท (ประเภท 64 บิตในซีพียู 32 บิตและประเภท 128 บิตในซีพียู 32 และ 64 บิตจำนวนมาก) ไม่ได้กำหนดอะตอมไว้ @propertyความเป็นปรมาณูอาจเป็นประโยชน์ในกรณีเหล่านั้นเช่นกัน
bbum

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