指针,我正确使用它们吗?目标C /可可

时间:2010-04-02 08:59:11

标签: objective-c cocoa pointers garbage-collection

我在@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];

如果我正确理解垃圾收集,我应该能够放弃它并将其设置为LINE 1(上图)?

还有垃圾收集,我不需要dealloc方法吗? 如果我使用垃圾收集这是否意味着它只能在OS 10.5+上运行?在切换到垃圾收集代码之前,我应该知道的任何其他事情?

抱歉,有这么多问题。 Objective-c和桌面编程的新手。

由于

3 个答案:

答案 0 :(得分:4)

  

我在@interface

中有这个
struct track currentTrack;
struct track previousTrack;
int anInt;
     

由于这些不是对象,我不必像int* anInt那样对吗?

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

  

如果设置非对象值如int,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];
     

如果我正确理解垃圾收集,我应该能够放弃它并将其设置为LINE 1(上图)?

如果您正在使用垃圾收集,那么autoreleaseretain消息将不执行任何操作,因此,是的,明文赋值和赋值(无效)释放和保留消息是等效的。< / p>

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

  

还有垃圾收集,我不需要dealloc方法吗?如果我使用垃圾收集这是否意味着它只能在OS 10.5+上运行?在切换到垃圾收集代码之前,我应该知道的任何其他事情?

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

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

答案 1 :(得分:2)

虽然你似乎总体上理解这些东西,但我强烈建议不要在结构中存储对象。为此进行适当的内存管理将非常麻烦 - 因为即使结构本身不需要内存管理,对象仍然可以,除非只通过函数API访问结构(基本上使它成为穷人的对象) ,你将很难确保这种情况发生。像彼得说的那样,成为模范对象是有道理的。

答案 2 :(得分:0)

正确,正确,不,是,正确,是的,Apple的垃圾收集编程指南是一个很好的阅读。