Eiko และคนอื่น ๆ ให้คำตอบที่ถูกต้อง
นี่เป็นวิธีที่ง่ายกว่า: เข้าถึงตัวแปรสมาชิกส่วนตัวโดยตรง
ตัวอย่าง
ในไฟล์. h ส่วนหัว:
@property (strong, nonatomic, readonly) NSString* foo;
ในไฟล์การนำไปใช้. m:
self->_foo = @"someString";
นั่นคือทั้งหมดที่คุณต้องการ ไม่มีอะไรจุกจิกกวนใจ
รายละเอียด
ตั้งแต่ Xcode 4.4 และ LLVM Compiler 4.0 ( คุณสมบัติใหม่ใน Xcode 4.4.2) ) คุณไม่จำเป็นต้องยุ่งกับงานที่กล่าวถึงในคำตอบอื่น ๆ :
synthesize
คำหลัก
- การประกาศตัวแปร
- การประกาศคุณสมบัติอีกครั้งในไฟล์. m การนำไปใช้งาน
หลังจากการประกาศคุณสมบัติfoo
คุณสามารถสันนิษฐาน Xcode _foo
ได้เพิ่มตัวแปรสมาชิกส่วนตัวที่ชื่อด้วยคำนำหน้าของขีดล่างนี้:
ถ้าคุณสมบัติถูกประกาศreadwrite
, Xcode สร้างวิธีทะเยอทะยานที่มีชื่อและหมาชื่อfoo
setFoo
เมธอดเหล่านี้ถูกเรียกโดยปริยายเมื่อคุณใช้สัญกรณ์จุด (Object.myMethod ของฉัน) หากมีการประกาศคุณสมบัติจะreadonly
ไม่มีการสร้างตัวตั้งค่า นั่นหมายความว่าตัวแปร backing ที่ตั้งชื่อด้วยเครื่องหมายขีดล่างไม่ใช่อ่านอย่างเดียว readonly
หมายเพียงว่าไม่มีวิธีหมาถูกสังเคราะห์และดังนั้นจึงใช้เครื่องหมายจุดที่จะตั้งค่าล้มเหลวด้วยรวบรวมข้อผิดพลาด สัญกรณ์จุดล้มเหลวเนื่องจากคอมไพลเลอร์หยุดคุณไม่ให้เรียกใช้เมธอด (ตัวตั้งค่า) ที่ไม่มีอยู่
วิธีที่ง่ายที่สุดคือการเข้าถึงตัวแปรสมาชิกโดยตรงซึ่งตั้งชื่อด้วยเครื่องหมายขีดล่าง คุณสามารถทำได้โดยไม่ต้องประกาศตัวแปรชื่อขีดล่าง! Xcode กำลังแทรกการประกาศนั้นเป็นส่วนหนึ่งของกระบวนการสร้าง / คอมไพล์ดังนั้นโค้ดที่คอมไพล์ของคุณจะมีการประกาศตัวแปร แต่คุณไม่เคยเห็นคำประกาศนั้นในไฟล์ซอร์สโค้ดเดิมของคุณ ไม่ใช่เวทมนตร์ แต่เป็นเพียงแค่น้ำตาลในการสังเคราะห์เท่านั้น
การใช้self->
เป็นวิธีการเข้าถึงตัวแปรสมาชิกของออบเจ็กต์ / อินสแตนซ์ คุณอาจจะข้ามสิ่งนั้นไปได้และใช้แค่ชื่อ var แต่ฉันชอบใช้ลูกศร + ตัวเองมากกว่าเพราะมันทำให้โค้ดของฉันเป็นเอกสาร เมื่อคุณเห็นสิ่งที่self->_foo
คุณรู้โดยไม่มีความคลุมเครือซึ่ง_foo
เป็นตัวแปรสมาชิกในอินสแตนซ์นี้
อย่างไรก็ตามการอภิปรายข้อดีข้อเสียของผู้เข้าถึงคุณสมบัติเทียบกับการเข้าถึง ivar โดยตรงเป็นวิธีการรักษาที่รอบคอบที่คุณจะอ่านในหนังสือProgramming iOSของDr.Matt Neuberg ฉันพบว่าการอ่านและอ่านซ้ำมีประโยชน์มาก