目标C:保留vs alloc

时间:2010-12-21 17:22:29

标签: iphone objective-c

我有一个包含此代码的单例类:

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,或者我不需要。

如果有人能帮助我清除这种混乱并提前感谢,我将不胜感激。

此致

2 个答案:

答案 0 :(得分:2)

我猜你需要很多:IOS Memory Management

和一点:What should my Objective-C singleton look like?

好的讲座!

答案 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"];

那是:

  • 分配一个字符串(您拥有它),值为“50”
  • 将其分配给jobsLimit

无论哪种方式,您现在拥有jobsLimit引用的字符串,并负责最终释放它(例如,在您的dealloc方法中)。