คำถามติดแท็ก automatic-ref-counting

Automatic Reference Counting (ARC) เป็นคุณสมบัติคอมไพเลอร์ที่ให้การจัดการหน่วยความจำอัตโนมัติของ Objective-C และ Swift

18
ฉันจะปิดการใช้งาน ARC สำหรับไฟล์เดียวในโครงการได้อย่างไร
ฉันใช้ ARC สำเร็จในโครงการของฉัน อย่างไรก็ตามฉันได้พบกับไฟล์ไม่กี่ไฟล์ (เช่นในการทดสอบหน่วยและวัตถุจำลอง) ซึ่งกฎของ ARC มีความเปราะบางมากขึ้นในขณะนี้ ฉันจำได้ว่าได้ยินว่ามีวิธีปิดใช้งาน ARC แบบต่อไฟล์ แต่ฉันไม่พบตัวเลือกนี้ เป็นไปได้ไหม ฉันจะปิดการใช้งาน ARC บนพื้นฐานต่อไฟล์ได้อย่างไร

19
performSelector อาจทำให้เกิดการรั่วไหลเนื่องจากไม่รู้จักตัวเลือก
ฉันได้รับคำเตือนต่อไปนี้โดยคอมไพเลอร์ ARC: "performSelector may cause a leak because its selector is unknown". นี่คือสิ่งที่ฉันทำ: [_controller performSelector:NSSelectorFromString(@"someMethod")]; เหตุใดฉันจึงได้รับคำเตือนนี้ ฉันเข้าใจว่าคอมไพเลอร์ไม่สามารถตรวจสอบว่ามีตัวเลือกอยู่หรือไม่ แต่ทำไมมันถึงทำให้เกิดการรั่ว และฉันจะเปลี่ยนรหัสของฉันอย่างไรเพื่อที่ฉันจะไม่ได้รับคำเตือนนี้อีกต่อไป?

