在objective-c中自定义iOS应用。不太熟悉这种语言,设置布尔属性的这个简单任务花了我太长时间。
有人可以在这里提供一些建议吗?
Video.h
@property (nonatomic, retain) NSNumber * hasCustomThumbnail;
Video.m
@implementation Video
@dynamic hasCustomThumbnail;
@end
OtherFile 引用视频
// have tried these two an many other things...
video.hasCustomThumbnail = [NSNumber numberWithBool:NO];
video.hasCustomThumbnail = @NO;
无论我尝试了多少种方式,我得到的错误是:
'NSInvalidArgumentException', reason: '-[Video setHasCustomThumbnail:]: unrecognized selector sent to instance 0x60c0004925c0'
尝试了很多建议,包括:Using a BOOL property
我也知道视频被正确引用,因为自动填充建议" hasCustomThumbnail"当我开始打字时。
我简直无法相信OBJ-c有多难: - )
有什么建议吗?
答案 0 :(得分:1)
问题是您已将其声明为 @dynamic 。只需从Video.m中删除此行即可。 Xcode将自动合成getter和setter。
其中任何一个都有效。
[obj setHasCustomThumbnail:[NSNumber numberWithBool:true]];
obj.hasCustomThumbnail = [NSNumber numberWithBool:true];
@dynamic只是告诉编译器getter和setter方法 不是由类本身实现,而是在其他地方实现(如 超类或将在运行时提供)。 @synthesize将为您的属性生成getter和setter方法。
因此,当您使用 @dynamic 定义属性时,您的超类或运行时应该提供必要的getter和setter。这里没有人提供任何东西,这就是它说无法识别的选择器发送给实例的原因。只有当它无法找到对象的正确方法时才会出现此错误。希望这能清除你的疑虑。
@dynamic的一个实际用途是当你从中继承你的类时 NSManagedObject,核心数据将提供setter和getter 属性。
答案 1 :(得分:0)
此问题与BOOL或NSNumber无关。这是由于您在类Video上调用setIsCustomThumbnail。
您正在执行video.isCustomThumbnail =
或[video setIsCustomThumbnail:]
,但您的班级未声明此isCustomThumbnail
。从你的代码中看起来你错误isCustomThumbnail
,因为有 CustomThumbnail。
所以请下定决心并使用单一名称。