1

我正在尝试初始化一个Photos数组,并且这样做是这样的:

NSMutableArray *photoList = [[NSMutableArray alloc] init];
self.photos = photoList;

但是当这行代码运行时,我得到了这个错误:

'NSInvalidArgumentException', reason: '-[Project setPhotos:]: unrecognized selector sent to instance 0xee8e310'

我花了大约三个小时试图找到解决方法,但找不到,谁能告诉我该怎么做?

4

5 回答 5

4

@synthesize在我看来,您还没有创建属性 photos,如果您有,那么在您的实现中似乎也没有这个属性,也许您正在使用@dynamic,在这种情况下,您可以创建一个- (void)setPhotos:(NSMutableArray*)photos;方法

于 2012-08-03T14:16:31.890 回答
2

self没有一个属性叫做photos

您需要@property (nonatomic, strong) NSArray *photos;.h文件中添加@end

.m文件中,@synthesize photo;

于 2012-08-03T14:15:24.820 回答
2

好像您还没有为照片编写 setter 方法。

在你的 .h

@property (strong, nonatomic) NSArray * photos;

在你的 .m 中(如果不使用 xcode 4.4)

@synthesize photos;

或者你可以试着这样写

photos =  [NSArray arrayWithArray:photoList];

如果您使用 [self setMyArray:array] 或 self.array = myArray 作为参考,那么您正在使用 setter 方法,这可能是您想要做的事情。如果你只是指向array = myArray,你将指向myArray,如果它被释放,你的指针将指向深渊。最好不要这样做,不使用设置器意味着您正在直接访问变量照片,这可能不是您想要的。

于 2012-08-03T14:17:48.267 回答
2

这行代码:

self.photos = photoList;

变成这条线

[self setPhotos:photoList];

由编译器 - 点符号就是所谓的“语法糖”,因为它只是让输入更容易,它并没有真正缩短代码。

如果您创建了自己的 getter 和 setter(即)

- (NSMutableArray *)photos;
- (void)setPhotos:(NSMutableArray *)myPhotos

然后,即使您没有名为“照片”的属性,您也可以使用该糖 - 尽管这被认为是对该功能的滥用(我将其显示为比较目的)。

当您创建一个名为 photos 的属性时:

@property (nonatomic, strong) NSMutableArray *photos;

编译器将使用相同的名称为您生成一个 ivar,但不会创建 getter 和 setter。该行:

@synthesize photos;

要求编译器执行一个 getter(在所有情况下)和一个 setter(如果属性是读写)。如果您不提供 @synthesize 语句,编译器通常会抱怨,因此人们应该注意这些警告。

您可以在错误中看到您没有 setPhotos,因此您的问题可以很容易地解决。

于 2012-08-03T14:23:18.983 回答
1

哎呀,我用过@dynamic photos而不是@synthesize photos

于 2012-08-03T14:15:47.650 回答