簡體   English   中英

CGImageRef屬性保留或不保留

[英]CGImageRef property retain or not retain

我有一個關於如何處理CGImageRef作為類的綜合屬性的問題。 如果我定義CGImageRef

@property (nonatomic, retain) CGImageRef image;

然后編譯器抱怨這里不能使用“retain”。 如果我省略保留,那么我假設使用“assign”,我需要在設置屬性時自行保留:

self.image = CGImageRetain ( cgimage );

然后我在運行Analyze時收到“潛在泄漏”警告。 我能安全地忽略這個警告嗎? 或者,即使在屬性定義中沒有指定“retain”,合成代碼仍會執行隱式CGRetain嗎?

您要做的是向屬性添加注釋,該類型確實可以保留。

將屬性聲明更改為

@property (nonatomic, retain) CGImageRef image __attribute__((NSObject));

請注意,這只會為您生成getter和setter,實例變量本身不受 ARC控制。 具體來說,這意味着您必須在dealloc釋放它,並且在直接分配給實例變量時需要使用正確的保留和釋放。


更好的方法可能是使用typedef

typedef CGImageRef CGImageObject __attribute__((NSObject));
@property (nonatomic, retain) CGImageObject image;

在這種情況下,實例變量由ARC控制,所以你絕不能釋放它dealloc ,並以實例變量直接分配是由ARC處理為好。


供參考,參見規范 ,特別是4.1.1節

__attribute__((NSObject))應用於不屬於可保留對象指針類型的屬性具有與ARC之外相同的行為:它要求屬性類型為某種指針並允許使用除assign之外的修飾符。 這些修飾符只影響合成的吸氣劑和固定劑; 對ivar的直接訪問(即使合成)仍然具有原始語義,並且在重新分配期間不會自動釋放ivar中的值。

第3節

可保留對象指針(或“可保留指針”)是可保持對象指針類型的值(“可保留類型”)。 有三種可保留的對象指針類型:

  • 塊指針(通過將插入符號( ^ )聲明符sigil應用於函數類型而形成)
  • Objective-C對象指針( idClassNSFoo*等)
  • typedef標有__attribute__((NSObject))

我不喜歡在編譯時指示編譯器。 我認為這很難看。 我自己覆蓋了這些方法。

@interface MyClass : NSObject {
    CGImageRef _image;
}
@property (nonatomic, assign) CGImageRef image;
@end

@implementation MyClass
- (void)setImage:(CGImageRef)i {
    if(_image != i) {
        CGImageRelease(_image);
        _image = CGImageRetain(i);
    }
}

- (CGImageRef)image {
    return _image;
}
@end

這個怎么樣?

@property (nonatomic, setter=setImage:) CGImageRef image;

(void)setImage:(CGImageRef)image {
    if (_image != image) {
        CGImageRelease(_image);
        _image = CGImageRetain(image);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM