我有一个名为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!
答案 0 :(得分:1)
您撰写的是关于课程SettingsController
,但正在使用课程SyncProgress
。这是什么?
如果您@synthesize
正确@property
,那么您在init
方法中所做的工作应该是正确的,假设您不发布属性 - 或者至少是相同的对象,从你可能有的任何引用 - 稍后,或者以相同的方法或其他地方。换句话说,不会发布自动发布的商品。
FWIW,article that describes the macro表示您应该声明
+ (SettingsController *) sharedSettingsController;
我不能看到你这样做,所以你呢?
您使用类SyncProgress
,而不是SettingsController
。假设你也宣称它是单身,你应该对SyncProgress
:
+ (SyncProgress *) sharedSyncProgress;
init
的{{1}}方法是什么?你是否也设置了SyncProgress
,甚至还有一个? 或者你只是看错了班级?