2010-12-21 58 views
0

我有這個代碼單例類:目標C:保留VS ALLOC

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被稱爲才具dealloc'd /下dealloc'd?

  • 也爲單班我是否需要初始化我的ivars如上面的init方法我沒有。

我很感激,如果有人能幫助我清除這種困惑,並提前感謝。

問候,

回答

2

你的代碼實際上看起來是正確的,但也許一些解釋是爲了,因爲它聽起來像你有點不確定。

當你分配到具有使用retain語義屬性「」語法,訪問器方法調用retain。 「。」語法是調用訪問方法只是簡寫,所以

self.jobsLimit = [NSString stringWithFormat:@"%d", progressAsInt]; 

是完全一樣的

[self setJobsLimit:[NSString stringWithFormat:@"%d", progressAsInt]]; 

這工程以:

  • 創建(自動釋放)串數字值
  • retain字符串(你現在擁有它),並將其分配給jobsLimit

如果,另一方面,分配給直接伊娃(不使用「」 - 存取),setter方法沒有被調用。例如:

jobsLimit = [[NSString alloc] initWithString:@"50"]; 

即:

  • 分配一個字符串(你擁有它),有值 「50」
  • 將其分配給jobsLimit

無論哪種方式,你現在擁有jobsLimit所指的字符串,並負責最終釋放它(例如,在您的dealloc方法中)。

+0

非常感謝大衛,但現在「[[NSString alloc] ..」中的alloc'd字符串會自動解除分配,因爲jobsLimit指向另一個字符串「[NString stringWith ...」?? ? – mshaaban 2010-12-21 18:55:04