Ios Xcode要求我将属性重新声明为实例变量
我有一个名为Ios Xcode要求我将属性重新声明为实例变量,ios,iphone,objective-c,xcode,ipad,Ios,Iphone,Objective C,Xcode,Ipad,我有一个名为SCPFAd的对象,它在其头文件中声明如下: @interface SCPFAd : NSObject @property (strong, nonatomic) NSArray *imageURLs; @property (strong, nonatomic) NSString *title; @property (strong, nonatomic) NSString *price; @property (strong, nonatomic) NSString *longDes
SCPFAd
的对象,它在其头文件中声明如下:
@interface SCPFAd : NSObject
@property (strong, nonatomic) NSArray *imageURLs;
@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic) NSString *price;
@property (strong, nonatomic) NSString *longDescription;
@property (strong, nonatomic) SCPFLocation *location;
@property (strong, nonatomic) SCPFCategory *category;
@property (strong, nonatomic) NSArray *properties;
@property (readonly, strong, nonatomic) NSString *sellerID;
@property (readonly, strong, nonatomic) NSString *timePosted;
- (id)initWithRawData:(NSDictionary *)rawData;
- (BOOL)displaysPrice;
@end
在实现文件中,我以这种方式声明了一个SCPFAd
扩展名:
@interface SCPFAd ()
{
NSMutableDictionary *_rawData;
NSMutableArray *_imageURLs;
NSString *_title;
NSString *_price;
NSString *_longDescription;
SCPFLocation *_location;
SCPFCategory *_category;
NSMutableArray *_properties;
}
@property (strong, nonatomic) NSDictionary *rawData;
@property (strong, nonatomic) NSString *sellerID;
@property (strong, nonatomic) NSString *timePosted;
@property (strong, nonatomic) NSString *adID;
@end
我故意将属性rawData
、imageurl
和properties
重新声明为实例变量,因为我希望外部对象将它们作为不可变类型进行访问或分配,但我将在内部对其进行更改
我不明白的是,当我重写setter时,为什么会出现一个编译器错误,说它找不到变量\u title
,\u price
,\u longDescription
,\u location
和\u category
。当我如上所述重新声明title
、price
、longDescription
、location
和category
时,错误就消失了,但我认为这是不必要的——类扩展中的任何内容都不会更改它们的外部声明
这就是我覆盖setTitle
的方式,例如:
- (void)setTitle:(NSString *)title
{
_title = title;
_rawData[@"name"] = title;
}
- (NSString *)title
{
if (!_title) {
_title = _rawData[@"name"];
}
return _title;
}
如果我注释掉
NSString*\u title在扩展中,编译器说它在setter的第一行中找不到\u title
,也找不到getter中出现的任何地方。不过,即使没有重新声明,getter过去也可以正常工作。如果实现getter,编译器不会自动创建ivar
这是有充分理由的。属性可以(而且,根据我的经验,通常是)根据请求创建并返回,因此在这种情况下,不需要实例变量来存储它,如果每个getter都有一个关联的ivar,那么它将为具有大量此类属性的类增加大量内存开销
还有一条评论。这:
NSMutableDictionary *_rawData;
// ...
@property (strong, nonatomic) NSDictionary *rawData;
可能会给你带来麻烦。如果rawData是使用不可变字典设置的,那么当您稍后尝试对其进行变异时,它将引发异常。确保使用-mutableCopy
在分配时复制它。(我假设您没有复制它,因为它被标记为strong
,而不是copy
。如果是,就可以了)如果实现getter,编译器不会自动创建ivar
这是有充分理由的。属性可以(而且,根据我的经验,通常是)根据请求创建并返回,因此在这种情况下,不需要实例变量来存储它,如果每个getter都有一个关联的ivar,那么它将为具有大量此类属性的类增加大量内存开销
还有一条评论。这:
NSMutableDictionary *_rawData;
// ...
@property (strong, nonatomic) NSDictionary *rawData;
可能会给你带来麻烦。如果rawData是使用不可变字典设置的,那么当您稍后尝试对其进行变异时,它将引发异常。确保使用-mutableCopy
在分配时复制它。(我假设您没有复制它,因为它被标记为strong
,而不是copy
。如果是,就可以了)如果实现getter,编译器不会自动创建ivar
这是有充分理由的。属性可以(而且,根据我的经验,通常是)根据请求创建并返回,因此在这种情况下,不需要实例变量来存储它,如果每个getter都有一个关联的ivar,那么它将为具有大量此类属性的类增加大量内存开销
还有一条评论。这:
NSMutableDictionary *_rawData;
// ...
@property (strong, nonatomic) NSDictionary *rawData;
可能会给你带来麻烦。如果rawData是使用不可变字典设置的,那么当您稍后尝试对其进行变异时,它将引发异常。确保使用-mutableCopy
在分配时复制它。(我假设您没有复制它,因为它被标记为strong
,而不是copy
。如果是,就可以了)如果实现getter,编译器不会自动创建ivar
这是有充分理由的。属性可以(而且,根据我的经验,通常是)根据请求创建并返回,因此在这种情况下,不需要实例变量来存储它,如果每个getter都有一个关联的ivar,那么它将为具有大量此类属性的类增加大量内存开销
还有一条评论。这:
NSMutableDictionary *_rawData;
// ...
@property (strong, nonatomic) NSDictionary *rawData;
可能会给你带来麻烦。如果rawData是使用不可变字典设置的,那么当您稍后尝试对其进行变异时,它将引发异常。确保使用-mutableCopy
在分配时复制它。(我假设您没有复制它,因为它被标记为strong
,而不是copy
。如果是,那就好了)如果您声明一个属性,然后覆盖getter和setter,它将不会自动合成该属性。但您可以只添加一行代码,将其合成到您的实现中:
@synthesize title = _title;
至于让一个属性是不可变类型,并且它的支持实例变量是可变的,当从类外部将不可变类型分配给它时,您会遇到一个问题,并且您将其视为可变版本,因为它不会响应方法对其进行变异。例如,将NSArray
分配给变量,然后尝试将其视为NSMutableArray
,它将不起作用。如果声明一个属性,然后覆盖getter和setter,它将不会自动合成该属性。但您可以只添加一行代码,将其合成到您的实现中:
@synthesize title = _title;
至于让一个属性是不可变类型,并且它的支持实例变量是可变的,当从类外部将不可变类型分配给它时,您会遇到一个问题,并且您将其视为可变版本,因为它不会响应方法对其进行变异。例如,将NSArray
分配给变量,然后尝试将其视为NSMutableArray
,它将不起作用。如果声明一个属性,然后覆盖getter和setter,它将不会自动合成该属性。但您可以只添加一行代码,将其合成到您的实现中:
@synthesize title = _title;
至于让属性是不可变的类型,而它的支持实例变量是可变的,那么当从类外部创建不可变的类型时,您将遇到一个问题