gpt4 book ai didi

分配初始值设定项的 Cocoa 命名方案

转载 作者:行者123 更新时间:2023-12-03 16:14:16 24 4
gpt4 key购买 nike

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

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 属性的方法参数,不会给出静态分析器警告:

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

关于分配初始值设定项的 Cocoa 命名方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5650842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com