我通过Cocoa Programming for Mac OS X (3rd ed)并在第4章的工作,我写这个程序:示例可可应用程序,ref计数,[pool drain]产生EXC_BAD_ACCESS?
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
//create the date object
NSCalendarDate *now = [[NSCalendarDate alloc] init];
//seed random # generator
srandom(time(NULL));
NSMutableArray *array;
array = [[NSMutableArray alloc] init];
int i;
for (i=0; i<10; i++){
//create a date/time that is 'i' weeks from now
NSCalendarDate *iWeeksFromNow;
iWeeksFromNow = [now dateByAddingYears:0
months:0
days:(i*7)
hours:0
minutes:0
seconds:0];
//create a new instance of lottery entry
LotteryEntry *entry = [[LotteryEntry alloc] init];
[entry setEntryDate:iWeeksFromNow];
[array addObject:entry];
[entry release];
}
[now release];
now = nil;
for (LotteryEntry *entryToPrint in array) {
NSLog(@"%@", entryToPrint);
}
[array release];
array = nil;
NSLog(@"about to drain the pool... (%@)", pool);
[pool drain];
NSLog(@"done");
NSLog(@"GC = %@", [NSGarbageCollector defaultCollector]);
return 0;
}
的LotteryEntry类看起来是这样的:
@implementation LotteryEntry
- (void)setEntryDate:(NSCalendarDate *)date
{
entryDate = date;
}
- (NSCalendarDate *)entryDate
{
return entryDate;
}
- (int)firstNumber
{
return firstNumber;
}
- (int)secondNumber
{
return secondNumber;
}
- (id)init
{
return [self initWithDate:[NSCalendarDate calendarDate]];
}
- (id)initWithDate:(NSCalendarDate *)date
{
if(![super init])
return nil;
NSAssert(date != nil, @"Argument must be non-nil");
firstNumber = random() % 100 + 1;
secondNumber = random() % 100 + 1;
entryDate = [date retain];
return self;
}
- (NSString *)description
{
NSString *result;
result = [[NSString alloc] initWithFormat:@"%@ = %d and %d",
[entryDate descriptionWithCalendarFormat:@"%b %d %Y"],
firstNumber,
secondNumber];
return result;
}
- (void)dealloc
{
NSLog(@"deallocating %@", self);
[entryDate release];
[super dealloc];
}
@end
正如你可以看到我保持和释放对象这里。我敢肯定我的代码相匹配的书的,但是当我运行应用程序,在[池漏]我得到这个消息:
程序接收到的信号: “EXC_BAD_ACCESS”。
我不确定是什么原因造成的。我希望这是我错过的一些愚蠢的东西,但是我一定会欣赏其他几双眼睛。提前致谢!
(旁注:我是一个.NET开发人员,所以裁判的计数是相当陌生的我)
就像说明一样,您应该使用NSDate,而不是NSCalendarDate。 – 2009-01-23 16:44:26