0Pricing
Swift Academy · درس

دورات الاحتفاظ وكسرها باستخدام weak وunowned

اكتشف دورات الاحتفاظ بين الكائنات وClosures، ثم اكسرها بأمان باستخدام مراجع weak و unowned .

دورات الاحتفاظ وكسرها باستخدام weak وunowned درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 3 دروس في المجموع.

ما دورة الاحتفاظ؟

تحدث دورة الاحتفاظ عندما تحتفظ الكائنات (أو closures) بمراجع strong إلى بعضها، فلا يصل عدد المراجع في ARC إلى الصفر أبداً. اكسر الدورات باستخدام weak أو unowned.

دورة كائن ↔ كائن

يؤدي وجود مرجعين strong في الاتجاهين إلى تسرّب للذاكرة؛ فلا يستطيع أي من الكائنين الوصول إلى الصفر.

final class Owner {
    var gadget: Gadget?
    deinit { print("Owner deinit") }
}
final class Gadget {
    var owner: Owner?
    deinit { print("Gadget deinit") }
}
// Strong ⇄ strong (cycle)
var o: Owner? = Owner()
var g: Gadget? = Gadget()
o!.gadget = g
g!.owner = o
o = nil      // no deinit
g = nil      // still no deinit (leak)

الكسر باستخدام weak

اجعل أحد الطرفين weak (وغالباً ما يكون المرجع العكسي مثل delegate/owner) للسماح لـ ARC بتحرير الكائنين.

final class Owner2 {
    var gadget: Gadget2?
    deinit { print("Owner2 deinit") }
}
final class Gadget2 {
    weak var owner: Owner2?   // weak breaks cycle; becomes nil automatically
    deinit { print("Gadget2 deinit") }
}
var o2: Owner2? = Owner2()
var g2: Gadget2? = Gadget2()
o2!.gadget = g2
g2!.owner = o2
o2 = nil     // Owner2 deinit
g2 = nil     // Gadget2 deinit

دورة closure (self من النوع strong)

تلتقط closures المتغيرات بقوة strong افتراضياً. وإذا كان الكائن يمتلك الـ closure أيضاً، ينشأ عن ذلك دورة.

final class TimerClient {
    var tick: (() -> Void)?
    deinit { print("TimerClient deinit") }
    func start() {
        // BAD: closure strongly captures self; self keeps tick strongly
        tick = {
            print("tick from", self) // strong capture of self
        }
    }
}
var c: TimerClient? = TimerClient()
c!.start()
c = nil   // no deinit — closure holds self strongly

الكسر باستخدام قوائم الالتقاط

استخدم [weak self] (اختياري) لتنظيف آمن؛ واستخدم [unowned self] فقط إذا كان self مضمون البقاء على قيد الحياة عند تنفيذ الـ closure.

final class TimerClient2 {
    var tick: (() -> Void)?
    deinit { print("TimerClient2 deinit") }
    func start() {
        // Use [weak self] when self can go away before tick runs
        tick = { [weak self] in
            guard let self = self else { return } // safe unwrap
            print("tick from", self)
        }
        // Alternative when lifetime is guaranteed: [unowned self]
        // tick = { [unowned self] in print("tick from", self) }
    }
}
var c2: TimerClient2? = TimerClient2()
c2!.start()
c2 = nil   // deinit now prints — no cycle

قائمة التحقق

قائمة التحقق:

  • هل توجد مراجع متبادلة؟ اجعل أحد الطرفين weak (مثل delegate).
  • هل تُخزَّن closures في نوع ما؟ استخدم [weak self] والتقط self بأمان.
  • استخدم [unowned self] فقط عند ضمان دورة الحياة؛ وإلا فقد يتسبب ذلك في تعطل التطبيق.

weak مقابل unowned في closures

تحقق سريع: أي قائمة التقاط أكثر أماناً عندما يُحتمل تحرير الكائن؟

مراجعة

مراجعة: حدّد الدورات في الكائنات وclosures. واكسرها باستخدام weak أو unowned بما يناسب الحالة؛ وفضّل weak عند الشك.

الأسئلة الشائعة

هل درس «دورات الاحتفاظ وكسرها باستخدام weak وunowned» مجاني؟

نعم — نص درس «دورات الاحتفاظ وكسرها باستخدام weak وunowned» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 3 دروس في المجموع.

ماذا ستتعلم في «دورات الاحتفاظ وكسرها باستخدام weak وunowned»؟

اكتشف دورات الاحتفاظ بين الكائنات وClosures، ثم اكسرها بأمان باستخدام مراجع weak و unowned . تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.

كم من الوقت يستغرق درس «دورات الاحتفاظ وكسرها باستخدام weak وunowned»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات ARC: ‏strong وweak وunowned
  2. دورات الاحتفاظ وكسرها باستخدام weak وunowned
  3. أنواع القيم لتقليل المشاركة
← العودة إلى Swift Academy