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.mNsstring *s = [[Nsstring alloc] initWithFormat:@"%d",[[nsprocessInfo processInfo] processIDentifIEr]];MyClass *o = [MyClass myClassWithNewString:s];[o release];
而这个使用带有ns_consumed属性的method参数的代码不会给出静态分析器警告:
// SomewhereElse.mNsstring *s = [[Nsstring alloc] initWithFormat:@"%d",[[nsprocessInfo processInfo] processIDentifIEr]];MyClass *o = [MyClass myClassWithNewStringConsumed:s];[o release];@H_404_2@ 总结
以上是内存溢出为你收集整理的用于分配初始化程序的Cocoa命名方案全部内容,希望文章能够帮你解决用于分配初始化程序的Cocoa命名方案所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)