我有一个名为 formatter 的单例类。有一些代码:
@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]
值(value)被遗漏了。在格式化程序指向的地址处有 NSDate、NSString 甚至我自己的类实例。
我已经尝试使用 [[NSDateFormatter alloc] init] 但只有 [[[NSDateFormatter alloc] init] retain] 才能使问题消失。
当我使用@property (nonatomic,retain,readwrite) 并且从未将此 ivar 重置为另一个值时,这怎么可能?
编辑: 在我为 NSDateFormatter 创建子类之后,我清楚而轻松地看到了制作秋季应用程序的版本。 非常感谢 progrmr!
最佳答案
您写的是 SettingsController
类,但使用的是 SyncProgress
类。是哪个?
如果你正确地 @synthesize
d @property
,你在 init
方法中所做的应该是正确的,假设你 < strong>不要释放属性——或者至少是同一个对象,不管你可能有什么引用——以后,无论是在同一个方法中还是在其他地方。换句话说,不要发布自动发布的项目。
FWIW,article that describes the macro说你应该声明
+ (SettingsController *) sharedSettingsController;
我看不到你这样做,你也是吗?
并且您正在使用类SyncProgress
,而不是SettingsController
。假设您也将其声明为单例,您应该对 SyncProgress
执行相同的操作:
+ (SyncProgress *) sharedSyncProgress;
SyncProgress
的init
方法是什么?您是否也在那里设置了 formatter
,它甚至有一个吗? 还是您看错了类?
关于objective-c - 保留属性指向错误的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7245043/