Reb*_*gan 3 c pointers objective-c objective-c-runtime
我有一个关于在Objective-C中使用星号的问题.需要明确的是:我理解指针是什么以及程序C中的所有内容.我想知道两件事情:
1)为什么所有(引用)Objective-C对象指针?为什么不是普通变量?(即NSArray数组= [[NSArray alloc] init];)
2)为什么在调用方法时省略星号?
谢谢!
bbu*_*bum 20
1)为什么所有(引用)Objective-C对象指针?为什么不是普通变量?(即NSArray数组= [[NSArray alloc] init];)
将Objective-C对象想象成一个美化的结构片刻.
NSArray array;在本地范围内,将是在堆栈上"分配"的对象. NSArray *array;表示由大量内存支持的对象,通常从堆中分配.
很久很久以前,我们决定Objective-C不支持堆栈上的对象.大多数情况下,因为这样做会使内存管理成为一个巨大的混乱(主要-retain是堆栈上的东西根本没有任何意义).
由于Objective-C被设计为C的纯超集,并且与C++不同,它不会尝试修改C的基本行为,因为*其中的内容似乎很自然.
请注意,id打破这个,但id也是一个完全通用的类型.事实上,它可能在堆栈上有Objective-C对象.在Snow Leopard中,Blocks实际上是Objective-C对象,它们确实从堆栈开始.但是,您不支持在堆栈上创建自己的对象.
2)为什么在调用方法时省略星号?
因为您没有取消引用指向该对象的指针,并且指向该对象的指针在方法实现本身中是至关重要的.当你说...
[anArray objectAtIndex: 5];
Run Code Online (Sandbox Code Playgroud)
......这完全等同于写作......
objc_msgSend(anArray, @selector(objectAtIndex:), 5);
Run Code Online (Sandbox Code Playgroud)
......当你实施所述方法时....
- (id) objectAtIndex: (NSUInteger) anIndex;
Run Code Online (Sandbox Code Playgroud)
......它完全等同于实现这个C函数......
id object_at_index(id self, SEL _cmd, NSUInteger anIndex) { ... }
Run Code Online (Sandbox Code Playgroud)
也就是说,Objective-C方法实际上只是一个带有两个或更多参数的C函数.事实上,你可以将这行代码粘贴到任何方法实现中,它只会"正常工作":
NSLog(@"method %@", NSStringFromSelector(_cmd));
Run Code Online (Sandbox Code Playgroud)