XCode 4 c objective-c对象数组

XCode 4 c objective-c对象数组,objective-c,arrays,xcode4,Objective C,Arrays,Xcode4,使用XCode 3编译器,我可以管理一系列对象,如: @interface myView:UIView { CALayer *layer[4]; } @property (nonatomic,retain) CALayer **layer; @end @implementation myView @dynamic layer; - (CALayer **)layer { return layer; } // I could then access elements like -

使用XCode 3编译器,我可以管理一系列对象,如:

@interface myView:UIView
{
    CALayer *layer[4];
}

@property (nonatomic,retain) CALayer **layer;
@end

@implementation myView
@dynamic layer;

- (CALayer **)layer { return layer; }

// I could then access elements like

- (void) example
{
    self.layer[3] = NULL;
}

@end
对于XCode 4编译器,@property声明生成一个错误“带有retain的属性必须是对象类型”


我想最好的修复方法是转换为NSArray,但我有100行代码使用c风格的数组下标(例如,self.layer[I])。是否有其他方法可以修复?

将其更改为
分配
属性,这样您就不会尝试保留非对象?

将其更改为
分配
属性,这样您就不会尝试保留非对象?

您不能在C数组上使用Objective-C内存管理调用(即retain)。你需要使用标准的C或C++逻辑来管理数组。您需要自行malloc并释放内存。如果不需要保留阵列,则可以删除
retain
属性。

不能在C阵列上使用Objective-C内存管理调用(即retain)。你需要使用标准的C或C++逻辑来管理数组。您需要自行malloc并释放内存。如果不需要保留数组,则可以删除
retain
属性。

此代码存在以下几个问题:

  • 它应该是
    MyView
    ,而不是
    MyView
    ;课程以大写字母开始

  • CALayer**
    不是对象类型;它是指向对象类型的指针,因此编译器会抱怨。简单地让它赋值将使它编译,但它仍然是错误的

  • 可能没有理由使用语言数组(
    MyClass foo[4]
    )来保存此数据。使用NSMutableArray(您可以使用
    [NSNull null]
    作为“此插槽未填充”的替代项)

如果您真的想坚持使用语言数组,请删除
retain
。请记住,您必须明确管理数组中对象的retain/release。
@属性
不会为您这样做


此外,虽然修复代码以与典型标准模式内联似乎是一件痛苦的事情,但随着代码的发展,这样做的成本只会更高,而且有一天,您可能会遇到真正需要这样做的情况……

此代码有几个问题:

  • 它应该是
    MyView
    ,而不是
    MyView
    ;类以大写字母开头

  • CALayer**
    不是对象类型;它是指向对象类型的指针,因此编译器会抱怨。简单地将其赋值会使其编译,但仍然是错误的

  • 可能没有理由使用语言数组(
    MyClass foo[4]
    )来保存此数据。请使用NSMutableArray(您可以使用
    [NSNull null]
    作为“此插槽未填充”的替代项

如果您真的想坚持使用语言数组,请删除
retain
。请记住,您必须明确管理数组中对象的retain/release。
@属性
不会为您这样做


此外,虽然修复代码以与典型标准模式内联似乎是一件痛苦的事情,但随着代码的发展,这样做的成本只会更高,而且,有一天,您可能会遇到真正需要这样做的情况……

好的,找到了快速的答案,即将默认编译器从LLVM更改为LLVM gcc 4.2。但是,仍然会想知道LLVM有没有办法做到这一点?跟踪由于修改阵列时忘记保留/释放而导致的内存泄漏和随机崩溃(以及由于无法使用自动引用计数而导致的所有额外崩溃)可能会给您带来比修复此问题更多的工作。好的,找到了快速答案,即将默认编译器从LLVM更改为LLVM gcc 4.2。但是,我仍然想知道是否有一种方法可以使用LLVM执行此操作?跟踪由于在修改阵列时忘记保留/释放而导致的内存泄漏和随机崩溃(以及由于无法使用自动引用计数而产生的所有额外的引用)可能会比修复此问题需要更多的工作。如前所述,ivar本身不需要内存管理,但包含在中的对象需要内存管理。ivar的内存将内联存储在对象中;不需要
malloc
free
。如前所述,ivar不需要内存管理本身,但包含在中的对象。ivar的内存将内联存储在对象中;不需要
malloc
free
。我想知道原始代码在gcc中工作的原因/方式。有什么想法吗?代码在gcc中不工作;gcc太愚蠢,无法捕捉错误。甚至,
@属性使用GCC4.2是一场噩梦,有几个错误案例如果没有大量的工程努力就无法捕获。啊,这就解释了为什么我发现保留/释放行为如此令人困惑,因为它根本不起作用!我猜我是从我发现做同样事情的一些代码中错误地推断出来的,但是没有retain属性。尽管如此,我在原则上看不出为什么没有一种方法来做我想要的事情。很明显,我可以声明不同的对象,*layer0、*layer1、*layer2、*layer3,并让它以我想要的方式工作。那么,为什么不*layer[0]、*layer[1]、*layer[2]、*layer[3]?事实上,我想这很好,只是不会合成保留/发布,这没关系,现在我明白了。我想知道原始代码在gcc中工作的原因/方式。有什么想法吗?代码在gcc中不起作用;gcc太愚蠢了,无法捕捉错误。即使使用gcc 4.2使用
@property
也是一场噩梦有几个错误案例,如果没有大量的工程努力,就无法捕获。啊,这就解释了为什么我发现保留/释放行为如此令人困惑,因为它甚至不起作用