อะไรคือความแตกต่างระหว่าง 'อ่อนแอ' และ 'มอบหมาย' ในการประกาศคุณสมบัติของผู้ร่วมประชุม


87

อะไรคือความแตกต่างระหว่างสิ่งนี้:

@property (nonatomic, weak) id  <SubClassDelegate> delegate; 

และนี่:

@property (nonatomic, assign) id  <SubClassDelegate> delegate; 

ฉันต้องการใช้คุณสมบัติสำหรับผู้รับมอบสิทธิ์

คำตอบ:


153

ความแตกต่างเพียงอย่างเดียวระหว่างweakและassignก็คือหากวัตถุที่weakชี้ไปยังถูกจัดสรรค่าของweakตัวชี้จะถูกตั้งค่าเป็นnilเพื่อที่คุณจะไม่เสี่ยงต่อการเข้าถึงขยะ หากคุณใช้assignสิ่งนั้นจะไม่เกิดขึ้นดังนั้นหากวัตถุถูกยกเลิกการจัดสรรจากภายใต้คุณและคุณพยายามเข้าถึงคุณจะเข้าถึงขยะ

สำหรับวัตถุ Objective-C หากคุณอยู่ในสภาพแวดล้อมที่คุณสามารถใช้ได้weakคุณควรใช้มัน


16
คุณรู้หรือไม่ว่าเหตุใดคลาส Cocoa Touch framework บางคลาสจึงยังคงใช้การกำหนดสำหรับผู้รับมอบสิทธิ์ ตัวอย่างเช่นผู้รับมอบสิทธิ์ของUISearchDisplayControllerยังคงกำหนด ทำไมถึงไม่เคยอัพเดท?
Pwner

@Pwner ดูเหมือนว่าจะเลิกใช้งานแล้วใน iOS 8.0
Stavash

นี่คือตัวอย่างที่ไม่เลิกใช้: UITableViewมีassignสำหรับผู้แทนด้วย:@property (nonatomic, assign) id <UITableViewDelegate> delegate;
Chris Nolet

3
@ChrisNolet เนื่องจากอาจยังคงใช้ MRC (Manual Reference Counting) อยู่ภายใน
Marco Sero

2
ณ วันนี้ตัวอย่างของผู้ร่วมประชุมของ UITableView คือ: @property (nonatomic, อ่อนแอ, เป็นโมฆะ) id <UITableViewDelegate> delegate; นั่นจึงไม่ใช่ตัวอย่างที่ถูกต้องอีกต่อไป
sdoowhsoj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.