Objective c 保留指向错误地址的属性
我有一个名为formatter的ivar单例类。有一些代码:Objective c 保留指向错误地址的属性,objective-c,properties,Objective C,Properties,我有一个名为formatter的ivar单例类。有一些代码: @interface SettingsController : NSObject { NSDateFormatter *formatter; } @property (nonatomic,retain,readwrite) NSDateFormatter *formatter; @implementation SettingsController @synthesize formatter,; SYNTH
@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(非原子,retain,readwrite)而从不将这个ivar重置为另一个值时,这怎么可能呢
EDITE:在我为NSDateFormatter创建了子类之后,我清楚而容易地看到了制作秋季应用程序的版本非常感谢progrmr您编写了关于类
设置控制器的内容,但使用的是类同步进程。是哪一个
如果您正确地@合成@属性
,那么您在显示的init
方法中所做的应该是正确的,假设您以后没有在相同的方法或其他地方释放该属性,或者至少从对它的任何引用中释放相同的对象。换句话说,不要释放自动释放的项目
FWIW,海关说你应该申报
+ (SettingsController *) sharedSettingsController;
我看不到你这么做,你也是吗
您使用的是类SyncProgress
,而不是设置控制器。假设您也声明为singleton,那么对于SyncProgress
,您也应该这样做:
+ (SyncProgress *) sharedSyncProgress;
SyncProgress
的init
方法是什么?您是否也在那里设置了格式化程序
,它甚至有一个或者您只是查看了错误的类?一定有什么东西正在向您分配的格式化程序发送版本,但我看不到您发布的代码的位置。如果您真的想知道,请创建一个子类NSDateFormatter并用它代替NSDateFormatter,在子类中重写release(确保调用super release),然后在该release函数中设置一个断点以查看调用它的所有位置。嗯…谢谢。将这样做,并张贴结果!