应该保留变量吗? iphone-SDK

时间:2010-03-19 08:50:09

标签: iphone cocoa-touch

在我从书中得到的以下代码中。

NSString * pPath,在类中定义为实例变量。

@interface MainViewController : UIViewController {
    NSString *pPath;
}

在设置后的实现中,它被保留。我假设通过赋值,对象会自动保留(因为它是一个NSString),并且不需要另外保留它。

- (void) initPrefsFilePath { 
     NSString *documentsDirectory = 
     [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 

     pPath = [documentsDirectory stringByAppendingPathComponent: 
           @"flippingprefs.plist"]; 

     [pPath retain]; 
} 

1 个答案:

答案 0 :(得分:3)

是的,如果以这种方式获取,则需要保留pPath变量。然而,它不是故事的结尾 - 你还需要释放它以前的值,否则它只会泄漏。

为了简化操作,您可以使用objective-c属性,这些属性允许您自动生成具有所需内存管理行为的setter / getter方法:

// header
@interface MainViewController : UIViewController {
    NSString *pPath;
}
@property (nonatomic, retain) NSString* pPath;

// implementation

@synthesize pPath;

- (void) initPrefsFilePath { 
     NSString *documentsDirectory = 
     [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 

     self.pPath = [documentsDirectory stringByAppendingPathComponent: 
           @"flippingprefs.plist"]; 
} 

这里在self.pPath=...行中自动生成的setter方法将被调用:

  1. 将发布先前设置的pPath值
  2. 将为pPath分配新值并保留它
  3. 您还需要在dealloc方法中释放您的pPath变量:

    -(void) dealloc{
      [pPath release];
      //or
      self.pPath = nil;
      [super dealloc];
    }