ในฐานะที่เป็นคนใหม่สำหรับ Objective-C ใครบางคนสามารถให้ภาพรวมของการเก็บรักษามอบหมายคัดลอกและอื่น ๆ ที่ฉันหายไปซึ่งเป็นไปตามคำสั่ง @property หรือไม่ พวกเขากำลังทำอะไรและทำไมฉันจึงต้องการใช้งานมากกว่ากัน
ในฐานะที่เป็นคนใหม่สำหรับ Objective-C ใครบางคนสามารถให้ภาพรวมของการเก็บรักษามอบหมายคัดลอกและอื่น ๆ ที่ฉันหายไปซึ่งเป็นไปตามคำสั่ง @property หรือไม่ พวกเขากำลังทำอะไรและทำไมฉันจึงต้องการใช้งานมากกว่ากัน
คำตอบ:
บทความที่เชื่อมโยงกับ MrMage ไม่ทำงานอีกต่อไป ดังนั้นนี่คือสิ่งที่ฉันเรียนรู้จากการเขียนโค้ดในระยะเวลาอันสั้นใน Objective-C
nonatomic vs. atomic - "atomic" เป็นค่าเริ่มต้น ใช้ "nonatomic" เสมอ ฉันไม่รู้ว่าทำไม แต่หนังสือที่ฉันอ่านบอกว่ามี "เหตุผลไม่มาก" ที่จะใช้ "อะตอมมิก" (BTW: หนังสือที่ฉันอ่านคือหนังสือ BNR "iOS Programming")
readwrite vs. readonly - "readwrite" เป็นค่าเริ่มต้น เมื่อคุณ @synthesize ทั้ง getter และ setter จะถูกสร้างขึ้นสำหรับคุณ หากคุณใช้ "อ่านอย่างเดียว" จะไม่มีการสร้างตัวตั้งค่า ใช้สำหรับค่าที่คุณไม่ต้องการเปลี่ยนแปลงหลังจากการสร้างอินสแตนซ์ของวัตถุ
รักษาเทียบกับสำเนาและมอบหมาย
atomic
nonatomic
ทั้งสองทางเลือกคือ "ถูกต้อง" ดังนั้นผู้ออกแบบภาษาจึงเลือกใช้โซลูชันที่ปลอดภัยยิ่งขึ้น ในความnonatomic
เป็นจริงโดยทั่วไปแล้วเป็นตัวเลือกที่ดีกว่าเพราะจะไม่ใช้เธรดล็อกที่มีราคาแพงมาก เหตุผลเดียวที่ใช้atomic
คือถ้าคุณสมบัติของคุณอาจถูกตั้งค่าจากหลายเธรด (ในกรณีที่ไม่ใช้อาจทำให้เกิดการปล่อยมากเกินไปหรือรั่วไหล)
ก่อนที่คุณจะรู้เกี่ยวกับคุณลักษณะของ @property คุณควรทราบว่าการใช้ @property คืออะไร
@propertyเสนอวิธีการกำหนดข้อมูลที่คลาสมีจุดประสงค์เพื่อแค็ปซูล หากคุณประกาศอ็อบเจ็กต์ / ตัวแปรโดยใช้@propertyดังนั้นอ็อบเจ็กต์ / ตัวแปรนั้นจะสามารถเข้าถึงได้โดยคลาสอื่นที่อิมพอร์ตคลาส
หากคุณประกาศวัตถุโดยใช้@propertyในไฟล์ส่วนหัวคุณต้องทำการสังเคราะห์โดยใช้@synthesizeในไฟล์การนำไปใช้งาน นี้จะทำให้วัตถุKVC สอดคล้อง โดยค่าเริ่มต้นคอมไพเลอร์จะสังเคราะห์วิธีการเข้าถึงสำหรับวัตถุนี้
วิธีการเข้าถึงคือ: setter และ getter
ตัวอย่าง: .h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m
@implementation XYZClass
@synthesize name;
@end
ตอนนี้คอมไพเลอร์จะสังเคราะห์วิธีการเข้าถึงสำหรับชื่อ
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
รายการแอตทริบิวต์ของ@property
ปรมาณู, ไม่ใช่เชิงอะตอม, เก็บ, คัดลอก, อ่านได้อย่างเดียว, readwrite, มอบหมาย, strong, getter = method, setter = method, unsafe_unretained
atomicเป็นพฤติกรรมเริ่มต้น ถ้าวัตถุถูกประกาศเป็นอะตอมมิกมันจะกลายเป็นเธรดที่ปลอดภัย เธรดที่ปลอดภัยหมายถึงในแต่ละครั้งมีเพียงหนึ่งเธรดของอินสแตนซ์เฉพาะของคลาสนั้นเท่านั้นที่สามารถควบคุมวัตถุนั้นได้
หากเธรดกำลังดำเนินการเมธอด getter ดังนั้นเธรดอื่นไม่สามารถดำเนินการเมธอด setter บนวัตถุนั้น มันช้า
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
ด้วยเหตุนี้จึงเร็วกว่าในการเข้าถึงคุณสมบัติที่ไม่ใช่เชิงอะตอมมากกว่าอะตอมมิก
@property (nonatomic)NSString *name;
เมธอด setter จะเพิ่มจำนวนการเก็บรักษาออบเจ็กต์เพื่อที่จะได้ครอบครองหน่วยความจำในพูลอัตโนมัติ
@property (retain)NSString *name;
แม้ว่าจะมีการตั้งค่าสตริงที่ไม่แน่นอนและเปลี่ยนแปลงในภายหลังอินสแตนซ์จะเก็บค่าใด ๆ ที่มีอยู่ในเวลาที่ตั้งค่าไว้ ไม่มีการสังเคราะห์ setter และ getter
@property (copy) NSString *name;
ตอนนี้
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
ชื่อจะไม่ได้รับผลกระทบ
คอมไพเลอร์จะสร้าง getter แต่ไม่ใช่ setter
@property (readonly) NSString *name;
มันตรงกันข้ามกับอ่านอย่างเดียว
@property (readwrite) NSString *name;
โปรดทราบว่าการจดจำและการมอบหมายนั้นสามารถใช้แทนกันได้โดยทั่วไปเมื่อเปิดใช้งานการรวบรวมขยะ
@property (assign) NSInteger year;
มันมาพร้อมกับ ARC
@property (nonatomic, strong) AVPlayer *player;
ในกรณีของคุณสมบัติบูลีน (คุณสมบัติที่มีค่า YES หรือ NO) มันเป็นธรรมเนียมสำหรับวิธีการ getter ที่จะเริ่มต้นด้วยคำว่า "is"
@property (getter=isFinished) BOOL finished;
วิธีควรลงท้ายด้วยโคลอน
@property(setter = boolBool:) BOOL finished;
การอ้างอิงที่ไม่ปลอดภัยคล้ายกับการอ้างอิงที่อ่อนแอซึ่งไม่ได้ทำให้วัตถุที่เกี่ยวข้องยังมีชีวิตอยู่ แต่จะไม่ถูกตั้งค่าเป็นศูนย์หากวัตถุปลายทางถูกจัดสรรคืน
@property (unsafe_unretained) NSObject *unsafeProperty;
หากคุณต้องการระบุหลายแอตทริบิวต์ให้รวมเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคเช่นนี้
@property (readonly, getter=isFinished) BOOL finished;
@property
ในไฟล์ส่วนหัวคุณต้องทำการสังเคราะห์วัตถุนั้น@synthesize
ในไฟล์การนำไปใช้" ไม่เสมอ. ตัวอย่างเช่น "โดยค่าเริ่มต้นreadwrite
คุณสมบัติจะถูกสำรองข้อมูลโดยตัวแปรอินสแตนซ์ซึ่งจะถูกสังเคราะห์โดยคอมไพเลอร์อีกครั้งโดยอัตโนมัติ" จากเอกสาร
หลังจากอ่านบทความมากมายฉันตัดสินใจรวบรวมข้อมูลคุณลักษณะทั้งหมดเข้าด้วยกัน:
- อะตอม // ค่าเริ่มต้น
- nonatomic
- strong = รักษา // เริ่มต้น
- weak = unsafe_unretained
- รักษา
- กำหนด // เริ่มต้น
- unsafe_unretained
- สำเนา
- อ่านเท่านั้น
- readwrite // ค่าเริ่มต้น
ด้านล่างนี้เป็นลิงค์ไปยังบทความโดยละเอียดที่คุณสามารถค้นหาแอตทริบิวต์เหล่านี้ได้
ขอบคุณมากสำหรับทุกคนที่ให้คำตอบที่ดีที่สุดที่นี่ !!
นี่คือคำอธิบายตัวอย่างจากบทความ
ตัวอย่าง:
@property (retain) NSString *name;
@synthesize name;
ตัวอย่าง:
@property (nonatomic, retain) NSString *name;
@synthesize name;
อธิบาย:
สมมติว่ามีคุณสมบัติสตริงอะตอมมิลที่เรียกว่า "ชื่อ" และถ้าคุณเรียก [self setName: @ "A"] จากเธรด A ให้โทร [self setName: @ "B"] จากเธรด B และเรียกใช้ [ชื่อตัวเอง] จาก เธรด C จากนั้นการดำเนินการทั้งหมดในเธรดที่แตกต่างกันจะดำเนินการตามลำดับซึ่งหมายความว่าหากเธรดหนึ่งตัวกำลังดำเนินการ setter หรือ getter เธรดอื่นจะรอ สิ่งนี้ทำให้คุณสมบัติ "ชื่อ" อ่าน / เขียนปลอดภัย แต่ถ้าเธรด D อื่นโทร [ปล่อยชื่อ] พร้อมกันการดำเนินการนี้อาจทำให้เกิดความผิดพลาดเนื่องจากไม่มีการเรียก setter / getter ที่เกี่ยวข้อง ซึ่งหมายความว่าวัตถุนั้นปลอดภัยในการอ่าน / เขียน (ATOMIC) แต่ไม่ปลอดภัยกับเธรดเนื่องจากเธรดอื่นสามารถส่งข้อความประเภทใดก็ได้ไปยังวัตถุพร้อมกัน นักพัฒนาควรตรวจสอบความปลอดภัยของเธรดสำหรับวัตถุดังกล่าว
หากคุณสมบัติ "ชื่อ" ไม่ใช่คุณสมบัติดังนั้นเธรดทั้งหมดในตัวอย่างด้านบน - A, B, C และ D จะดำเนินการพร้อมกันเพื่อสร้างผลลัพธ์ที่คาดเดาไม่ได้ ในกรณีของอะตอมตัวใดตัวหนึ่ง A, B หรือ C จะทำงานก่อน แต่ D ยังคงสามารถทำงานแบบขนานได้
ตัวอย่าง:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
ตัวอย่าง:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
คำอธิบายที่แข็งแกร่งและอ่อนแอขอขอบคุณ BJ Homer :
ลองนึกภาพวัตถุของเราคือสุนัขและสุนัขต้องการที่จะวิ่งหนี (ถูกจัดสรรคืน) พอยน์เตอร์ที่แข็งแกร่งเป็นเหมือนสายจูงสุนัข ตราบใดที่คุณมีสายจูงสุนัขไว้สุนัขก็จะไม่วิ่งหนี ถ้าคนห้าคนผูกติดกับสุนัขตัวหนึ่ง (ห้าพอยน์เตอร์ชี้ไปที่วัตถุหนึ่ง) จากนั้นสุนัขจะไม่วิ่งหนีจนกว่าจะปลดสายจูงทั้งห้าออก ตัวชี้ที่อ่อนแอในทางกลับกันก็เหมือนเด็กตัวเล็ก ๆ ชี้ไปที่สุนัขและพูดว่า "Look! A dog!" ตราบใดที่สุนัขยังอยู่ในสายจูงเด็กตัวเล็ก ๆ ยังสามารถเห็นสุนัขได้และพวกเขาจะยังคงชี้ไปที่มัน แต่ทันทีที่สายจูงทั้งหมดหลุดออกมาสุนัขจะวิ่งหนีไปไม่ว่าเด็กเล็ก ๆ จำนวนหนึ่งจะชี้ไปยังมัน ทันทีที่ตัวชี้ที่รัดกุม (leash) ไม่ชี้ไปที่วัตถุอีกต่อไปวัตถุจะถูกยกเลิกการจัดสรรและตัวชี้ที่อ่อนแอทั้งหมดจะถูกทำให้เป็นศูนย์ เมื่อเราใช้อ่อน ครั้งเดียวที่คุณต้องการใช้ความอ่อนแอคือถ้าคุณต้องการหลีกเลี่ยงการเก็บรอบ (เช่นผู้ปกครองรักษาเด็กและเด็กยังคงผู้ปกครองดังนั้นจึงไม่เคยปล่อย)
ตัวอย่าง:
@property (nonatomic, retain) NSString *name;
@synthesize name;
ตัวอย่าง:
@property (nonatomic, assign) NSString *address;
@synthesize address;
unsafe_unretained
-unsafe_unretained เป็นตัวระบุความเป็นเจ้าของที่บอก ARC ถึงวิธีการแทรกการโทรออก / พักสาย -unsafe_unretained เป็นเวอร์ชั่น ARC ของการมอบหมาย
ตัวอย่าง:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
ตัวอย่าง:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
คุณสมบัติอะตอมสามารถเข้าถึงได้ครั้งละหนึ่งเธรดเท่านั้น มันคือความปลอดภัยด้าย ค่าเริ่มต้นคืออะตอมโปรดทราบว่าไม่มีคำหลัก อะตอมมิก
Nonatomicหมายถึงหลายเธรดสามารถเข้าถึงรายการเป็นเธรดที่ไม่ปลอดภัย
ดังนั้นควรระมัดระวังเป็นอย่างยิ่งขณะใช้งานอะตอมมิกมันส่งผลต่อประสิทธิภาพของรหัสของคุณ
ต้องการลิงก์นี้เกี่ยวกับคุณสมบัติใน Object-c ใน iOS ...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html