在c或c语言中,我们通常不使用指针变量来存储值.即,值的存储方式简单如下:
int a=10;
但是在ios sdk中,在目标c中,我们使用的大多数对象都是通过用它们表示指针来初始化的,如:
NSArray *myArray=[NSArray array];
所以,在我的脑海中出现的问题是,使用指针对象有什么好处和需要(这就是我们在这里所称的,如果它不正确,请告诉我们).
另外,当使用指针对象进行分配时,我有时会对内存分配基础感到困惑.我可以在任何地方寻找好的解释吗?
解决方法
in c++ or c languages,we usually don’t use pointer variables to store values
我会把那个“或C”部分拿出来. C程序员对使用原始指针不屑一顾,但C程序员却不这样做. C程序员喜欢指针并将其视为解决所有问题的不可避免的银弹解决方案. (不,不是真的,但指针在C中仍然经常使用.)
but here in ios sdk,in objective c,most of the objects which we use are initialized by denoting a pointer with them
哦,仔细看看:
most of the objects
更接近:
objects
所以你在谈论Objective-C对象,amirite? (忽略C标准基本上将所有值和变量描述为“对象”的微妙之处.)
它实际上只是Objective-C对象,它们始终是Objective-C中的指针.由于Objective-C是C的严格超集,所以在编写iOS应用程序(或OS X应用程序或任何其他基于Objective-C的程序)时,所有C语言和编程技术仍然适用.这是毫无意义的,多余的,浪费的,因此,写一些类似的东西甚至被认为是错误的
int *i = malloc(sizeof(int)); for (*i = 0; *i < 10; ++*i)
只是因为我们在Objective-C土地上.基元(或更正确的“带有C术语的普通旧数据类型”)仍然遵循“如果不需要则不使用指针”规则.
what are the benefit and need of using pointer-objects
那么,为什么他们是必要的:
Objective-C是一种面向对象的动态语言.这两种强烈相关的语言属性使程序员可以利用polymorphism,duck-typing和dynamic binding等技术(是的,这些是超链接,点击它们).
实现这些功能的方式使得必须通过指向它们的指针来表示所有对象.我们来看一个例子吧.
编写移动应用程序时的常见任务是从服务器检索某些数据.现代基于Web的API使用JSON数据交换格式来序列化数据.这是一种简单的文本格式,可以将其解析(例如,使用NSJSONSerialization类)到各种类型的数据结构及其相应的集合类,例如NSArray或NSDictionary.这意味着JSON解析器类/方法/函数必须返回一些通用的东西,可以表示数组和字典.
那么现在怎么办?我们不能返回非指针NSArray或NSDictionary结构(Objective-C对象实际上只是我知道Objective-C工作的所有平台上的简单旧C结构),因为它们具有不同的大小,它们有不同的内存布局等.编译器无法理解代码.这就是为什么我们返回一个指向id类型的通用Objective-C对象的指针.
C标准规定指向结构(以及对象)的指针具有相同的表示和对齐要求(C99 6.2.5.27),即.即指向任何结构的指针可以安全地转换为指向任何其他结构的指针.因此,这种方法是正确的,我们现在可以返回任何对象.使用运行时内省,还可以动态确定对象的确切类型(类),然后相应地使用它.
为什么它们比非指针方便或更好(在某些方面):
使用指针,不需要传递同一对象的多个副本.创建大量副本(例如,每次将对象分配给或传递给函数时)都会很慢并导致性能问题 – 中等复杂的对象(例如视图或视图控制器)可能会有数十个副本实例变量,因此单个实例可以测量数百个字节.如果一个带有对象类型的函数调用在紧密循环中被调用数千或数百万次,那么重新分配和复制它是非常痛苦的(无论如何对于cpu),并且更容易和更直接地传入指向对象的指针(尺寸较小,因此复制速度更快).此外,Objective-C,作为参考计数语言,甚至有点“阻止”过度复制.保留和释放优于显式复制和释放.
Also I just get confused sometimes with memory allocation fundamentals when using a pointer objects for allocation
那么即使没有指针你也很可能很困惑.不要责怪指针,这是程序员错误;-)
所以这里……
> … the official documentation and memory management guide by Apple;
> … the earliest related Stack Overflow question I could find;
> … something you should read before trying to continue Objective-C programming #1; (即先学习C)
> … something you should read before trying to continue Objective-C programming #2;
> … something you should read before trying to continue Objective-C programming #3;
> … and an old Stack Overflow question regarding C memory management rules,techniques and idioms;
玩得开心!