Objective-C实例变量指针

时间:2009-05-27 23:16:03

标签: objective-c pointers

我是目标C的新手,我只是希望得到一个关于何时使用指针的一般说明以及何时不用,在声明实例变量时。

我能想到的例子是UIView与BOOL。 UIView我会做一个指针,BOOL我不会(因为编译器对我大吼大叫)。

任何一般指导都很棒。

干杯,

3 个答案:

答案 0 :(得分:20)

如果它是一个对象,则使用指针表示法。所有c类型(int,BOOL,long等)都不是对象,因此如果需要指向其内存位置的指针,则只使用指针:

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

特殊情况是id,它本身就是指向对象的指针,因此您不需要*

id obj;

有点棘手:

NSInteger int;
NSNumber *number;

NSInteger是适当的特定于平台的int类型,而NSNumber是一个可以包含int,float或者你有什么的对象。

答案 1 :(得分:5)

指针用于保存已分配内存的地址。在cocoa中创建对象时,您需要分配内存并将地址存储在指针中。

BOOL,char,int存储值。

创建类时,alloc会分配内存,因此您需要存储指向该内存的指针才能访问它:

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

如何从内存中清除C类型?

'简单'类型在堆栈上分配。调用方法时,在堆栈上分配空间以容纳所有方法变量(加上一些其他的东西,如参数和返回地址等)。堆栈增长。一旦方法返回,堆栈就会收缩,并且方法使用的空间现在被回收 - 所以是的,简单类型将被“清理”。

它实际上比听起来简单得多。有关详细信息,请查看wikipedia Stack entry - section Hardware stacks以满足您的好奇心。

当你'分配内存'时,在堆上分配内存。堆可用于整个应用程序的执行。在堆上分配内存后,您将获得该内存的地址 - 您将此地址存储在指针中。指针只是一个存储内存地址的变量。

当你的方法返回时,你不再能够访问在方法中声明的'简单'变量(例如BOOL,int,char等),但堆上的内存仍然存在。如果您仍然拥有存储器的地址(例如指针),则可以访问它。

“简单”类型的实例变量怎么样(编辑:内部对象?)?

当你创建对象(我们在这里谈论目标C和Cocoa)并分配它时,你为整个对象分配空间。对象的大小是它所有变量的大小(不确定obj-c是否添加其他东西)。因此,实例变量是堆上对象内存的一部分。当你释放/删除对象时,它的内存被回收,你不再能够访问存储在对象中的变量(在o​​bj-c中你调用release,每个对象保持引用计数,当引用计数达到0时,对象被释放 - 堆上的内存被回收)。

答案 2 :(得分:1)

每个Objective-C类,比如NSString,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"];

只有C,变量类型(如int,float,BOOL等)不需要指针,除了像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;