سؤال

أتساءل عما إذا كان من الممكن أن يكون لديك شيء مشابه ل ActionScript 3 Dictionary كائن مع مفاتيح ضعيفة في الهدف - ج. أريد أن أكون قادرا على "إرفاق" مثيل لفئة إلى مثيلات تعسفية أخرى.

مثال؛

MetaData *meta = [MetaData metaDataForObject:someObject];
meta.whatever = foo;

و لاحقا:

foo = [MetaData metaDataForObject:someObject].whatever;
[foo doStuff];

الجزء الصعب هو أنه بعد الاعتراض المشار إليه someObject هل deallec'd، أريد الكائن المشار إليه meta سيتم إطلاق سراحه (و Deallec'd، على افتراض عدم الاحتفاظ به رمز العميل).

المستطاع؟ ألقيت نظرة على +[NSValue valueWithNonretainedObject:] لكنني لست متأكدا مما إذا كان هذا هو ما أريد لأنه عندما استفسر لاحقا -[NSValue nonretainedObjectValue] يبدو أنني سأحصل على مؤشر إلى القمامة (كيف يمكن أن يكون NSValue صفر للمؤشر عندما يكون الكائن deallec'd؟).

شكرا،

بنيامين

التحديث 23 سبتمبر 2011: أعتقد أن الطريقة للقيام بذلك مع objc_setAssociatedObject والوظائف ذات الصلة. انظر مرجع وقت تشغيل الهدف.

هل كانت مفيدة؟

المحلول

يبدو أن ما تطلبه هو القدرة على الرد على متغير مثيل ضعيف المرجع الذي يتم إلغاؤه. يمكنك بالتأكيد استخدام __weak السمة (مع تمكين GC) لإنشاء مرجع ضعيف، ولكن لا توجد آلية مدمجة للقبض عليها عندما تكون هذه السمة صفرية بعد أن يتم تقليل هدفها.

إذا كنت تريد حقا هذا، فإن أفضل رهان هو استخدام نفس الآلية لاستخدامات مراقبة القيمة الرئيسية ل Apple: طريقة Swizzling. الحفاظ على طاولة عالمية (مثل NSHashMap أو NSMapTable) تعيين الكائنات إلى كائنات البيانات الوصفية المقابلة، ثم استبدال dealloc/finalize الأساليب الموجودة في فئة الكائن التي تعلق بها مع الإصدارات التي تبحث عن كائن البيانات الوصفية المقابلة في الجدول وإرسال رسالة إلى أسفل. (تحتاج أيضا إلى جدول آخر أو اثنين من فصول الخرائط إلى الأصل dealloc/finalize طرق.) jrswizzle. يوفر واجهة جميلة تساور.

إذا كنت تريد أن تكون خيالي حقا، بدلا من الكتابة dealloc/finalize لجميع كائنات الطبقة المستهدفة، يمكنك إنشاء فئة وكيل وإعادة تعيين isa مؤشر فقط هذه الفئة، بحيث لا يوجد أي أداء يضرب في إلغاء تخصيص الكائنات التي لا تشاهدها. (KVO يفعل هذا أيضا.)

نصائح أخرى

هل تبحث عن nshasmap. ربما؟ انها لا تصف المراجع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top