2014-07-16 38 views
0

假設我有其是C結構的性質的對象(爲說與現有軟件的向後兼容)暴露結構屬性的地址是否是一種好的做法?

typedef結構{
...
}圖像;

@property(assign)image img;

現在假設某些函數func(image * img)需要img的地址。

我有兩個替代方案(即我可以看到):

1)寫在它返回IMG 的地址類的吸氣劑的方法,該地址傳遞給FUNC()

2 )複製一個結構體,如
image img0 = object.img;
func(& img0);

現在(1)更快,而(2)更「安全」,這意味着func不會搞亂對象數據。 有沒有這樣做的「標準」方式,或者它基本上取決於我?

回答

0

這基本上取決於你。

請注意,在(2)中,如果func()應該修改結構,那些修改將不會影響object.img,除非您將修改的結構體分配回該屬性。

如果func()不是修改結構,你可以聲明它採取一個const指針,你可以使一個方法返回一個const指針。這不會讓你打開封裝違規。儘管如此,它似乎是一種代碼味道給我。

一種不同的方法是創建一個方法來接受一個塊來操作struct。該塊會將一個(非const)指針指向該結構作爲參數。該塊可以通過該指針修改結構。但是,作爲設計合同的一部分,它不能在塊完成後保存該指針以供使用。這允許對象以不違反封裝的方式臨時直接訪問該結構。對象總是有辦法知道所做的修改,因爲客戶端必須調用一個方法。

爲了絕對安全,調用者保存指向結構的指針,該方法可以創建臨時副本,將指針傳遞給副本,在塊返回後驗證結構內容(如果有必要),如果有效,將其分配回其內部存儲。

1

簡單的方式來聲明和訪問結構在Objective-C

typedef struct Books 
{ 
    NSString *title; 
    NSString *author; 
    NSString *subject; 
    int book_id; 
}BookStructure; 

//Now create property of BOOK1 
@property(assign)BookStructure BookObj; 
//Now setting value in structure variavble 
int main() 
{ 

    self.BookObj.title = @"Objective-C Programming"; 
return 0; 
} 

請參閱此瞭解更多詳情tutorial: -

+0

該「教程」中的任何內容都不會將結構作爲對象的屬性進行尋址。 –

相關問題