用于分配初始化程序的Cocoa命名方案

出于某种原因,我认为这在内存管理命名规则下是有效的:

Bar *bar = [Bar new];
[Foo fooWithNewBar:bar];
// no need to release bar,foo took ownership

但是现在我正在进行静态分析,它认为每次我这样做都会有潜在的泄漏.

我看到有__attribute((ns_consumed))我可以在fooWithNewBar声明中使用它.但是Xcode 4.0.1的Clang还不支持这个属性.

那么,没有这样的命名模式?

解决方法

我还认为在你的情况下没有与ns_consumed相对应的命名模式.命名模式很大程度上是由NeXTSTEP / Apple驱动的,我无法想象Apple框架中的方法与您想要的语义相同.

但请注意,you can tell Xcode to use a more recent version of Clang Static Analyser支持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属性的method参数的代码不会给出静态分析器警告:

// SomewhereElse.m
NSString *s = [[NSString alloc] initWithFormat:@"%d",[[NSProcessInfo processInfo] processIdentifier]];
MyClass *o = [MyClass myClassWithNewStringConsumed:s];
[o release];

相关文章

摘要: 文章工具 收藏 投票评分 发表评论 复制链接 Swing 是设计桌面应用程序的一个功能非常强大工具包,...
苹果的开发:   我对于Linux/Unix的开发也是一窍不通,只知道可以用Java.不过接触了苹果过后,确实发现,世...
Mac OS线程开发包介绍   Mac OS X提供了到几套API用于创建程序级别的线程。从行为上来看,这些API创建...
最近非常关心Mac OS X上程序的开发,所以一直也在查找有什么语言用什么库来开发程序,在Apple的开发网站...
Ellena Ashley The Dragon Rock This story begins with Once Upon A Time, because the best stories ...
起因:   苹果公司在我们四川大学建立了个苹果实验室.正巧的是,上我们体系结构的老师居然就是这个实验室...