محتويات الدورة

iOS / Swift / أنظمة ميسرة وأدلة الأهداف / الدرس 14

Instruments وARC وأدلة الأداء

حدّد كلفة العرض أو الذاكرة الفعلية وافهم احتفاظ الإغلاقات قبل اقتراح التحسينات.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • حدّد تفاعلا قابلا للقياس
  • ميّز الحساب والتخطيط والرسم والاحتفاظ
  • أزل التحويل المتكرر عند الحد الصحيح

حدّد تفاعلا قابلا للقياس

يبدأ بحث الأداء بمهمة تتكرر: تمرير قائمة معينة أو فتح تفاصيل أو ترشيح بيانات ممثلة أو العودة من محرر. سجّل البناء والعتاد والنظام وحجم البيانات والمقياس الموافق للشكوى. قد يشوه تشخيص debug ومعاينة سطح المكتب تجربة إصدار الهاتف. استخدم Instruments أو أدوات Xcode المناسبة ببيئة هدف مصرح بها وقارن عينات متكررة. ليست مرة سريعة أو عملية حساب صغيرة دليلا لتحسين عام.

ميّز الحساب والتخطيط والرسم والاحتفاظ

قد ينتج الحساب المكلف في body وفك الصور المتكرر والتخطيط المعقد والنماذج المحتفظ بها أعراضا مختلفة. قِس المرحلة ولا تفترض أن كل تقطع كثرة تحديث SwiftUI. لا يقلل عدد body بالضرورة مؤثرا بصريا مكلفا، ولا تسرّع المراجع الضعيفة مرشحا ضعيفا. افحص نمو الذاكرة عبر الفتح والإغلاق مستقلا عن تخصيص مخزن مرة واحدة. حدّد المالك الذي يبقي الكائن حيا وهل عمره مقصود. يختلف استقرار المخزن من النمو المستمر.

أزل التحويل المتكرر عند الحد الصحيح

ينشئ المقتطف الأول ملخصات عرض من لقطة مدخل ثابتة. يبقي تكوين النص خارج body لكل صف ويجعل العقد قابلا للاختبار. أعد الحساب في النموذج عند تغير المدخلات لا كل عرض غير مرتبط. يحتاج التخزين إلى مفتاح صحيح؛ فثبات العدد لا يعني ثبات العناوين أو المقاعد. لا تحفظ إسقاطات كبيرة دون سياسة عمر. الربط الصغير مثال صحة فقط، ويحتاج ادعاء التحسين إلى قياس بيانات ممثلة.

swift مقتطف توضيحي من Swift أو SwiftUI؛ يتطلب بيئة الأدوات المبيّنة.
struct SummaryInput {
    let title: String
    let seats: Int
}
func summaryLines(_ items: [SummaryInput]) -> [String] {
    items.map { "\($0.title): \($0.seats)" }
}
print(summaryLines([SummaryInput(title: "Maps", seats: 3)]))
الناتج المتوقع
["Maps: 3"]

الناتج متوقع من ربط نقي، وليس معيار أداء ولا يثبت كلفة عرض الجهاز.

افهم الدورات القوية في الإغلاقات المحفوظة

تحرر ARC الكائن حين لا تبقيه ملكية قوية حيا. إذا حفظ كائن إغلاقا يلتقطه بقوة فقد تحتفظ دورة بكليهما. يستخدم المقتطف الثاني التقاطا ضعيفا لرد لا ينبغي أن يملك أباه. قد يصبح المرجع الضعيف nil فيتوقف الرد عمدا عند غياب المالك. لا تستبدل كل التقاط آليا بـ weak self؛ فقد تحتاج عملية عمرا قويا محدودا، وتتطلب unowned إثباتا أقوى لبقاء الكائن طوال الوصول.

