2015-08-20 32 views
0

我最近一直在學習如何在iOS開發中使用Quartz API,並且已經注意到一些有點奇怪的事情。對於1,爲什麼我們必須在製作它們之後釋放某些物體?另外,指針變量沒有星號,爲什麼?像下面的代碼:爲什麼我們在使用Quartz API時必須釋放對象?

CGContextRef context = UIGraphicsGetCurrentContext(); 

在上面的例子中,變量上下文是一個指針。爲什麼我們不使用星號?感謝任何幫助/指導。請儘可能詳盡,因爲我喜歡深入瞭解我使用的技術。

+4

我只想發表評論,因爲我現在沒有時間深入解答。簡單的答案是您正在處理C級API(未寫入或封裝在Objective-C中)。 CGContextRef是一個指向結構體的指針的typedef(C沒有類,但是結構體是一個容器類型)。看一下CGContext.h中'CGContextRef'的定義,你會看到那裏使用的星號語法。自動引用計數(ARC)是一種編譯器功能,只能在Obj-C對象上運行,因此必須明確釋放由此C及其他C級API分配的內存。 – Mathew

+0

@Mathew謝謝!我也很好奇開發人員是否傾向於使用這個功能,而不是說在設計用於應用程序的UI圖形時在Sketch等軟件中創建圖像?我是新用戶界面圖形的東西。 – Vimzy

+0

@Mathew如果你想,只需複製/粘貼你的評論作爲答案,我會選擇它作爲最佳答案。 – Vimzy

回答

1

您正在處理C級API(未寫入或封裝在Objective-C中)。 CGContextRef是指向struct(C沒有類,但structs是容器類型)的指針的typedef。看看的定義CGContext.h,你會看到在那裏使用的星號語法。

有一個主要原因,我可以想到爲什麼蘋果會定義CGContextRef,而不是讓程序員直接使用指向CGContext結構體的指針。在Objective-C中,你總是使用指針。你永遠不會使用靜態分配的Objective-C類實例 - 事實上,編譯器禁止它。然而,在C中,這不是事實。 Apple希望將所有對CGContext結構體的引用保留爲指針,以便引用計數按預期工作,並且可以保證您使用的對象與他們提供的對象相同。注意:引用計數本身並不是C語言的一部分,它是Apple寫入CGContext這樣的結構的東西,允許用它們進行編程,使其感覺類似於使用Objective-C對象進行編程。考慮下面的代碼片段作爲我正在談論的簡要例子。

在C(你可以編譯這個作爲一個Objective-C程序的一部分):

typedef struct {int a; int b; int refCount;} SimpleObject; 

SimpleObject *obj1 = malloc(sizeof(SimpleObject)); 
obj1->a = 5; 
obj1->b = 6; 
obj1->refCount = 1; 

SimpleObject *obj2 = obj1; 

NSLog(@"test: (%d, %d) (%d, %d) (%d, %d)", obj1->a, obj2->a, obj1->b, obj2->b, obj1->refCount, obj2->refCount); 
NSLog(@"test: %d", obj1 == obj2); //they are literally the same object (same location in memory) 

SimpleObject obj3 = *obj1; 

NSLog(@"test: (%d, %d) (%d, %d) (%d, %d)", obj1->a, obj3.a, obj1->b, obj3.b, obj1->refCount, obj3.refCount); 
NSLog(@"test: %d", obj1 == &obj3); //they are not the same object (same location in memory) 

obj1->refCount--; 

NSLog(@"test: how many retains on obj1? %d how about obj2? %d and obj3? %d", obj1->refCount, obj2->refCount, obj3.refCount); 

free(obj1); 

嘗試在Objective-C類似的東西,編譯器很快拋出一個錯誤:

NSObject *obj1 = [[NSObject alloc] init]; 

NSObject *obj2 = obj1; 

NSLog(@"test: %d", obj1 == obj2); // they are literally the same object (same location in memory) 

NSObject obj3 = obj1; // compiler error 

自動引用計數(ARC)允許您在Objective-C中分配內存,然後不用擔心後續釋放或釋放內存。這是一個編譯器功能,只能在Obj-C對象上運行,因此必須明確釋放由此C及其他C級API分配的內存。

相關問題