Я также думаю, что в вашем случае нет шаблона именования, соответствующего ns_consumed
. Шаблоны именования в значительной степени определяются NeXTSTEP / Apple, и я не могу придумать метод в средах Apple с той же семантикой, которую вы хотите.
Обратите внимание, однако, что вы можете указать Xcode использовать более свежую версию Clang Static Analyzer , которая поддерживает атрибут ns_consumed
, который был выпущен с checker-254 .
Я использую checker-256 (выпущен сегодня, но любая версия> = 254 должна работать), и я только что попробовал следующее:
// MyClass.h
#ifndef __has_feature // Optional.
#define __has_feature(x) 0 // Compatibility with non-clang compilers.
#endif
#ifndef NS_CONSUMED
#if __has_feature(attribute_ns_consumed)
#define NS_CONSUMED __attribute__((ns_consumed))
#else
#define NS_CONSUMED
#endif
#endif
@interface MyClass : NSObject {
@private
NSString *_string;
}
+ (MyClass *)myClassWithNewStringConsumed:(NSString *) NS_CONSUMED string NS_RETURNS_RETAINED;
+ (MyClass *)myClassWithNewString:(NSString *)string NS_RETURNS_RETAINED;
@end
и
// MyClass.m
#import "MyClass.h"
@implementation MyClass
+ (MyClass *)myClassWithNewStringConsumed:(NSString *)string {
MyClass *o = [MyClass new];
if (o) o->_string = string;
return o;
}
+ (MyClass *)myClassWithNewString:(NSString *)string {
MyClass *o = [MyClass new];
if (o) o->_string = string;
return o;
}
@end
Этот код выдает предупреждение статического анализатора о потенциальной утечке строки, хранящейся в s
:
// SomewhereElse.m
NSString *s = [[NSString alloc] initWithFormat:@"%d",
[[NSProcessInfo processInfo] processIdentifier]];
MyClass *o = [MyClass myClassWithNewString:s];
[o release];
, тогда как этот код, который использует параметр метода с атрибутом ns_consumed
, не выдает предупреждение статического анализатора:
// SomewhereElse.m
NSString *s = [[NSString alloc] initWithFormat:@"%d",
[[NSProcessInfo processInfo] processIdentifier]];
MyClass *o = [MyClass myClassWithNewStringConsumed:s];
[o release];