我这里有一个单例类是代码
#import <Foundation/Foundation.h>
#import "CustomColor.h"
@interface Properties : NSObject {
UIColor *bgColor;
CustomColor *bggColor;
}
@property(retain) UIColor *bgColor;
@property (retain) CustomColor *bggColor;
+ (id)sharedProperties;
@end
#import "Properties.h"
static Properties *sharedMyProperties = nil;
@implementation Properties
@synthesize bgColor;
@synthesize bggColor;
#pragma mark Singleton Methods
+ (id)sharedProperties
{
@synchronized(self)
{
if(sharedMyProperties == nil)
[[self alloc] init];
}
return sharedMyProperties;
}
+ (id)allocWithZone:(NSZone *)zone
{
@synchronized(self)
{
if(sharedMyProperties == nil)
{
sharedMyProperties = [super allocWithZone:zone];
return sharedMyProperties;
}
}
return nil;
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain {
return self;
}
- (unsigned)retainCount {
return UINT_MAX; //denotes an object that cannot be released
}
- (void)release {
// never release
}
- (id)autorelease {
return self;
}
- (id)init {
if (self = [super init])
{
bgColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1.0];
FSColor *bc = [[FSColor alloc] init];
bc.red = bc.green = bc.blue = bc.hue = bc.sat = bc.bri = 0;
bggColor = bc;
}
return self;
}
- (void)dealloc
{
// Should never be called, but just here for clarity really.
[bgColor release];
[bggColor release];
[super dealloc];
}
@end
我有一个UIView'子类。我正在使用它。我每秒钟后调用drawRect方法。它只运行一次然后应用程序崩溃。
- (void)drawRect:(CGRect)rect
{
Properties *sharedProprties = [Properties sharedProperties];
…...
….
CGContextSetFillColorWithColor(context, [[sharedProprties bgColor] CGColor]);
…..
}
答案 0 :(得分:2)
如果你self.bgColor = [UIColor colorWithRed:...]
怎么办?
没有self.
我认为您可能直接访问ivar
,因此为其分配一个自动释放的对象,该对象不会长时间存在(而不是使用合成的属性设置器,它会保留它)。我可能错了,我坚持使用较旧的Mac OS X系统,因此我无法使用Objective-C 2.0。
答案 1 :(得分:0)
永远不会分配您的静态sharedProperties。它在init方法或sharedProperties静态方法中缺失。
以下是singletons(上一篇文章)
的示例模式同时访问没有自己的属性。也可能导致错误的访问错误。
此致
答案 2 :(得分:0)
不是答案,但请注意,对[Properties alloc]
的简单调用将意味着它不再是单身人士!
+ (id)sharedProperties
{
@synchronized(self)
{
if(sharedMyProperties == nil)
{
sharedMyProperties = [[self alloc] init];
}
}
return sharedMyProperties;
}