【问题标题】:Objective C: retain vs alloc目标 C:保留与分配
【发布时间】:2010-12-21 17:22:28
【问题描述】:

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

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 吗?如果我使用 alloc 应该分配我的属性吗?

  • 现在这些变量的引用计数是多少?当调用 dealloc 时,它们是否会被释放/释放不足?

  • 对于单例类,我是否需要像上面的 init 方法一样初始化我的 ivars,或者我不必这样做。

如果有人能帮我解决这个困惑,我将不胜感激,并在此先感谢。

问候,

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    您的代码实际上看起来是正确的,但也许需要一些解释,因为听起来您有点不确定。

    当您使用“.”分配给具有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 方法中)。

    【讨论】:

    • 非常感谢大卫,但现在 "[[NSString alloc] .." 中的分配字符串是否会被释放,因为现在 jobsLimit 指向另一个字符串 "[NString stringWith 。 ..”???
    • 只要使用访问器方法(self.jobsLimit = ...)进行赋值就可以了:访问器方法在分配新值之前对旧值调用release .
    【解决方案2】:

    我猜你需要很多这个:IOS Memory Management

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

    讲课很好!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2012-06-21
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多