iPhone .. NSString выпущен и сдан - но я не могу сказать, где и почему - PullRequest
0 голосов
/ 21 июня 2010

Это убивает меня!

У меня есть вид. в .h файле я делаю это:

@interface SearchLogs : UIViewController <UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate, UIActionSheetDelegate, UIPickerViewDelegate> {

NSString *startDate;
NSDateFormatter *thisFormatter;
}


@property (nonatomic, retain) NSString *startDate;
@property (nonatomic, retain) NSDateFormatter *thisFormatter;
@end

В @interface и @properties есть и другие вещи ... но я делаю это startDate.

в файле .m я делаю это:

@implementation SearchLogs

@synthesize startDate;
@synthesize thisFormatter;

 - (void)viewDidLoad {
  NSLog(@"viewDidLoad\n");
  [super viewDidLoad];

 thisFormatter = [[NSDateFormatter alloc] init];
[thisFormatter setDateFormat:@"yyyy-MM-dd"];

  NSDate *today = [[NSDate alloc] init];
  NSLog(@"startDate refcount: '%i'\n",[startDate retainCount]);
  startDate = [thisFormatter stringFromDate:today];
  NSLog(@"startDate refcount: '%i'\n",[startDate retainCount]);
  [today release];
 }


- (void)viewWillAppear:(BOOL)animated {
 NSLog(@"viewWillAppear\n");
 [super viewWillAppear:animated];
 NSLog(@"startDate refcount: '%i'\n",[startDate retainCount]);
}


- (void)viewDidAppear:(BOOL)animated {
 NSLog(@"viewDidAppear\n");
 [super viewDidAppear:animated];
 NSLog(@"startDate refcount: '%i'\n",[startDate retainCount]);

}

#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
 NSLog(@"numberOfSectionsInTableView\n");
 // Return the number of sections.
 NSLog(@"startDate refcount: '%i'\n",[startDate retainCount]);   
 return 6;

}

- (void)dealloc {

[startDate release];
 [thisFormatter release];

}

Вот моя проблема: мое приложение падает на numberOfSectionsInTableView

Вот лог:

2010-06-20 17:35:22.363 cConnect[10529:207] viewDidLoad
2010-06-20 17:35:22.376 cConnect[10529:207] startDate refcount: '0'
2010-06-20 17:35:22.378 cConnect[10529:207] startDate refcount: '1'
2010-06-20 17:35:22.378 cConnect[10529:207] viewWillAppear
2010-06-20 17:35:22.379 cConnect[10529:207] startDate refcount: '1'
2010-06-20 17:35:22.379 cConnect[10529:207] viewDidAppear
2010-06-20 17:35:22.380 cConnect[10529:207] startDate refcount: '1'
2010-06-20 17:35:22.381 cConnect[10529:207] numberOfSectionsInTableView
2010-06-20 17:35:22.381 cConnect[10529:207] *** -[CFString retainCount]: message sent to deallocated instance 0x5da5730

Мой главный вопрос - ПОЧЕМУ? startDate никогда не выпускается явно в моем коде. Есть ли что-то, что я делаю, чтобы освободить его, не зная об этом?

ТИА

МЕДЛЕННОЕ РЕДАКТИРОВАНИЕ:

Я попытался заменить:

startDate = [thisFormatter stringFromDate:today];

с:

startDate = [[thisFormatter stringFromDate:today] retain];

и он больше не падает! Я думал, что NSDateFormatter застрял, пока переменная больше не нуждалась в этом ... :( Я неправильно понимаю вспомогательные методы?

Ответы [ 2 ]

6 голосов
/ 21 июня 2010

Ваша проблема

 startDate = [thisFormatter stringFromDate:today];

Это дает вам автоматически выпущенную строку. Вы должны сохранить это. Либо использовать

startDate = [thisFormatter stringFromDate:today];
[startDate retain];

Или используйте свойство и вызовите установщик:

self.startDate = [thisFormatter stringFromDate:today];
1 голос
/ 21 июня 2010

Вам необходимо установить дату начала с помощью self.startdate в viewDidLoad - таким образом вы вызовете метод доступа и будете использовать retain в своем операторе @property. Без этого вы просто устанавливаете значение напрямую, и, поскольку это объект с автоматическим освобождением, вы теряете его до того, как произойдет numberOfSectionsInTableView.

...