4

NSBezierPath にカテゴリを追加して、パスの CGPathRef を返したいと考えています。これはコア基盤オブジェクトであるため、自動解放することはできず、メソッドの呼び出し元が解放する必要があります。メソッド名の一部として「コピー」または「作成」を配置することで、Apple が設定した規則に従っていると思います: https://developer.apple.com/library/mac/#documentation/CoreFOundation/Conceptual/ CFMemoryMgmt/Concepts/Ownership.html

ただし、静的アナライザーは、さらに先に進み、名前の一部として create/copy を含めるだけでなく、実際にメソッド名を「copy」(または mutableCopy など) で開始しない限り、それを受け入れません。

ただし、名前の競合を避けるために接頭辞を付ける必要があるため、これはカテゴリ メソッドの名前付けのベスト プラクティスに違反しています。

次のすべてを達成するための最良の方法は何ですか?

  1. Cocoa クラスのカテゴリにメソッドを追加する
  2. … Core Foundation オブジェクトを返す
  3. … アナライザーで警告が表示されません
  4. …ベストプラクティスに従って名前が付けられていますか?
4

2 に答える 2

1

明確にするために: CoreFoundation オブジェクトのルート クラスである CFTypeRef は、NSObject でブリッジされた無料のクラスです。つまり、CoreFoundation オブジェクトを自動解放できます (適切なキャストを行った後)。

于 2012-08-03T12:44:20.573 に答える
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 に答える