swift مقتطف توضيحي من Swift أو SwiftUI؛ يتطلب بيئة الأدوات المبيّنة.
final class RefreshOwner {
    private(set) var updates = 0
    var onRefresh: (() -> Void)?
    func configure() {
        onRefresh = { [weak self] in self?.updates += 1 }
    }
}
let owner = RefreshOwner()
owner.configure()
owner.onRefresh?()
print(owner.updates)
الناتج المتوقع
1

لا يملك الرد المحفوظ RefreshOwner بقوة. لا يقيس المثال توقيت التحرير أو يثبت غياب كل مرجع محتفظ.

افصل العمر غير المتزامن والصور

قد تبقي Task محفوظة القيم الملتقطة حتى الاكتمال رغم اختفاء الشاشة. لذلك تدخل الملكية والإلغاء في تشخيص الذاكرة مع بقاء الإلغاء تعاونيا. وللصور ميزانية مستقلة؛ فقد يتوسع الملف المضغوط إلى مخزن كبير ويهدر استخدام الدقة الكاملة للمصغرات الذاكرة. راجع التصغير وسياسة المخزن بواجهات الهدف الموثقة. ولا تفرض أحجاما عشوائية أو تحذف حالة مفيدة لتصغير رسم ذاكرة واحد. احفظ المهمة والصحة.

قارن الدليل بعد تغيير مركز واحد

غيّر سببا مقاسا واحدا وأعد الحمل وقارن التأخر والإطارات والذاكرة ذات الصلة. تحقق من عدم كسر الهوية والإلغاء والترجمة والإتاحة. ولعيب الاحتفاظ كرر فتح الميزة وإغلاقها وافحص اختفاء المالك المقصود لا طباعة فقط. اربط التتبع بالأثر والهدف المقاسين. لم تطلق الدورة Instruments أو تقس عملية Apple أو تنفذ أمثلة ARC؛ بل تعلّم دقة الادعاء حين يوجد دليل مصرح به.

الأخطاء الشائعة وإصلاحها

تضاف الالتقاطات الضعيفة كتحسين عام

لماذا يحدث؟
حلت قاعدة آلية محل تصميم العمر.
كيف تصلحه؟
افحص شبكة الملكية والعمر المطلوب للرد.
كيف تتجنب تكراره؟
اختبر السلوك عند اختفاء المالك.

يعيد مخزن الإسقاط بيانات خاطئة بالطول نفسه

لماذا يحدث؟
أغفل المفتاح المحتوى أو المرشح.
كيف تصلحه؟
أبطل بكل المدخلات ذات الصلة لدى مالك واحد.
كيف تتجنب تكراره؟
أدرج عينات استبدال متساوية العدد.

يُبلغ عن توقيت debug كأداء إصدار

لماذا يحدث؟
تُجاهلت كلفة البناء والقياس.
كيف تصلحه؟
قِس إعداد الأثر المعني على أهداف ممثلة.
كيف تتجنب تكراره؟
سجّل الحمل والبيئة والبناء مع المقاييس.

اختبر فهمك

1. هل تثبت weak self عدم تسرب الكائن؟

اعرض الحل المشروح

لا. تزيل حافة قوية محتملة واحدة. قد تحتفظ إغلاقات أو مهام أو اشتراكات أو مخازن أو ملاك آخرون بالكائن. افحص الشبكة والعمر المتكرر واحفظ الملكية القوية حيث تلزم العملية.

2. ماذا تفعل قبل استبدال List القياسية بسبب الأداء؟

اعرض الحل المشروح

التقط الحمل وحدّد هل يغلب حساب الصف أو الصور أو التخطيط أو الرسم أو الاحتفاظ. أصلح السبب المقاس وقارن. قد تضيف حاوية مخصصة تعقيد إتاحة وعمر دون تحسين الاختناق الحقيقي.

أهم ما تعلمته

  • حدّد تفاعلا قابلا للقياس
  • قارن الدليل بعد تغيير مركز واحد

المراجع الرسمية