Sobes.tech
Middle

Чӣ гуна нигоҳдории тамошоҳо, ки навъи ишора мебошанд?

sobes.tech AI

Ҷавоб аз AI

ویوها (UIView و زیرکلاس‌های آن) در iOS کلاس هستند، بنابراین نوع ارجاعی دارند. ذخیره ارجاعات به آن‌ها با استفاده از مکانیزم‌های زیر انجام می‌شود:

  1. ارجاعات قوی (Strong References):

    • به طور پیش‌فرض، اگر ویژگی برای UIView بدون مشخص‌کننده weak یا unowned اعلام کنید، این یک ارجاع قوی ایجاد می‌کند.
    • ارجاع قوی شمارنده ارجاع‌های شیء را افزایش می‌دهد. شیء تا زمانی که حداقل یک ارجاع قوی به آن وجود داشته باشد، از حافظه حذف نخواهد شد.
    • این روش استاندارد برای نگهداری ویوها است، زمانی که نیاز است در حافظه باقی بمانند و در دسترس باشند.
    //ارجاع قوی
    var myView: UIView = UIView()
    
  2. ارجاعات ضعیف (Weak References):

    • با استفاده از کلمه کلیدی weak اعلام می‌شوند.
    • ارجاع ضعیف تعداد ارجاعات شیء را افزایش نمی‌دهد.
    • ارجاعات ضعیف از حذف شیء از حافظه جلوگیری نمی‌کنند، اگر ارجاعات قوی به آن باقی نمانده باشد.
    • برای جلوگیری از حلقه‌های ارجاع قوی استفاده می‌شود، وضعیت معمول رابطه والد-فرزند است، جایی که والد ارجاع قوی به فرزند دارد، و فرزند ممکن است ارجاعی به والد داشته باشد. در این حالت، ارجاع بازگشتی به والد باید ضعیف باشد.
    • ارجاعات ضعیف باید اختیاری (Optional) باشند، چون ممکن است شیء حذف شود و ارجاع به آن nil شود.
    weak var parentView: UIView?
    
  3. ارجاعات بدون مالک (Unowned References):

    • با استفاده از کلمه کلیدی unowned اعلام می‌شوند.
    • همانند ارجاعات ضعیف، شمارنده ارجاع را افزایش نمی‌دهند.
    • تفاوت: بر خلاف ارجاعات ضعیف، ارجاعات بدون مالک اختیاری نیستند. فرض بر این است که شیء حداقل تا زمانی که ارجاع به آن وجود دارد، زنده است. اگر پس از آزادسازی شیء، به آن از طریق ارجاع بدون مالک دسترسی پیدا کنید، برنامه کرش می‌کند.
    • زمانی استفاده می‌شود که مطمئن باشید چرخه عمر ارجاع، از چرخه عمر شیء که به آن اشاره دارد، تجاوز نمی‌کند. در زمینه ویوها، این کمتر رایج است نسبت به weak.
    //کمتر رایج برای ویوها، اما ممکن است
    unowned var childView: UIView
    
  4. آرایه‌ها و مجموعه‌ها:

    • نگهداری ارجاعات به ویوها در آرایه‌ها (Array)، دیکشنری‌ها (Dictionary) یا مجموعه‌ها (Set) نیز به طور پیش‌فرض، ارجاعات قوی به عناصر مجموعه ایجاد می‌کند.
    var subviews: [UIView] = []
    

انتخاب بین ارجاع قوی، ضعیف یا بدون مالک، بستگی به سناریوی خاص استفاده و مدیریت چرخه عمر اشیاء دارد تا از نشت حافظه جلوگیری شود. در SwiftUI، مفاهیم مدیریت چرخه عمر ویوها کمی متفاوت است، اما در زمینه UIKit، این مکانیزم‌ها همچنان روش اصلی نگهداری ارجاعات هستند.