保留属性指向错误的地址

时间:2011-08-30 14:43:23

标签: objective-c properties

我有一个名为formatter的ivar单例类。有一些代码:

@interface SettingsController : NSObject {

    NSDateFormatter *formatter;  
}

@property (nonatomic,retain,readwrite)  NSDateFormatter *formatter;




@implementation SettingsController

@synthesize formatter,;

SYNTHESIZE_SINGLETON_FOR_CLASS(SettingsController);

-(id)init
{
 if ( (self = [super init]) )
  {
        ...
        self.formatter = [[[NSDateFormatter alloc] init] autorelease];
        ...
  }

问题是,当我试图让这个格式化程序如何:

[[SettingsController sharedSettingsController] formatter]

错过了价值。有格式化程序指向的地址有NSDate,NSString甚至我自己的类实例。

我尝试使用[[NSDateFormatter alloc] init]但只有[[[NSDateFormatter alloc] init] retain]使问题消失。

当我使用@property(非原子,保留,读写)并且从未将此ivar重置为其他值时,怎么可能呢?

EDITE:在我为NSDateFormatter创建子类之后,我清楚而轻松地看到了发布应用程序的版本。 非常感谢progrmr!

1 个答案:

答案 0 :(得分:1)

您撰写的是关于课程SettingsController,但正在使用课程SyncProgress。这是什么?

如果您@synthesize正确@property,那么您在init方法中所做的工作应该是正确的,假设您不发布属性 - 或者至少是相同的对象,从你可能有的任何引用 - 稍后,或者以相同的方法或其他地方。换句话说,不会发布自动发布的商品

FWIW,article that describes the macro表示您应该声明

+ (SettingsController *) sharedSettingsController;

我不能看到你这样做,所以你呢?

使用SyncProgress,而不是SettingsController。假设你也宣称它是单身,你应该对SyncProgress

做同样的事情
+ (SyncProgress *) sharedSyncProgress; 

init的{​​{1}}方法是什么?你是否也设置了SyncProgress,甚至还有一个? 或者你只是看错了班级