我认为在你的情况下没有与
ns_consumed
相对应的命名模式。命名模式主要受NeXTSTEP/Apple驱动,我想不到苹果框架中有与您所需语义相同的方法。
请注意,但是,
您可以告诉Xcode使用更高版本的Clang静态分析器,该分析器支持
ns_consumed
属性,该属性已发布
checker-254。
我正在使用checker-256(今天发布,但任何版本>= 254都应该可以),并尝试了以下操作:
#ifndef __has_feature
#define __has_feature(x) 0
#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
并且
#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]
+(id)className
初始化程序并不容易,因为它有50个子类。 - mxclFoo
是nil
,它就不能拥有所有权!对于实例方法,这是相当明显的;对于类方法,如果你在 iOS 6 中使用类但在 iOS 5 上运行,则可能会发生这种情况。这不是一件通常安全的事情;我会避免这样做。 - tc.