Статический анализ и правило создания

Я хочу добавить категорию в 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. … и названы в соответствии с лучшими практиками?

person Svein Halvor Halvorsen    schedule 03.08.2012    source источник
comment
Я полагаю, что вы можете выпустить его автоматически, поскольку CFTypeRef является бесплатным мостом с NSObject.   -  person    schedule 03.08.2012


Ответы (2)


Что-то вроде этого вы имеете в виду:

//
//  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 доступна здесь.

person trojanfoe    schedule 03.08.2012
comment
Спасибо, это получилось! Вопрос: если метод, которому присвоен атрибут CF_RETURNS_RETAINED, выставлен в общедоступном API фреймворка, и этот фреймворк используется в проекте, использующем ARC; Будет ли ARC использовать атрибут CF_RETURNS_RETAINED, чтобы выяснить, что объект сохраняется, независимо от того, называется ли метод созданием, копированием и т. д.? - person Svein Halvor Halvorsen; 03.08.2012
comment
@SveinHalvorHalvorsen Извините, я не знаю ответа на этот вопрос... Я не использую ARC. - person trojanfoe; 03.08.2012

Для пояснения: корневой класс объектов CoreFoundation, CFTypeRef, является бесплатным мостом с NSObject. Это означает, что вы можете автоматически освобождать объекты CoreFoundation (после выполнения соответствующего приведения).

person Community    schedule 03.08.2012
comment
Вопрос: Если рассматриваемый проект использует ARC, можно ли вернуть CFTypeRef без сохранения счетчика +1? - person Svein Halvor Halvorsen; 03.08.2012