【问题标题】:What is the difference between C pointer and Objective C pointer?C指针和Objective C指针有什么区别?
【发布时间】:2013-02-05 06:35:56
【问题描述】:

我知道这是一个非常基本的问题。有一些我需要澄清的内存问题。这是我的疑问:

int *p = malloc (50); // will allocate 50 bytes and it is pointed by p.

// Freeing C pointer-->

free(p);

Objective-C 指针:

ClassAobject *objA = .... // allocated ClassAobject..

// Freeing obj-C pointer--->

objA = nil // Is it enough??? will it release all ivars memory properly..

如果是这样,如果我在目标 C 类中有一些 C 指针怎么办?如何在 ARC 中处理此问题

【问题讨论】:

  • 如果你使用 ARC,你不需要释放任何对象
  • 也不需要指定 nil...?
  • 如果不这样做,您需要保留/释放对象,就像您在 C 中所做的那样。您使用哪个?
  • ARC = AutoRetainCount -> 它计算对对象的引用并收集那些不再被指向的对象。含义 -> 您必须分配 nil 或任何其他引用,因此 GC 将取出您不再需要的对象。与 Java 相比。
  • ARC(自动引用计数)不收集引用。它是一个编译器功能,可以为您插入所有需要的保留/释放/自动释放调用。 iOS 上也没有 GarabageCollector,OS X 中的 GC 也将死去。 @Newbee 将 nil 分配给您的指针是个好主意,但即使您不分配 nil,ARC 也会执行所有内存管理。当其作用域完成时,您的对象将收到释放或自动释放消息。

标签: objective-c c pointers


【解决方案1】:

标题未反映您的要求。 C 指针和“Objective-C 指针”之间没有区别。实际上它们只是普通的 C 指针。

您要求的是它们正确用法之间的区别。如果一个指针指向一个Objective-C对象,那么在MRC下,你必须这样做

[obj release];

减少它的引用计数(这可能会释放它)。在 ARC 下,将指针设置为 nil 就足够了(如您的示例所示)。

【讨论】:

  • 如果是这样的话,如果我在目标 C 类中有一些 C 指针,我应该释放它吗?我应该什么时候做?
  • @Newbee 在您班级的- (void)dealloc 方法中。另外,别忘了在结束时致电[super dealloc];
  • @Newbee 你真的应该阅读苹果文档或者买一本书来了解这样简单的东西。我们不是你的私人老师。
  • @H2CO3 如果 Newbee 如他/她问题的最后一句话所建议的那样使用 ARC,则禁止拨打 [super dealloc]
  • @Metabble 对。但是,我认为他想了解/了解引用计数的工作原理,所以我默认使用 MRC 答案。
【解决方案2】:

“C 指针”和“Objective-C 指针”之间没有区别。 void* 和 int* 在 C 和 Objective-C 中是完全一样的。

但是,当您使用 ARC 时,某些指针类型由 ARC 专门处理。这些指针类型是:

id
Pointers to Objective-C objects like NSString*
Class
Blocks

这些都是指向各种被引用计数的 Objective-C 对象的指针。 ARC 会自动跟踪存在对这些对象中的任何一个的引用的数量,如果最后一个引用被删除,则对象本身将被释放。

如果一个对象被释放,ARC 会自动删除它所引用的对象的所有引用。但是,如果一个对象的指针不受 ARC 控制,则您必须在 dealloc 中执行您需要执行的任何操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2021-09-21
    • 2010-09-30
    • 2011-04-04
    • 2010-12-17
    • 2013-07-12
    相关资源
    最近更新 更多