سؤال

تشغيل المحلل الثابت على هذا الرمز:

- (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 لتمكينه.

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