2010-03-21 53 views
7

我在objc中使用C結構,並且我創建了一個組裝Cocoa API的結構的函數。事情是,這個結構不像NSRect或NSPoint這個結構包objc對象洙我看到這裏可能的內存泄漏。我是否需要提供一個函數來釋放結構?使用包含ObjC對象的C Structs?

我沒有創建一個ISKNewsCategory類,因爲沒有任何行爲,但是您認爲這是一個好方法嗎?或者我應該定義類,即使doe也不會有行爲?

typedef struct ISK_NewsCategory { 
    NSString *name; 
    NSString *code 
} ISKNewsCategory; 

NS_INLINE ISKNewsCategory ISKMakeNewsCategory(NSString *name, NSString *code) { 
    ISKNewsCategory category; 
    category.name = [name retain]; 
    category.code = [code retain]; 
    return category; 
} 

回答

8

一般來說,創建一個簡單的容器類會更好。這樣所有的內存管理都很簡單,你可以在標準的Cocoa容器類中使用這個對象,而不需要在NSValue或其他任何地方包裝結構。

以這種方式使用結構的唯一方式是可以接受的是,如果您的對象開銷可能會成爲問題,那麼對性能至關重要的代碼是非常重要的。

@interface ISKNewsCategory : NSObject 
{ 
    NSString *name; 
    NSString *code; 
} 
@property (copy) NSString *name; 
@property (copy) NSString *code; 
@end 

@implementation ISKNewsCategory 
@synthesize name,code; 
- (void)dealloc 
{ 
    self.name = nil; 
    self.code = nil; 
    [super dealloc]; 
} 
@end 
+1

爲了擴展你的「唯一時間」:迭代結構比迭代類快2-4倍。隨着項目越來越大,這成爲一個真正的問題(當前項目頻繁迭代數以萬計的項目,必須實時運行)。 – Adam 2014-02-11 16:53:55

2

任何你保留的你必須釋放。但是,沒有什麼說你必須保留它們。如果結構是「擁有」物體,那麼是的,你應該保留它們,然後你必須釋放它們。但是,如果對象保留在其他位置,則可能需要在不保留對象的情況下考慮弱引用。

2

我討厭創建沒有行爲的類。 :/這是Objective-C的一個令人傷心的方面:類是冗長的。

您必須記住,C中的結構每次被傳遞時都被複制。因此,如果你的結構保留了它們的對象,並且你把它們給了別人,那麼你最終會自動得到對象中錯誤的引用計數。

如果你打算傳遞你的東西,我認爲你應該把它做成一個完整的類。如果你不這樣做,一個簡單的結構就可以。

由於需要「析構函數」,你應該有一個。你應該總是有一個,如果有清理工作要做你的結構。

+0

實際上,複製不會因爲只複製指針而直接傳遞一個對象而導致任何額外的保留。 – cobbal 2010-03-21 22:02:12

+0

@cobbal:這就是我的意思。如果你周圍傳遞你的結構,那麼指向這些對象的指針將被複制,並且如果你打算爲它們所在的每個結構保留它們,你就不能這麼做。 – zneak 2010-03-21 22:07:09

0

我希望這個解決方案對您有所幫助。

typedef struct ISK_NewsCategory { 
    NSString *name; 
    NSString *code; 
} ISKNewsCategory; 

NS_INLINE ISKNewsCategory ISKMakeNewsCategory(NSString *inName, NSString *inCode) { 

    ISKNewsCategory category; 

    [category.name autorelease]; 
    category.name = [inName retain]; 

    [category.code autorelease]; 
    category.code = [inCode retain]; 

    return category; 
}