Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 指针,我用对了吗?目标-c/可可_Objective C_Cocoa_Pointers_Garbage Collection - Fatal编程技术网

Objective c 指针,我用对了吗?目标-c/可可

Objective c 指针,我用对了吗?目标-c/可可,objective-c,cocoa,pointers,garbage-collection,Objective C,Cocoa,Pointers,Garbage Collection,我在@interface中有这个 struct track currentTrack; struct track previousTrack; int anInt; struct track currentTrack; struct track previousTrack; int anInt; 因为这些不是对象,所以我不需要像int*a那样拥有它们,对吗? 如果设置非对象值,如int、boolean等,我不必释放旧值(假设为非GC环境) 结构包含以下对象: typedef struct t

我在@interface中有这个

struct track currentTrack;
struct track previousTrack;
int anInt;
struct track currentTrack;
struct track previousTrack;
int anInt;
因为这些不是对象,所以我不需要像int*a那样拥有它们,对吗? 如果设置非对象值,如int、boolean等,我不必释放旧值(假设为非GC环境)

结构包含以下对象:

typedef struct track {
NSString* theId;
NSString* title;
} *track;
typedef struct track {
    NSString* theId;
    NSString* title;
我这样做对吗

最后,我以如下方式访问结构:

[currentTrack.title ...];
currentTrack.theId = @"asdf"; //LINE 1
[currentTrack.title autorelease];
currentTrack.title = [newTitle retain];
[currentTrack.title ...];
currentTrack.theId = @"asdf"; //LINE 1
[currentTrack.title autorelease];
currentTrack.title = [newTitle retain];
我还手动管理结构的内存(来自setter),如下所示:

[currentTrack.title ...];
currentTrack.theId = @"asdf"; //LINE 1
[currentTrack.title autorelease];
currentTrack.title = [newTitle retain];
[currentTrack.title ...];
currentTrack.theId = @"asdf"; //LINE 1
[currentTrack.title autorelease];
currentTrack.title = [newTitle retain];
如果我正确地理解了垃圾收集,我应该能够抛弃它,并像上面第1行那样设置它

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

对不起,有这么多问题。对objective-c和桌面编程非常陌生

谢谢

我在@interface中有这个

struct track currentTrack;
struct track previousTrack;
int anInt;
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;
} *track;
typedef struct track {
    NSString* theId;
    NSString* title;
更准确地说,它包含指向对象的指针

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

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

如果要将
轨迹
类型声明为指向
结构轨迹的指针,则这是正确的。一般来说,这会让人困惑

最后,我以如下方式访问结构:

[currentTrack.title ...];
currentTrack.theId = @"asdf"; //LINE 1
[currentTrack.title autorelease];
currentTrack.title = [newTitle retain];
[currentTrack.title ...];
currentTrack.theId = @"asdf"; //LINE 1
[currentTrack.title autorelease];
currentTrack.title = [newTitle retain];
所以前一行是第0行?;)

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

[currentTrack.title ...];
currentTrack.theId = @"asdf"; //LINE 1
[currentTrack.title autorelease];
currentTrack.title = [newTitle retain];
[currentTrack.title ...];
currentTrack.theId = @"asdf"; //LINE 1
[currentTrack.title autorelease];
currentTrack.title = [newTitle retain];
如果我正确地理解了垃圾收集,我应该能够抛弃它,并像上面第1行那样设置它

如果您使用的是垃圾收集,那么
autorelease
retain
消息将不起任何作用,因此是的,普通分配和带有(无效的)release和retain消息的分配是等效的

但我确实怀疑,为什么你要把这些信息放在一个结构中,而不是一个框架中

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

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


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

正确,正确,否,是,正确,是,苹果的垃圾收集编程指南是一本很好的书。

尽管你似乎总体上对这件事很了解,但我强烈建议不要将对象存储在结构中。为此获得适当的内存管理将是非常麻烦的——因为即使结构本身不需要内存管理,对象仍然需要内存管理,并且除非该结构仅通过函数API访问(本质上使其成为穷人的对象),否则您将很难确保这一点。正如彼得所说,作为一个模型对象是有意义的。

一般来说是正确的。然而,由于这里使用的是GC,因此几乎不需要以内存管理的名义进行任何操作(除了仔细考虑)。