静态分析和“创建规则”

问题描述:

我想在NSBezierPath上添加一个类别来为路径返回一个CGPathRef。由于这是一个核心基础对象,我不能自动释放它,并且方法的调用者负责释放它。通过将“复制”或“创建”作为方法名称的一部分,我认为我遵循苹果在这里设置的约定:https://developer.apple.com/library/mac/#documentation/CoreFOundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html静态分析和“创建规则”

但是,静态分析器将不会接受它,除非我更进一步,并且不仅包括创建/复制作为名称的一部分,而且实际上使用“复制”(或mutableCopy等)启动方法名称。

但是,这样做违反了命名类别方法的最佳做法,因为它们应该以避免命名冲突为前缀。

什么是实现以下所有的最好的方法:

  1. 在可可类
  2. 添加一个方法,一个类别...返回一个Core Foundation对象
  3. ...这将使没有分析仪中的警告
  4. ...并根据最佳实践命名?
+0

我相信你**可以** autorelease它,因为CFTypeRef是免费桥接与NSObject。 – 2012-08-03 12:35:48

像这样的东西你的意思是:

// 
// NSBezierPath+MCAdditions.h 
// 
// Created by Sean Patrick O'Brien on 4/1/08. 
// Copyright 2008 MolokoCacao. All rights reserved. 
// 

#import <Cocoa/Cocoa.h> 
#import "AnalyzerMacros.h" 

@interface NSBezierPath (MCAdditions) 

+ (NSBezierPath *)bezierPathWithCGPath:(CGPathRef)pathRef; 
- (CGPathRef)cgPath CF_RETURNS_RETAINED; 

- (NSBezierPath *)pathWithStrokeWidth:(CGFloat)strokeWidth; 

- (void)fillWithInnerShadow:(NSShadow *)shadow; 
- (void)drawBlurWithColor:(NSColor *)color radius:(CGFloat)radius; 

- (void)strokeInside; 
- (void)strokeInsideWithinRect:(NSRect)clipRect; 

@end 

这不是我的代码;我添加了CF_RETURNS_RETAINED来帮助静态分析仪。

对clang源注释的完整引用可用here

+0

谢谢,这样做!一个问题:如果一个已经用CF_RETURNS_RETAINED归因的metod暴露在框架的公共API中,并且该框架被用在使用ARC的项目中; ARC会使用CF_RETURNS_RETAINED属性来确定该对象是否被保留,而不管该方法是否被命名为“create”,“copy”等? – 2012-08-03 17:45:12

+1

@SveinHalvorHalvorsen对不起,我不知道答案...我不使用ARC。 – *foe 2012-08-03 17:46:13

+0

无论如何感谢:-) – 2012-08-03 17:48:21

澄清:CoreFoundation对象CFTypeRef的根类是免费桥接NSObject的。这意味着你可以自动释放CoreFoundation对象(在进行适当的强制转换之后)。

+0

问题:如果有问题的项目使用ARC,是否有返回一个CFTypeRef而没有保留+1的计数? – 2012-08-03 17:46:56

+1

@SveinHalvorHalvorsen no。 – 2012-08-03 18:19:16