【问题标题】:Pointers, am I using them correctly? Objective-c/cocoa指针,我是否正确使用它们? Objective-c/可可
【发布时间】:2010-04-02 08:59:10
【问题描述】:

我的@interface 中有这个

struct track currentTrack;
struct track previousTrack;
int anInt;

由于这些不是对象,我不必像 int* anInt 那样拥有它们,对吗? 并且如果设置非对象值如int、boolean等,我不必释放旧值的权利(假设非GC环境)?

结构包含对象:

typedef struct track {
NSString* theId;
NSString* title;
} *track;

我这样做对吗?

最后,我像这样访问结构:

[currentTrack.title ...];
currentTrack.theId = @"asdf"; //LINE 1

我也在手动管理结构的内存(来自 setter),如下所示:

[currentTrack.title autorelease];
currentTrack.title = [newTitle retain];

如果我对垃圾收集的理解正确,我应该可以放弃它并像第 1 行(上图)那样设置它?

还有垃圾回收,我不需要 dealloc 方法,对吧? 如果我使用垃圾收集,这是否意味着它只能在 OS 10.5+ 上运行?在我切换到垃圾收集代码之前我还应该知道什么?

抱歉,问题太多了。对 Objective-c 和桌面编程非常陌生。

谢谢

【问题讨论】:

    标签: objective-c cocoa pointers garbage-collection


    【解决方案1】:

    我的@interface 中有这个

    struct track currentTrack;
    struct track previousTrack;
    int anInt;
    

    由于这些不是对象,我不必像int* anInt 那样拥有它们,对吧?

    这将声明一个指向存储在其他地方的int 的指针。

    如果设置非对象值,如 ints、boolean 等,我不必释放旧值正确(假设非 GC 环境)?

    release 是一条消息。您只能向 Cocoa(或者,在某些情况下,Core Foundation)对象发送消息。

    结构包含对象:

    typedef struct track {
        NSString* theId;
        NSString* title;
    

    更准确地说,它包含指向对象的指针。

    您永远不能将对象直接存储在变量中;您只能通过向类发送alloc 消息来动态分配它,并接收指向已分配实例的指针。同理,你只能向一个对象的指针发送消息;您不能也不应该取消引用指向对象的指针。

    由于这些原因,我们几乎总是省略“指向的指针”。我们把指针当成对象来说,但实际上它们不是。

    } *track;
    

    如果您想将track 类型声明为指向struct track 的指针,这是正确的。一般来说,这会让人们感到困惑。

    最后,我像这样访问结构:

    [currentTrack.title ...];
    currentTrack.theId = @"asdf"; //LINE 1
    

    所以上一行是第 0 行? ;)

    我也在手动管理结构的内存(来自 setter),如下所示:

    [currentTrack.title autorelease];
    currentTrack.title = [newTitle retain];
    

    如果我对垃圾收集的理解正确,我应该可以放弃它并像第 1 行(上图)那样设置它?

    如果您正在使用垃圾回收,那么 autoreleaseretain 消息将什么也不做,所以是的,普通赋值和带有(无效)释放和保留消息的赋值是等价的。

    不过,我确实质疑您为什么要将这些信息放在一个结构中而不是 model object 中。

    还有垃圾回收,我不需要 dealloc 方法,对吧?如果我使用垃圾收集,这是否意味着它只能在 OS 10.5+ 上运行?在我切换到垃圾收集代码之前我还应该知道什么?

    是的:阅读Garbage Collection Programming Guide。它会告诉你你需要知道的一切,包括前两个问题的答案。

    至于指针,您可能想阅读my pointers tutorial。标题说的是 C,但 C 中的所有内容在 Objective-C 中也是如此。

    【讨论】:

      【解决方案2】:

      虽然您似乎总体上可以理解这些内容,但我强烈建议您不要将对象存储在结构中。为此获得适当的内存管理将非常麻烦 - 因为即使结构本身不需要内存管理,对象仍然需要,并且除非结构仅通过函数 API 访问(本质上使其成为穷人的对象) ,您将很难确保发生这种情况。就像彼得说的那样,成为模型对象是有意义的。

      【讨论】:

      • 一般情况下是正确的。但是,由于这里使用了 GC,因此以内存管理的名义(除了仔细考虑之外)几乎不需要做任何事情。
      【解决方案3】:

      正确,正确,不,是,正确,是,Apple 的垃圾收集编程指南是一本好书。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-06
        • 1970-01-01
        • 2021-01-07
        相关资源
        最近更新 更多