2009-05-27 59 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;