在我的一个简单类的实现中,我在这一行收到错误“无效的接收器类型'NSInteger'”:
self.price = p; // this line throws error
我应该将价格指定为copy
吗?更多细节:
头文件:
@interface SafeItem : NSObject {
NSString *name;
NSInteger price;
NSString *category;
NSInteger itemid;
BOOL hasImage;
}
@property (nonatomic,copy) NSString *name;
@property (nonatomic) NSInteger price;
@property (nonatomic,copy) NSString *category;
@property NSInteger itemid;
@property BOOL hasImage;
- (id)initWithName:(NSString*) n price:(NSInteger) p category:(NSString*) c;
@end
实现:
@implementation SafeItem
@synthesize name, price, category, itemid, hasImage;
- (id)initWithName:(NSString*) n price:(NSInteger) p category:(NSString*) c {
if(self=[super init]){
self.itemid = [SafeItem getNextId];
self.name = [n copy];
self.price = p; // this line throws error
self.category = [c copy];
}
return self;
}
答案 0 :(得分:1)
不,价格不应指定为(copy)
。 copy
和retain
仅用于对象,而不是NSInteger等原始值。
顺便说一下,您已将(copy)
指定为名称和类别属性的属性,但在分配时再次复制它们,这是多余的。为属性指定(copy)
意味着只要您将该属性设置为新值,就会自动调用copy
。
答案 1 :(得分:1)
不,默认assign
就是你想要的。
坦率地说,这个错误对我没有意义 - 代码中是否有其他内容,例如setPrice
的显式实现?在此期间,抓住吸管,尝试在此初始化程序中通过self
省略访问权限。
(实际上,在所有这四项作业中,您使用copy
与直接访问ivars一致。如果您使用的是copy
setter,则无需copy
。 1}}这个论点是先发制人的,并且像你在这里一样做 - 没有相应的release
- 会给你泄密。坚持这样或那样。)