2009-05-27 46 views
9

我是新來的目標C,我只是想了解何時使用指針以及何時不指定實例變量時的一般性說明。Objective-C實例變量指針

我能想到的例子是UIView與BOOL。 UIView我會做一個指針,布爾我不會(因爲編譯器對我大喊)。

任何一般的指導都很棒。

乾杯,

回答

20

如果它是一個對象,則使用指針表示法。所有C類型(int,BOOL,長等)不是對象,因此只有當您想要一個指向其存儲位置使用指針:

NSObject *obj; 
UIView<Protocol> *obj; 
int integerVar; 
BOOL isTrue; 

一種特殊情況是id,這本身就是一個指向對象,所以你不需要*

id obj; 

有點難:

NSInteger int; 
NSNumber *number; 

NSInteger的是適當的特定於平臺的INT TY pe,而NSNumber是一個可以包含int,float或者你有什麼的對象。

+2

感謝您的回答。 這讓我現在問,C類型如何從內存中清除?它是否在Objective-C引擎蓋下完成? – Meroon 2009-05-28 00:09:23

+1

對象的實例變量都包含在對象的內存中。當對象的內存被釋放時,它們將全部消失。與對象類型變量的區別在於它們是指針,這意味着變量本身只指向內存中的某個位置。即使指針變量消失,它指向的內存仍然被分配。 – Chuck 2009-05-28 01:37:11

5

指針用於保存分配內存的地址。當你在可可中創建對象時,你分配內存並將地址存儲在指針中。

BOOL,char,int存儲值。

當你創建一個類的頁頭分配內存,所以你需要一個指針存儲到內存能夠訪問它:

NSMutableArray * arr = [[NSMutableArray alloc] init]; 

如何在C型也會從內存清理?

'簡單'類型分配在堆棧上。當一個方法被調用時,在堆棧上分配一個空間來存放所有的方法變量(加上一些其他的東西,比如參數和返回地址等)。所以堆棧增長。一旦方法返回堆棧收縮,方法使用的空間現在被回收 - 所以是簡單的類型將被「清理」。

它實際上比聽起來簡單得多。看看wikipedia Stack entry - section Hardware stacks瞭解更多細節以滿足您的好奇心。

當你'分配內存'的內存分配在堆上。整個應用程序的執行都是堆在一起的。一旦你在堆上分配內存,你會得到該內存的地址 - 你將這個地址存儲在指針中。指針只是一個存儲內存地址的變量。

當您的方法返回時,您不再可以訪問在方法中聲明的'簡單'變量(例如BOOL,int,char等),但堆上的內存仍然存在。如果您仍然擁有可以訪問的內存地址(例如指針)。

怎麼樣'簡單'類型的實例變量(編輯:內部對象?)?

當您創建對象(我們在此討論目標C和Cocoa)並分配它時,將爲整個對象分配空間。對象的大小是所有變量的大小(不知道obj-​​c是否添加了其他內容)。所以實例變量是堆中對象內存的一部分。當你釋放/刪除對象時,它的內存被回收,並且你不再訪問存儲在對象內部的變量(在o​​bj-c中,你調用release,每個對象保持引用計數,當引用計數達到0時,對象被釋放 - 堆上的內存被回收)。

1

每個Objective-C類,像NSS​​tring,NSObject,NSView等都需要是一個指針,除了像NSUInteger這樣的一些特殊類型,它只是int的typedef我相信。

NSString *stringyString = @"THIS STRING IS STRINGY!!!11"; 
NSOpenPanel *openPanel; 
NSObject *objectyObject; 
NSUInteger integeryInteger = 7; 

唯一不會是id的,因爲它是一個指向任何對象的指針。

id pointerThatCanBeSetToAnyObject = [NSString stringWithString:@"HEYYYY"]; 

只有像int,float,BOOL等C類變量不需要指針,除了像char數組這樣的C字符串。

int SEVEN = 7; 
float SIXPOINTTWO = 6.2; 
char *characterArray = "HEYYYYY"; 

最後,CoreFoundation類有一種混合;很多類都是指針,但對於一些類,比如CFString,CFStringRef已經是一個指針了。許多CFString函數以CFStringRef的形式返回。 CFString *和CFStringRef可以與NSString *互換(這稱爲免費橋接),但編譯器可能會先欣賞它。

CFString *veryStringyString = @"STRINGYNESS!!11!one"; 
CFStringRef especiallyStringyString = @"STRRRRRRINNNNNGGGGYYYYY"; 
NSString *STRINGYNESS = (NSString *)veryStringyString;