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\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;
至于让属性是不可变的类型,而它的支持实例变量是可变的,那么当从类外部创建不可变的类型时,您将遇到一个问题