XCode 4 c objective-c对象数组
使用XCode 3编译器,我可以管理一系列对象,如: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 -
@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**
- 可能没有理由使用语言数组(
)来保存此数据。使用NSMutableArray(您可以使用MyClass foo[4]
作为“此插槽未填充”的替代项)[NSNull null]
retain
。请记住,您必须明确管理数组中对象的retain/release。@属性
不会为您这样做
此外,虽然修复代码以与典型标准模式内联似乎是一件痛苦的事情,但随着代码的发展,这样做的成本只会更高,而且有一天,您可能会遇到真正需要这样做的情况……此代码有几个问题:
- 它应该是
,而不是MyView
;类以大写字母开头MyView
不是对象类型;它是指向对象类型的指针,因此编译器会抱怨。简单地将其赋值会使其编译,但仍然是错误的CALayer**
- 可能没有理由使用语言数组(
)来保存此数据。请使用NSMutableArray(您可以使用MyClass foo[4]
作为“此插槽未填充”的替代项[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
也是一场噩梦有几个错误案例,如果没有大量的工程努力,就无法捕获。啊,这就解释了为什么我发现保留/释放行为如此令人困惑,因为它甚至不起作用