مجموعة القمامة من كائنات الأساس الأساسية
-
21-09-2019 - |
سؤال
تشغيل المحلل الثابت على هذا الرمز:
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
return [(id)matchStyle autorelease];
}
ينتج عن التحذير التالي:
اتصل إلى وظيفة "cfpreferencescopyappvalue" بإرجاع كائن الأساس الأساسي مع عدد +1 الاحتفاظ (مرجع امتلاك). لا يتم جمع كائنات الأساس الأساسية تلقائيًا.
هل هذا تحذير يجب أن أصلحه بشيء قبيح مثل ذلك:
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
id nsMatchStyle = [(id)matchStyle copy];
if (matchStyle) {
CFRelease(matchStyle);
}
return [nsMatchStyle autorelease];
}
أم أن هذا مجرد إيجابية خاطئة ، بالنظر إلى أن الكائن النسخ مجاني مجاني؟
المحلول
جرب هذا:
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
return [(id)CFMakeCollectable(matchStyle) autorelease];
}
بدون ال CFMakeCollectable
, ، هذا سوف يتسرب في GC ، لأن أ CFRetain
يختلف عن OBJC -retain
. أ CFRetain
يعطل جمع القمامة لهذا الكائن ، ويحتاج CFMakeCollectable
لتمكينه.
لا تنتمي إلى StackOverflow