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

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

7
การจับตัวเองอย่างมากในบล็อกนี้มีแนวโน้มที่จะนำไปสู่วงจรการเก็บรักษา
ฉันจะหลีกเลี่ยงคำเตือนนี้ใน xcode ได้อย่างไร นี่คือข้อมูลโค้ด: [player(AVPlayer object) addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(0.1, 100) queue:nil usingBlock:^(CMTime time) { current+=1; if(current==60) { min+=(current/60); current = 0; } [timerDisp(UILabel) setText:[NSString stringWithFormat:@"%02d:%02d",min,current]];///warning occurs in this line }];

6
กลไกการนับการอ้างอิงอัตโนมัติใหม่ทำงานอย่างไร
บางคนสามารถอธิบายสั้น ๆ ว่า ARC ทำงานอย่างไร ฉันรู้ว่ามันแตกต่างจาก Garbage Collection แต่ฉันแค่สงสัยว่ามันทำงานอย่างไร นอกจากนี้หาก ARC ทำในสิ่งที่ GC ทำโดยไม่มีการขัดขวางประสิทธิภาพแล้วเหตุใด Java จึงใช้ GC ทำไมมันไม่ใช้ ARC เช่นกัน?

7
ทำไม @autoreleasepool ยังต้องการ ARC อยู่
ส่วนใหญ่ด้วย ARC (การอ้างอิงโดยอัตโนมัติ) เราไม่จำเป็นต้องคิดถึงการจัดการหน่วยความจำเลยด้วย Objective-C ไม่อนุญาตให้สร้างNSAutoreleasePoolอีกต่อไปอย่างไรก็ตามมีไวยากรณ์ใหม่: @autoreleasepool { … } คำถามของฉันคือทำไมฉันจะต้องใช้สิ่งนี้เมื่อฉันไม่ควรปล่อย / ตอบรับอัตโนมัติด้วยตนเอง แก้ไข:เพื่อสรุปสิ่งที่ฉันได้จากคำตอบและความคิดเห็นทั้งหมด: ไวยากรณ์ใหม่: @autoreleasepool { … } เป็นไวยากรณ์ใหม่สำหรับ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; … [pool drain]; ที่สำคัญกว่า: ใช้ ARC เช่นเดียวกับautoreleaserelease มันต้องการพูลการปล่อยอัตโนมัติในสถานที่ ARC ไม่ได้สร้างกลุ่มการปล่อยอัตโนมัติให้คุณ อย่างไรก็ตาม: เธรดหลักของแอป Cocoa ทุกแอปมีพูลการเลิกอัตโนมัติอยู่แล้ว มีสองโอกาสที่คุณอาจต้องการใช้ประโยชน์จาก@autoreleasepool: myRunLoop(…) { @autoreleasepool { … } return success; }เมื่อคุณอยู่ในหัวข้อรองและไม่มีสระว่ายน้ำเปิดตัวรถยนต์คุณต้องทำด้วยตัวเองเพื่อป้องกันการรั่วไหลเช่น …

4
ปิดใช้งานการนับการอ้างอิงอัตโนมัติสำหรับบางไฟล์
ฉันดาวน์โหลด iOS 5 SDK แล้วและพบว่า ARC เป็นคุณสมบัติที่ยอดเยี่ยมของ Apple คอมไพเลอร์ตัวใหม่ ในขณะนี้กรอบงานของบุคคลที่สามจำนวนมากไม่รองรับ ARC ฉันสามารถใช้ ARC สำหรับรหัสใหม่ของฉันและไม่ให้รหัสการเก็บ / ปล่อยปัจจุบันไม่เปลี่ยนแปลงได้หรือไม่? ตัวแปลง ARC ไม่ทำงานที่นี่เนื่องจากเฟรมเวิร์กบางตัวเช่น JSONKit ไม่สามารถแปลงเป็น ARC ได้โดยใช้ตัวแปลง แก้ไข: คำตอบคือการเพิ่ม-fno-objc-arcการรวบรวมธงสำหรับไฟล์ที่คุณไม่ต้องการ ARC ใน Xcode 4 คุณสามารถทำได้ภายใต้เป้าหมายของคุณ -> Build Phases -> Compile Sources

18
ฉันจะประกาศการอ้างอิงที่อ่อนแอใน Swift ได้อย่างไร
ฉันต้องการจัดเก็บเอกสารอ้างอิงอ่อน ๆ ใน Swift อาร์เรย์ไม่ควรเป็นข้อมูลอ้างอิงที่อ่อนแอ - องค์ประกอบควรเป็น ฉันคิดว่า Cocoa NSPointerArrayนำเสนอรุ่นที่ไม่ปลอดภัยสำหรับประเภทนี้

10
ฉันจะใช้ Objective-C singleton ที่เข้ากันได้กับ ARC ได้อย่างไร
ฉันจะแปลง (หรือสร้าง) คลาสซิงเกิลตันที่รวบรวมและทำงานอย่างถูกต้องเมื่อใช้การนับการอ้างอิงอัตโนมัติ (ARC) ใน Xcode 4.2 ได้อย่างไร

3
ARC และ bridged cast
ด้วย ARC ฉันไม่สามารถเลือกใช้อีกต่อCGColorRefไปidได้ ฉันเรียนรู้ว่าฉันต้องทำนักแสดงที่เชื่อมโยง ตามเอกสารดังกราว : หล่อสะพานเป็น C- โยนสไตล์ข้อเขียนกับหนึ่งในสามคำ: (__bridge T) opTปลดเปลื้องตัวถูกดำเนินการประเภทปลายทาง หากT เป็นประเภทตัวชี้วัตถุที่คงไว้ได้นั้นopจะต้องมีประเภทตัวชี้ที่ไม่สามารถเก็บรักษาได้ ถ้าTเป็นประเภทพอยน์เตอร์ที่ไม่สามารถเก็บถาวรได้ op จะต้องมีประเภทพอยน์เตอร์ของวัตถุที่คงอยู่ได้ มิฉะนั้นนักแสดงจะหล่อขึ้นมา ไม่มีการถ่ายโอนความเป็นเจ้าของและ ARC จะไม่มีการดำเนินการเก็บรักษาไว้ (__bridge_retained T) opปลดเปลื้องตัวถูกดำเนินการซึ่งจะต้องมีประเภทตัวชี้วัตถุที่เก็บรักษาไว้กับประเภทปลายทางซึ่งจะต้องเป็นประเภทตัวชี้ที่ไม่สามารถเก็บรักษาได้ ARC จะรักษาค่าไว้โดยขึ้นอยู่กับการปรับค่าตามปกติตามปกติและผู้รับจะรับผิดชอบในการปรับสมดุล +1 นั้น (__bridge_transfer T) opปลดเปลื้องตัวถูกดำเนินการซึ่งจะต้องมีประเภทตัวชี้ที่ไม่สามารถเก็บรักษาไว้กับประเภทปลายทางซึ่งจะต้องเป็นประเภทตัวชี้วัตถุที่รักษาได้ ARC จะปล่อยค่าในตอนท้ายของนิพจน์แบบปิดล้อมซึ่งขึ้นอยู่กับการเพิ่มประสิทธิภาพตามปกติของค่าท้องถิ่น การปลดเปลื้องเหล่านี้จำเป็นต้องมีเพื่อถ่ายโอนวัตถุเข้าและออกจากการควบคุม ARC; ดูเหตุผลในส่วนการแปลงของพอยน์เตอร์พอยน์เตอร์ที่เก็บได้ การใช้__bridge_retainedหรือ__bridge_transferโยนเพื่อโน้มน้าวใจ ARC ให้ปล่อยการเก็บหรือปล่อยที่ไม่สมดุลตามลำดับเป็นรูปแบบที่ไม่ดี ในสถานการณ์แบบใดฉันจะใช้แต่ละสถานการณ์ ตัวอย่างเช่นCAGradientLayerมีcolorsคุณสมบัติที่รับอาร์เรย์ของCGColorRefs ฉันเดาว่าฉันควรใช้__brigeที่นี่ แต่ทำไมฉันควร (หรือไม่ควร) ไม่ชัดเจน

7
แก้ไขคำเตือน“ การจับ [วัตถุ] อย่างยิ่งในบล็อกนี้มีแนวโน้มที่จะนำไปสู่การรักษารอบ” ในรหัสที่เปิดใช้งาน ARC
ในรหัสที่เปิดใช้งาน ARC จะแก้ไขคำเตือนเกี่ยวกับวงจรการรักษาที่อาจเกิดขึ้นได้อย่างไรเมื่อใช้ API แบบบล็อก คำเตือน: Capturing 'request' strongly in this block is likely to lead to a retain cycle ผลิตโดยโค้ดขนาดสั้นนี้: ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:... [request setCompletionBlock:^{ NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.rawResponseData error:nil]; // ... }]; คำเตือนเชื่อมโยงกับการใช้วัตถุrequestภายในบล็อก

5
คำถามบางประการเกี่ยวกับการนับอ้างอิงอัตโนมัติใน iOS5 SDK
ฉันกำลังพัฒนาแอพสำหรับ iPad การพัฒนาเริ่มต้นสำหรับ iOS 4.2 และกำลังดำเนินการต่อไป (และฉันคิดว่าจะเสร็จสมบูรณ์) สำหรับ iOS 4.3 ฉันเพิ่งอ่านเกี่ยวกับ ARC ใน iOS 5 และโดยพื้นฐานแล้วฉันเข้าใจว่าเราไม่จำเป็นต้องปล่อยและเก็บรักษาวัตถุอีกต่อไป คำถามของฉันคือ: หากฉันตัดสินใจที่จะอัปเกรดเป็น iOS 5 ฉันจำเป็นต้องลบข้อความ[myObject retain]และ[myObject release]ข้อความทั้งหมดออกจากรหัสของฉันหรือไม่ หากฉันพัฒนาแอปใหม่สำหรับ iOS 5 โดยใช้ ARC ฉันจะต้องใช้การตรวจสอบ "ความเข้ากันได้ย้อนยุค" บางประเภทหรือไม่ กล่าวคือฉันจะต้องตรวจสอบเวอร์ชันของ iOS และรักษาการโทรและปล่อยตามนั้นหรือไม่ โดยพื้นฐานแล้ว ARC สามารถใช้ได้กับ iOS ทุกเวอร์ชันหรือเฉพาะสำหรับ iOS 5?

2
ฉันตั้งค่าคุณสมบัติเป็นศูนย์ใน dealloc เมื่อใช้ ARC หรือไม่
ฉันกำลังพยายามเรียนรู้การนับอ้างอิงอัตโนมัติใน iOS 5 ตอนนี้ส่วนแรกของคำถามนี้น่าจะง่าย: ถูกต้องหรือไม่ที่ฉันไม่จำเป็นต้องเขียนคำสั่ง release-property อย่างชัดเจนใน dealloc ของฉันเมื่อใช้ ARC กล่าวอีกนัยหนึ่งเป็นความจริงหรือไม่ว่าสิ่งต่อไปนี้ไม่จำเป็นต้องมี dealloc ที่ชัดเจน? @interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end คำถามถัดไปและที่สำคัญกว่าของฉันมาจากบรรทัดในเอกสารการเปลี่ยนไปใช้ ARC Release Notes : คุณไม่จำเป็นต้องปล่อยตัวแปรอินสแตนซ์ แต่คุณอาจต้องเรียกใช้ [self setDelegate: nil] ในคลาสระบบและโค้ดอื่น ๆ ที่ไม่ได้คอมไพล์โดยใช้ ARC สิ่งนี้ทำให้เกิดคำถาม: ฉันจะรู้ได้อย่างไรว่าคลาสระบบใดที่ไม่ได้คอมไพล์กับ ARC เมื่อใดที่ฉันควรสร้าง dealloc ของตัวเองและตั้งค่าอย่างชัดเจนเพื่อรักษาคุณสมบัติให้เป็นศูนย์ ฉันควรถือว่าคลาสเฟรมเวิร์ก NS …

1
“ ผู้รับประเภท 'CALayer' สำหรับข้อความอินสแตนซ์คือการประกาศไปข้างหน้า "หมายความว่าอย่างไร
ฉันกำลังย้ายบล็อกโค้ดจากโปรเจ็กต์ iOS4 ไปยัง iOS5 และฉันมีปัญหากับ ARC รหัสสร้าง PDF จากการจับภาพหน้าจอ รหัสการสร้าง PDF UIView *captureView; ... NSMutableData *pdfData = [NSMutableData data]; UIGraphicsBeginPDFContextToData(pdfData, captureView.bounds, nil); UIGraphicsBeginPDFPage(); CGContextRef pdfContext = UIGraphicsGetCurrentContext(); [captureView.layer renderInContext:pdfContext]; UIGraphicsEndPDFContext(); บรรทัด renderInContext [captureView.layer renderInContext:pdfContext]; สร้างข้อผิดพลาดต่อไปนี้ Automatic Reference Counting issue Receiver type 'CALayer' for instance message is a forward declaration มีความคิดอะไรเกิดขึ้นที่นี่?

3
ในสถานการณ์ใดบ้างที่เราต้องเขียน __autoreleasing ความเป็นเจ้าของคุณสมบัติภายใต้ ARC
ฉันกำลังพยายามไขปริศนาให้เสร็จ __strongเป็นค่าเริ่มต้นสำหรับพอยน์เตอร์อ็อบเจ็กต์ Objective-C ที่เก็บรักษาได้เช่น NSObject, NSString และอื่น ๆ ซึ่งเป็นการอ้างอิงที่ชัดเจน ARC จะปรับสมดุลกับ-releaseจุดสิ้นสุดของขอบเขต __unsafe_unretainedเท่ากับวิธีเก่า ใช้สำหรับตัวชี้ที่อ่อนแอโดยไม่ยึดวัตถุที่ยึดได้ __weakเหมือนกับ__unsafe_unretainedยกเว้นว่ามันเป็นการอ้างอิงที่อ่อนแอโดยอัตโนมัติซึ่งหมายความว่าตัวชี้จะถูกตั้งค่าเป็นศูนย์ทันทีที่วัตถุที่อ้างอิงถูกยกเลิกการจัดสรร ซึ่งจะช่วยขจัดอันตรายจากตัวชี้อันตรายและข้อผิดพลาด EXC_BAD_ACCESS แต่สิ่งที่__autoreleasingดีสำหรับ? ฉันมีช่วงเวลาที่ยากลำบากในการค้นหาตัวอย่างที่ใช้ได้จริงเกี่ยวกับเวลาที่ฉันต้องใช้คุณสมบัตินี้ ฉันเชื่อว่าเป็นเพียงฟังก์ชันและวิธีการที่คาดว่าจะมีตัวชี้ตัวชี้เช่น: - (BOOL)save:(NSError**); หรือ NSError *error = nil; [database save:&error]; ซึ่งภายใต้ ARC จะต้องประกาศด้วยวิธีนี้: - (BOOL)save:(NSError* __autoreleasing *); แต่นี้เป็นที่คลุมเครือเกินไปและฉันต้องการที่จะเข้าใจว่าทำไม ข้อมูลโค้ดที่ฉันพบคือตำแหน่ง __autoreleasing ระหว่างสองดาวซึ่งดูแปลกสำหรับฉัน ประเภทคือNSError**(ตัวชี้ตัวชี้ไปที่ NSError) ดังนั้นทำไมจึงวางไว้__autoreleasingระหว่างดวงดาวไม่ใช่แค่อยู่ข้างหน้าNSError**? นอกจากนี้ยังอาจจะมีสถานการณ์อื่น ๆ __autoreleasingที่ฉันจะต้องพึ่งพา

6
คำอธิบายของพื้นที่เก็บข้อมูลที่แข็งแกร่งและอ่อนแอใน iOS5
ฉันยังใหม่กับการพัฒนา iOS5 และใช้ objective-c ฉันมีปัญหาในการทำความเข้าใจความแตกต่างระหว่างพื้นที่เก็บข้อมูลที่แข็งแกร่งและอ่อนแอ ฉันได้อ่านเอกสารประกอบและคำถามอื่น ๆ เกี่ยวกับ SO แล้ว แต่คำถามเหล่านี้เหมือนกันกับฉันโดยไม่มีข้อมูลเชิงลึกเพิ่มเติม ฉันอ่านเอกสารประกอบ: การเปลี่ยนไปใช้ ARC - อ้างอิงถึงข้อกำหนดของ iOS4 ในการเก็บรักษากำหนดและเผยแพร่ ซึ่งทำให้ฉันสับสน จากนั้นฉันมองเข้าไปใน Open U CS193p ซึ่งมันแยกความแข็งแกร่งและอ่อนแอ: แข็งแกร่ง : "เก็บสิ่งนี้ไว้ในกองจนกว่าฉันจะไม่ชี้ไปที่มันอีกต่อไป" อ่อนแอ : "ให้สิ่งนี้ตราบเท่าที่มีคนอื่นชี้ไปที่มันอย่างรุนแรง คำจำกัดความทั้งสองไม่เหมือนกัน = ถ้าตัวชี้ไม่ชี้ไปที่วัตถุอีกต่อไปแล้วปล่อยหน่วยความจำที่ถือวัตถุไว้หรือไม่? ฉันเข้าใจแนวคิดของพอยน์เตอร์ฮีปการจัดสรรหรือการจัดสรรหน่วยความจำ แต่อะไรคือความแตกต่างระหว่างความแข็งแกร่งและความอ่อนแอ

6
ถึง ARC หรือไม่ไปที่ ARC? ข้อดีข้อเสียคืออะไร? [ปิด]
ปิด . คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เน้นไปที่ปัญหาเดียวโดยแก้ไขโพสต์นี้เท่านั้น ปิดให้บริการใน6 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันยังไม่ได้ใช้ ARC เนื่องจากโค้ดส่วนใหญ่ในโปรเจ็กต์ที่ฉันกำลังดำเนินการอยู่นั้นเขียนขึ้นก่อน iOS 5.0 ฉันแค่สงสัยว่าความสะดวกสบายในการไม่เก็บ / ปล่อยด้วยตนเอง (และน่าจะเป็นรหัสที่น่าเชื่อถือกว่าซึ่งเป็นผลมาจาก) มีมากกว่า 'ค่าใช้จ่าย' ในการใช้ ARC หรือไม่? คุณมีประสบการณ์เกี่ยวกับ ARC อย่างไรและคุณจะแนะนำหรือไม่ ดังนั้น: ARC สามารถสร้างประโยชน์ให้กับโครงการได้มากแค่ไหน? ARC มีค่าใช้จ่ายเหมือนการเก็บขยะใน Java หรือไม่? คุณเคยใช้ ARC และถ้าเป็นเช่นนั้นคุณพบมันได้อย่างไร?

3
UIPopovercontroller dealloc ถึงในขณะที่ยังมองเห็นป๊อปโอเวอร์
ฉันขอรับรองว่าฉันได้มองหาคำตอบใน SO สำหรับคำถามของฉัน แต่ไม่มีคำตอบใดที่เป็นประโยชน์ ที่นี่ฉันมีรหัสง่ายๆที่ควรนำเสนอUIImagePickerControllerภายใน a UIPopoverController: -(void)takePicture:(id)sender{ UIImagePickerController *picker=[[UIImagePickerController alloc] init]; picker.delegate=self; picker.sourceType=UIImagePickerControllerSourceTypeCamera; picker.allowsEditing=YES; UIPopoverController *poc=[[UIPopoverController alloc] initWithContentViewController:picker]; [poc presentPopoverFromBarButtonItem:bbItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO]; } ตั้งแต่ครั้งแรกที่ฉัน[UIPopoveController dealloc]ไปถึงในขณะที่ ... เกิดข้อผิดพลาดและโปรแกรมขัดข้อง ฉันไม่ได้ทำการเก็บรักษาปล่อยหรือปล่อยอัตโนมัติตาม ARC มีการพิจารณาเป็นพิเศษUIPopoverControllersเมื่อได้รับประโยชน์จาก ARC หรือไม่?

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