我是目标C的新手,我只是希望得到一个关于何时使用指针的一般说明以及何时不用,在声明实例变量时。
我能想到的例子是UIView与BOOL。 UIView我会做一个指针,BOOL我不会(因为编译器对我大吼大叫)。
任何一般指导都很棒。
干杯,
答案 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是否添加其他东西)。因此,实例变量是堆上对象内存的一部分。当你释放/删除对象时,它的内存被回收,你不再能够访问存储在对象中的变量(在obj-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;