2012-05-04 16 views
4

我有CGSize的屬性:點語法轉換爲托架的語法上的結構

@property (nonatomic) CGSize descriptionSize; 

'

@synthesize descriptionSize = _descriptionSize; 

我可以通過點語法訪問高度:

self.descriptionSize.height = 35; 

但這是如何與括號語法工作?

[self setDescriptionSize:???]; 

看着我很笨,但我不明白。提前致謝!

+0

我會嘗試'[[self descriptionSize] setHeight:35]' – pawelropa

+0

@mttrb ...可以不發送'setHeight'消息給它。 – fzwo

+1

你可以說'self.descriptionSize = CGSizeMake(self.descriptionSize.width,35)'。 –

回答

6

這是屬性點表示法的缺陷之一:self.descriptionSize.height中的那兩個點看起來相同,但意味着非常不同的東西。第一個是一個屬性訪問器,它映射到「get descriptionSize」方法,但第二個是舊式結構引用。第一個點返回一個CGSize 標量,而不是指向對象中大小值的指針。當第二個點在返回的CGSize中設置高度時,它將在堆棧上設置一個值,而不是更改對象中的值。這是你如何要做到這一點:

CGSize size = self.descriptionSize; 
size.height = 35; 
self.descriptionSize = size; 

...或不 性質 點符號的等價物:

+1

+1,但是,你意思是「沒有點符號的等價物」 - 屬性與手動訪問器以及方括號與點符號是兩個完全獨立的選擇。 – andyvn22

+0

另外,如果你想要一行,它有'[self setDescriptionSize:CGMakeSize([self descriptionSize ] .width,35)];' – andyvn22

+1

我很確定這兩者之間的唯一區別就是語法 - 據我所知,它們應該編譯成完全相同的代碼 – davehayden

5

descriptionSize實施將返回CGSize結構的副本,所以你不能直接工作,並希望它會工作。你需要做的是讓整個CGSize結構中,修改它,然後將它傳遞迴:

CGSize size = [self descriptionSize]; 
size.height = 35; 
[self setDescriptionSize:size]; 

但是給你工作的self屬性和屬性不是對象,這就需要內存管理,修改大小的最有效的方法是:

_descriptionSize.height = 35; 

,但是你會使用前者的getter/setter方法,如果:

  1. 對象不是self
  2. 您已經手動編寫了setter方法來做一些改變大小的副作用(例如使視圖的位無效以便自動更新視圖)。
2

點語法可能意味着兩種不同的東西:或是結構引用(CGSize是C結構體)或一個Objective-C消息發送。

從理論上講,如果您有類似- (void)doSomething;的方法,可以這樣調用它:myObject.doSomething; //bad style。不要這樣做。除了獲取或設置值之外,點語法並不意味着調用實際執行任何操作的方法(儘管語言或IDE中沒有內容會阻止您)。

合成屬性創建訪問器方法:- (myType)myProperty- (void)setMyProperty:(myType)newValue。在這裏,點語法可以讓你以普通方式訪問getter(因爲getter是普通的Objective-C方法),並且對於setter有一個特殊情況:myObject.myProperty = newValue被轉換爲[myObject setMyProperty:newValue]

這意味着您可以在屬性(以及技術上適用於所有其他無參數Objective-C方法發送)的點語法和Objective-C樣式消息之間進行切換,但您必須使用點語法來訪問結構成員。結構不是對象,他們現在知道方法。