Я работаю через Программирование Какао для Mac OS X (3-е издание) и в главе 4 я написал это приложение:
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, поэтому подсчет ссылок довольно чужд для меня!)