Согласно Правиле создания Я создал свой собственный "конструктор" - CFStringCreateFromGoString
.Он содержит «Создать» в своем названии.Я ожидаю, что если я вызову CFStringCreateFromGoString
, то я имею возвращенный объект.
Но согласно статическому анализатору LLVM это не совсем так, и в некоторых случаях я получаю предупреждение Incorrect decrement of the reference count of an object that is not owned at this point by the caller
- см. 1.h
.А в других случаях, когда нет предупреждения - см. 2.h
.
С common.h
:
CFStringRef CFStringCreateFromGoString(_GoString_ str) {
return CFStringCreateWithBytes(NULL, (UInt8*)_GoStringPtr(str), (CFIndex)_GoStringLen(str), kCFStringEncodingUTF8, false);
}
С 1.h
:
CGRect _GetTextLineGeometry(CGContextRef context, _GoString_ str, CTFontRef font) {
CFStringRef _str = CFStringCreateFromGoString(str);
CGRect r = GetTextLineGeometry(context, _str, font); // no warning if I remove this line
CFRelease(_str); // warning here
return r;
}
С 2.h
:
CTFontRef _CreateFontFromFile(_GoString_ path, struct FontSpec spec) {
CFStringRef _path = CFStringCreateFromGoString(path);
CTFontRef r = CreateFontFromFile(_path, spec);
CFRelease(_path); // no warning
return r;
}
Может кто-нибудь объяснить разницу между 1.h
и 2.h
?
Обновление 0
Спасибо за комментарий,Проблема была в GetTextLineGeometry
- эта функция по ошибке выполнила CFRelease(_str)
.Теперь у меня нет предупреждений.Но я не понимаю, почему предупреждение было в _GetTextLineGeometry
вместо GetTextLineGeometry
?