我在@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和桌面编程的新手。由于
答案 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(上图)?
如果您正在使用垃圾收集,那么autorelease
和retain
消息将不执行任何操作,因此,是的,明文赋值和赋值(无效)释放和保留消息是等效的。< / p>
我确实质疑你为什么要把这些信息放在一个结构而不是model object中。
还有垃圾收集,我不需要dealloc方法吗?如果我使用垃圾收集这是否意味着它只能在OS 10.5+上运行?在切换到垃圾收集代码之前,我应该知道的任何其他事情?
是:阅读Garbage Collection Programming Guide。它告诉您需要知道的一切,包括前两个问题的答案。
至于指针,您可能需要阅读my pointers tutorial。标题用C表示,但C中的所有内容在Objective-C中也是如此。
答案 1 :(得分:2)
虽然你似乎总体上理解这些东西,但我强烈建议不要在结构中存储对象。为此进行适当的内存管理将非常麻烦 - 因为即使结构本身不需要内存管理,对象仍然可以,除非只通过函数API访问结构(基本上使它成为穷人的对象) ,你将很难确保这种情况发生。像彼得说的那样,成为模范对象是有道理的。
答案 2 :(得分:0)
正确,正确,不,是,正确,是的,Apple的垃圾收集编程指南是一个很好的阅读。