11
IBOutlet ควรแข็งแรงหรืออ่อนแอภายใต้ ARC หรือไม่?
ฉันกำลังพัฒนาเฉพาะสำหรับ iOS 5 โดยใช้ ARC ควรIBOutletเป็นUIViews (และคลาสย่อย) เป็นstrongหรือweak? ดังต่อไปนี้: @property (nonatomic, weak) IBOutlet UIButton *button; จะกำจัดสิ่งเหล่านี้ทั้งหมด: - (void)viewDidUnload { // ... self.button = nil; // ... } มีปัญหาในการทำเช่นนี้หรือไม่? เทมเพลตใช้strongเช่นเดียวกับคุณสมบัติที่สร้างขึ้นโดยอัตโนมัติเมื่อสร้างการเชื่อมต่อโดยตรงไปยังส่วนหัวจากตัวแก้ไข 'ตัวสร้างส่วนต่อประสาน' แต่ทำไม? การอ้างอิงUIViewControllerมีอยู่แล้วซึ่งยังคงรักษาการแสดงย่อยไว้strongview

9
เราจะใช้ [การปิดบังตัว] ในสวิฟท์
ใน WWDC 2014 เซสชั่น 403 Intermediate Swiftและการถอดเสียงมีสไลด์ดังต่อไปนี้ ลำโพงพูดในกรณีนั้นถ้าเราไม่ใช้[unowned self]ตรงนั้นมันจะเป็นความจำรั่ว หมายความว่าเราควรใช้[unowned self]การปิดภายในเสมอหรือไม่? บนเส้น 64 ViewController.swift ของ app Swift อากาศ , [unowned self]ฉันไม่ได้ใช้ แต่ผมปรับปรุง UI โดยใช้บางส่วน@IBOutletเหมือนและself.temperature self.loadingIndicatorมันอาจจะตกลงเพราะทุกวินาทีฉันที่กำหนดไว้@IBOutlet weakแต่เพื่อความปลอดภัยเราควรใช้อยู่เสมอ[unowned self]? class TempNotifier { var onChange: (Int) -> Void = {_ in } var currentTemp = 72 init() { onChange = { [unowned self] …

8
วัตถุประสงค์ -C ARC: แข็งแรงเทียบกับการคงไว้และอ่อนแอเทียบกับการมอบหมาย
มีสองคุณลักษณะการจัดการหน่วยความจำใหม่สำหรับคุณสมบัตินำโดย ARC มีและstrongweak นอกเหนือจากcopyสิ่งที่เห็นได้ชัดว่าแตกต่างอย่างสิ้นเชิงมีความแตกต่างระหว่างstrongvs retainและweakvs assign? จากความเข้าใจของฉันความแตกต่างเพียงอย่างเดียวที่นี่คือweakจะกำหนดnilให้กับตัวชี้ในขณะที่assignไม่ได้ซึ่งหมายความว่าโปรแกรมจะหยุดทำงานเมื่อฉันส่งข้อความไปยังตัวชี้เมื่อมีการเปิดตัว แต่ถ้าฉันใช้weakสิ่งนี้จะไม่เกิดขึ้นเพราะข้อความที่ส่งถึงnilจะไม่ทำอะไรเลย ผมไม่ทราบว่าเกี่ยวกับความแตกต่างใด ๆ ระหว่างและstrongretain มีเหตุผลใดบ้างที่ฉันควรใช้assignและretainในโครงการใหม่หรือเป็นประเภทที่ถูกคัดค้าน?


2
เหตุใด Apple แนะนำให้ใช้ dispatch_once สำหรับการนำรูปแบบซิงเกิลไปใช้ภายใต้ ARC
อะไรคือเหตุผลที่แน่นอนสำหรับการใช้ dispatch_once ใน accessor อินสแตนซ์ที่แชร์ของ singleton ภายใต้ ARC + (MyClass *)sharedInstance { // Static local predicate must be initialized to 0 static MyClass *sharedInstance = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ sharedInstance = [[MyClass alloc] init]; // Do any other initialisation stuff here }); return sharedInstance; } มันเป็นความคิดที่ดีไหมหรือที่จะยกตัวอย่างซิงเกิลตันแบบอะซิงโครนัสในพื้นหลัง? …

4
Objective-C ประกาศคุณสมบัติ @property (ไม่ใช่แบบเชิงสำเนาคัดลอกอ่อนแอ)
คนที่สามารถอธิบายให้ฉันในรายละเอียดเมื่อฉันต้องใช้แต่ละแอตทริบิวต์: nonatomic, copy, strong, weakและอื่น ๆ สำหรับสถานที่ให้บริการประกาศและอธิบายสิ่งที่แต่ละคนไม่? ตัวอย่างบางประเภทก็ยอดเยี่ยมเช่นกัน ฉันใช้ ARC

10
Semantic Issue: Getter synthesized getter เป็นไปตามหลักการตั้งชื่อ Cocoa สำหรับการคืนค่าออบเจ็กต์ 'เจ้าของ'
ขณะนี้ฉันใช้ iOS 5 SDK พยายามพัฒนาแอพของฉัน ฉันกำลังพยายามสร้าง NSString พร็อพเพอร์ตี้แล้วทำการสังเคราะห์ในไฟล์. m (ฉันเคยทำสิ่งนี้มาก่อนโดยไม่มีปัญหา) ตอนนี้ฉันเจอสิ่งนี้: "ปัญหาทางความหมาย: ตัวสังเคราะห์ที่ได้รับจากทรัพย์สินตามแผนการตั้งชื่อโกโก้สำหรับส่งคืนวัตถุที่เป็นเจ้าของ" นี่คือรหัสของฉัน: .h @interface ViewController : UIViewController { NSString *newTitle; } @property (strong, nonatomic) NSString *newTitle; .m @synthesize newTitle; ไม่มีใครมีเงื่อนงำฉันจะแก้ไขได้อย่างไร ขอบคุณ !!

8
เมื่อแปลงโครงการเพื่อใช้ ARC“ กรณีสวิตช์อยู่ในขอบเขตที่ได้รับการป้องกัน” หมายความว่าอย่างไร
เมื่อแปลงโครงการเพื่อใช้ ARC "กรณีสวิตช์อยู่ในขอบเขตที่มีการป้องกัน" หมายความว่าอย่างไร ฉันกำลังแปลงโครงการเพื่อใช้ ARC โดยใช้ Xcode 4 Edit -> Refactor -> แปลงเป็น Objective-C ARC ... หนึ่งในข้อผิดพลาดที่ฉันได้รับคือ "กรณีสวิตช์อยู่ในขอบเขตที่ได้รับการป้องกัน" ใน "บาง" ของสวิตช์ใน กรณีสวิทช์ แก้ไขนี่คือรหัส: ข้อผิดพลาดมีการทำเครื่องหมายในกรณี "เริ่มต้น": - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @""; UITableViewCell *cell ; switch (tableView.tag) { case 1: CellIdentifier = @"CellAuthor"; cell …

6
ส่งการอ้างอิงตนเองที่อ่อนแอไปยังบล็อกใน ARC เสมอหรือไม่
ฉันสับสนเล็กน้อยเกี่ยวกับการใช้งานบล็อกใน Objective-C ปัจจุบันฉันใช้ ARC และมีบล็อกจำนวนมากในแอปของฉันในปัจจุบันอ้างอิงถึงเสมอselfแทนที่จะเป็นข้อมูลอ้างอิงที่อ่อนแอ นั่นอาจเป็นสาเหตุของบล็อกเหล่านี้ในการรักษาselfและป้องกันไม่ให้ถูกจัดสรรคืน? คำถามคือฉันควรใช้การweakอ้างอิงselfในบล็อกหรือไม่ -(void)handleNewerData:(NSArray *)arr { ProcessOperation *operation = [[ProcessOperation alloc] initWithDataToProcess:arr completion:^(NSMutableArray *rows) { dispatch_async(dispatch_get_main_queue(), ^{ [self updateFeed:arr rows:rows]; }); }]; [dataProcessQueue addOperation:operation]; } ProcessOperation.h @interface ProcessOperation : NSOperation { NSMutableArray *dataArr; NSMutableArray *rowHeightsArr; void (^callback)(NSMutableArray *rows); } ProcessOperation.m -(id)initWithDataToProcess:(NSArray *)data completion:(void (^)(NSMutableArray *rows))cb{ if(self …

7
อะไรคือความแตกต่างระหว่างการอ้างอิงที่อ่อนแอและการอ้างอิงที่ไม่มีเจ้าของ
สวิฟท์มี: การอ้างอิงที่แข็งแกร่ง ข้อมูลอ้างอิงที่อ่อนแอ การอ้างอิงที่ไม่เป็นเจ้าของ การอ้างอิงที่ไม่มีเจ้าของแตกต่างจากการอ้างอิงที่อ่อนแออย่างไร เมื่อใดจึงจะปลอดภัยที่จะใช้การอ้างอิงที่ไม่ได้เป็นเจ้าของ การอ้างอิงที่ไม่มีเจ้าของความเสี่ยงด้านความปลอดภัยเช่นตัวชี้ห้อยใน C / C ++?

5
การรั่วไหลของชนิดใดที่การอ้างอิงอัตโนมัติใน Objective-C ไม่ป้องกันหรือย่อให้เล็กสุด
ในแพลตฟอร์ม Mac และ iOS หน่วยความจำรั่วมักเกิดจากพอยน์เตอร์ที่ไม่ได้เผยแพร่ ตามเนื้อผ้ามันมีความสำคัญสูงสุดเสมอในการตรวจสอบ allocs ของคุณคัดลอกและเก็บเพื่อให้แน่ใจว่าแต่ละคนมีข้อความปล่อยที่สอดคล้องกัน Toolchain ที่มาพร้อมกับ Xcode 4.2 แนะนำการนับจำนวนการอ้างอิงอัตโนมัติ (ARC) ด้วยตัวแปล LLVMเวอร์ชั่นล่าสุดซึ่งแก้ไขปัญหานี้ได้อย่างสมบูรณ์ มันเจ๋งมากและมันช่วยลดเวลาในการพัฒนาที่ไม่จำเป็นออกไปทางโลกและป้องกันการรั่วไหลของหน่วยความจำที่ไม่ประมาทจำนวนมากซึ่งง่ายต่อการแก้ไขด้วยการรักษา / ปล่อยสมดุลที่เหมาะสม แม้กระทั่งระบบพูลอัตโนมัติที่ต้องจัดการแตกต่างกันเมื่อคุณเปิดใช้งาน ARC สำหรับแอป Mac และ iOS (เพราะคุณไม่ควรจัดสรรNSAutoreleasePoolอีกต่อไป) แต่การรั่วไหลของหน่วยความจำอื่น ๆมันไม่ได้ป้องกันไม่ให้ฉันยังต้องระวัง? เป็นโบนัสอะไรคือความแตกต่างระหว่าง ARC บน Mac OS X และ iOS และการเก็บขยะบน Mac OS X

8
ฉันจะหลีกเลี่ยงการจับภาพตนเองเป็นบล็อกเมื่อใช้งาน API ได้อย่างไร
ฉันมีแอพที่ใช้งานได้และกำลังแปลงเป็น ARC ใน Xcode 4.2 หนึ่งในคำเตือนก่อนการตรวจสอบที่เกี่ยวข้องกับการจับselfอย่างยิ่งในบล็อกที่นำไปสู่วงจรการเก็บรักษา ฉันได้สร้างตัวอย่างโค้ดง่ายๆเพื่ออธิบายปัญหา ฉันเชื่อว่าฉันเข้าใจความหมายของสิ่งนี้ แต่ฉันไม่แน่ใจว่า "ถูกต้อง" หรือวิธีที่แนะนำให้ใช้สถานการณ์ประเภทนี้ self เป็นตัวอย่างของคลาส MyAPI รหัสด้านล่างนั้นง่ายขึ้นเพื่อแสดงเฉพาะการโต้ตอบกับวัตถุและบล็อกที่เกี่ยวข้องกับคำถามของฉัน สมมติว่า MyAPI รับข้อมูลจากแหล่งข้อมูลระยะไกลและ MyDataProcessor ทำงานกับข้อมูลนั้นและสร้างเอาต์พุต โปรเซสเซอร์ได้รับการกำหนดค่าด้วยบล็อกเพื่อสื่อสารความคืบหน้าและสถานะ ตัวอย่างโค้ด: // code sample self.delegate = aDelegate; self.dataProcessor = [[MyDataProcessor alloc] init]; self.dataProcessor.progress = ^(CGFloat percentComplete) { [self.delegate myAPI:self isProcessingWithProgress:percentComplete]; }; self.dataProcessor.completion = ^{ [self.delegate myAPIDidFinish:self]; self.dataProcessor = nil; …

1
dealloc ที่กำหนดเองและ ARC (Objective-C)
ในแอพ iPad เล็ก ๆ ของฉันฉันมีฟังก์ชั่น "เปลี่ยนภาษา" ที่ใช้ผู้สังเกตการณ์ viewDidLoad:ทุกควบคุมดูลงทะเบียนตัวเองกับผู้สังเกตการณ์ของฉันในช่วงของ - (void)viewDidLoad { [super viewDidLoad]; [observer registerObject:self]; } เมื่อผู้ใช้กดปุ่ม "เปลี่ยนภาษา" ภาษาใหม่จะถูกเก็บไว้ในรูปแบบของฉันและผู้สังเกตการณ์จะได้รับแจ้งและเรียกupdateUi:ตัวเลือกบนวัตถุที่ลงทะเบียน สิ่งนี้ทำงานได้ดีมากยกเว้นเมื่อฉันมีตัวควบคุมมุมมองใน TabBarController นี่คือเนื่องจากเมื่อแถบแท็บโหลดมันดึงไอคอนแท็บจากตัวควบคุมลูกโดยไม่ต้องเริ่มต้นมุมมองดังนั้นจึงviewDidLoad:ไม่ถูกเรียกดังนั้นตัวควบคุมมุมมองเหล่านั้นไม่ได้รับการแจ้งเตือนการเปลี่ยนแปลงภาษา ด้วยเหตุนี้ฉันจึงย้ายการregisterObject:โทรไปยังinitวิธีการ ย้อนกลับไปเมื่อฉันเคยviewDidLoad:ลงทะเบียนกับผู้สังเกตการณ์ฉันเคยviewDidUnload:ยกเลิกการลงทะเบียน ตั้งแต่ตอนนี้ผมลงทะเบียนในก็จะทำให้ความรู้สึกมากที่จะถอนการลงทะเบียนในinitdealloc แต่นี่คือปัญหาของฉัน เมื่อฉันเขียน: - (void) dealloc { [observer unregisterObject:self]; [super dealloc]; } ฉันได้รับข้อผิดพลาดนี้: ARC ห้ามส่งข้อความที่ชัดเจนถึง 'dealloc' เนื่องจากฉันต้องโทรหา[super dealloc]เพื่อให้แน่ใจว่าซูเปอร์คลาสนั้นสะอาดอย่างถูกต้อง แต่ ARC ห้ามไม่ให้ฉันติดอยู่ตอนนี้ มีวิธีอื่นที่จะได้รับแจ้งเมื่อวัตถุของฉันใกล้จะตายหรือไม่

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