我有一个包含此代码的单例类:
manager.h
@interface Manager : NSObject {
NSString *jobsLimit;
NSMutableDictionary *jobTitles;
}
@property (nonatomic, retain) NSString *jobsLimit;
@property (nonatomic, assign) NSMutableDictionary *jobTitles;
@implementation Manager
@synthesize jobsLimit;
@synthesize jobTitles;
+ (id)sharedManager {
@synchronized(self) {
if(shared == nil)
shared = [[super allocWithZone:NULL] init];
}
return shared;
}
- (id)init {
if (self = [super init]) {
jobsLimit = [[NSString alloc] initWithString:@"50"];
jobTitles = [[NSMutableDictionary alloc] init];
}
return self;
}
然后在代码中我分配这些变量:
self.jobsLimit = [NSString stringWithFormat:@"%d", progressAsInt];
[self.jobTitles addEntriesFromDictionary:anotherDictionary];
- (void)dealloc {
[super dealloc];
[jobsLimit release];
[jobTitles release];
}
现在我的问题是这段代码是否正确?作业是否正确?
我对何时使用alloc和/或retain非常困惑。如果我的财产已被保留,我是否需要使用alloc?如果我使用alloc应该分配我的财产吗?
现在这些变量的引用计数是什么,并且在调用dealloc时它们是否会被dealloc'd / under-dealloc?
同样对于单身人士课程,我需要像上面的init方法一样初始化我的ivars,或者我不需要。
如果有人能帮助我清除这种混乱并提前感谢,我将不胜感激。
此致
答案 0 :(得分:2)
我猜你需要很多:IOS Memory Management
好的讲座!答案 1 :(得分:2)
你的代码实际上看起来是正确的,但也许有些解释是正确的,因为听起来你有点不确定。
使用“。”分配给具有retain
语义的属性时。语法,访问器方法调用retain
。 “。”语法只是调用访问器方法的简写,所以
self.jobsLimit = [NSString stringWithFormat:@"%d", progressAsInt];
与
完全相同[self setJobsLimit:[NSString stringWithFormat:@"%d", progressAsInt]];
这可以解决:
retain
字符串(您现在拥有它)并将其分配给jobsLimit
另一方面,如果直接分配给iVar(不使用“。” - 访问器),则不调用setter方法。例如:
jobsLimit = [[NSString alloc] initWithString:@"50"];
那是:
无论哪种方式,您现在拥有jobsLimit
引用的字符串,并负责最终释放它(例如,在您的dealloc
方法中)。