4

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

但是,除非我更进一步,否则静态分析器不会接受它,而且——不仅包括 create/copy 作为名称的一部分,而且——实际上以“copy”(或 mutableCopy 等)开头的方法名称。

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

实现以下所有目标的最佳方法是什么:

  1. 在 Cocoa 类的类别上添加方法
  2. …返回一个核心基础对象
  3. …这不会在分析器中发出警告
  4. …并根据最佳实践命名?
4

2 回答 2

1

你的意思是这样的:

//
//  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 源注释的完整参考。

于 2012-08-03T12:33:51.967 回答
1

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

于 2012-08-03T12:44:20.573 回答