1. Учитывая следующий код:
void make_objc_array()
{
NSArray *array = [NSArray arrayWithObjects:@1, @2, nil];
NSLog(@"%@", array.lastObject);
}
void make_objc_dictionary()
{
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@1, @"1", @2, @"2", nil];
NSLog(@"%@", dictionary[@"2"]);
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
make_objc_array();
}
make_objc_dictionary();
return 0;
}
Утечка при вызове функции make_objc_dictionary(); объекта NSDictionary, поскольку он находится вне блока @autorelease?
2. Рассмотрим этот фрагмент кода:
- (void)someMethod
{
NSNumber *num[2] = {@1, @2};
...
}
Что мне нужно сделать для управления памятью для массива NSObject C, или ARC сделает все правильно? Или есть случай, когда ARC не будет работать при смешивании C и Objective-C?
Некоторое уточнение: ARC не будет обрабатывать ничего, что вы malloc (или подобное). Вы должны соблюдать все стандартные правила управления памятью C. ARC управляет только сообщениями retain и release (и подобными) для объектов Objective-C. Я полагать, он отлично справился бы с вашим примером из-за того, что в ARC не разрешено использование ручного release. I считать объекты в массиве C будут освобождены, когда массив выходит за пределы области видимости, а сам массив находится в стеке и не требует управления памятью.





«[M] ixing C и Objective-C» ничем не отличается от программирования в Objective-C. Objective-C включает в себя C. Ни в одном из ваших фрагментов кода нет ничего, кроме Objective-C.
ARC поступит правильно в ваших примерах. ARC не управляет выделением большей части не объектной памяти. Он не управляет CoreFoundation. Он не управляет malloc() и подобными функциями.
Другой случай, когда ARC не может помочь, - это создание сильных ссылочных циклов.
Наконец, программы не пропускают память «навсегда», то есть после выхода. Если ваша программа вот-вот завершится, например, return от main(), вам не нужно беспокоиться о выделенной вами памяти, потому что она будет освобождена операционной системой после завершения работы вашей программы.
ARC будет обрабатывать
make_objc_dictionary. Я не уверен на 100% в семантике ARC массивов в стиле C, поскольку нет особых причин использовать их вместоNSArray. Следует отметить, что вы не можете смешиватьCиObjective-C, поскольку последний является строгим надмножествомC; следовательно, кодCявляется частьюObjective-C.