ฉันเดาว่าเวอร์ชั่นคอมไพเลอร์ที่คุณใช้นั้นเป็นไปตามกฎการจัดการหน่วยความจำสำหรับคุณสมบัติที่ประกาศเช่นกันโดยเฉพาะสำหรับอุปกรณ์เข้าถึงคุณสมบัติที่ประกาศไว้:
คุณเป็นเจ้าของวัตถุถ้าคุณสร้างขึ้นโดยใช้วิธีการที่ชื่อขึ้นต้นด้วย“ alloc”,“ new”,“ copy” หรือ“ mutableCopy”
คุณสมบัติชื่อnewTitle
เมื่อสังเคราะห์ผลลัพธ์วิธีการที่เรียกว่า-newTitle
ดังนั้นคำเตือน / ข้อผิดพลาด -newTitle
ควรเป็นเมธอด getter สำหรับnewTitle
คุณสมบัติอย่างไรก็ตามหลักการตั้งชื่อระบุว่าเมธอดที่ชื่อขึ้นต้นด้วยnew
ส่งคืนออบเจกต์ที่ผู้โทรเป็นเจ้าของซึ่งไม่ใช่กรณีของเมธอด getter
คุณสามารถแก้ปัญหานี้ได้โดย:
การเปลี่ยนชื่อคุณสมบัตินั้น:
@property (strong, nonatomic) NSString *theNewTitle;
การรักษาชื่อคุณสมบัติและการระบุชื่อ getter ที่ไม่ได้ขึ้นต้นด้วยคำนำหน้าชื่อวิธีพิเศษอย่างใดอย่างหนึ่ง:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
การรักษาทั้งชื่อคุณสมบัติและชื่อ getter และบอกคอมไพเลอร์ว่าแม้ว่าชื่อ getter เริ่มต้นด้วยnew
มันเป็นของnone
ตระกูลเมธอดเมื่อเทียบกับnew
ตระกูลเมธอด:
#ifndef __has_attribute
#define __has_attribute(x) 0 // Compatibility with non-clang compilers
#endif
#if __has_attribute(objc_method_family)
#define BV_OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
#else
#define BV_OBJC_METHOD_FAMILY_NONE
#endif
@interface ViewController : UIViewController
@property (strong, nonatomic) NSString *newTitle;
- (NSString *)newTitle BV_OBJC_METHOD_FAMILY_NONE;
@end
โปรดทราบว่าแม้ว่าวิธีนี้จะช่วยให้คุณสามารถรักษาnewTitle
ทั้งชื่อคุณสมบัติและชื่อผู้ได้รับ แต่การใช้วิธีการ-newTitle
ที่ไม่ส่งคืนวัตถุที่เป็นของผู้โทรอาจสร้างความสับสนให้ผู้อื่นที่อ่านรหัสของคุณ
สำหรับบันทึก Apple ได้เผยแพร่Transitioning เป็น ARC Release Notesซึ่งระบุว่า:
คุณไม่สามารถให้คุณสมบัติชื่อที่ขึ้นต้นด้วยหรือnew
copy
พวกเขาได้รับแจ้งว่าคำสั่งของพวกเขาไม่ถูกต้องนัก: ผู้ร้ายคือชื่อเมธอด getter ไม่ใช่ชื่อคุณสมบัติ
แก้ไข 17 มกราคม 2558:ฉันเพิ่งสังเกตเห็นความมุ่งมั่นล่าสุดต่อ Clangที่แนะนำตัวเลือก 3 ด้านบน (โดยใช้objc_method_family(none)
) รวมถึงตัวแก้ไขสำหรับกรณีทั่วไปที่ชื่อคุณสมบัติตรงกับหนึ่งในคำนำหน้าตระกูลวิธีการพิเศษ Xcode มีแนวโน้มที่จะรวมการเปลี่ยนแปลงนี้ในที่สุด