iphone – OS 2.2.1和OS 3之间的Objective-C变化?

当我尝试为OS 3编译我的应用程序时遇到以下错误:

错误:访问者的类型与属性的类型不匹配

错误是我尝试访问的属性,定义如下:

NSMutableArray *myArray

@property (readonly,nonatomic) NSArray* myArray;

该属性在实现文件中是@synthesized.

这在OS 2.2.1中运行得很好,但不是OS 3.0

自己编写getter方法解决了这个问题.

是否有人知道OS 2.2.1和3.0之间对objective-c的更改?
有没有关于这些变化的文件?

API changes document似乎没有包含任何有关此问题的内容.

编辑

当您尝试访问该属性时会发生错误,例如

NSArray *anArray = myClass.myArray;

正如我上面提到的,我找到了一个解决方法:自己编写getter方法,但是我真正想要的是来自苹果的某种文档,解释了这种变化以及与API无关的任何其他变化.

谢谢你的帮助

这是一个编译器错误.

虽然您没有完全指定它,但我希望您的代码如下所示:

@interface Foo : NSObject {
    NSMutableArray *objects;
}
@property (readonly, copy) NSArray *objects;
@end

@implementation Foo
@synthesize objects;
@end

遗憾的是,编译器在对象属性的声明和对象实例变量的声明之间混淆.请记住,Objective-C中的属性和实例变量是不同的东西;属性可以由实例变量支持,但它实际上是类的公共接口的一部分.

您可以通过更改代码来清楚地将实例变量的定义与属性的定义分开,例如通过为实例变量的名称添加前缀来解决此问题:

@interface Foo : NSObject {
    NSMutableArray *_objects;
}
@property (readonly, copy) NSArray *objects;
@end

@implementation Foo
@synthesize objects = _objects;
@end

通过这种方式,编译器不会对像self.objects这样的表达式中的属性与实例变量感到困惑(不管怎样它都不应该,但显然是这样).

只是为了避免不可避免的响应:Apple没有为实例变量保留下划线前缀.它保留用于方法.无论如何,如果您不喜欢下划线,请随意使用其他前缀.

相关文章
相关标签/搜索