Да, каждая функция должна иметь прототип, но тот прототип может появиться или в отдельном объявлении или как часть определения функции. Функциональные определения, записанные в C89 и естественно, имеют прототипы, но если Вы пишете вещи в классическом K& R стиль, таким образом:
main (argc, argv)
int argc;
char **argv;
{
...
}
тогда функциональное определение не имеет никакого прототипа. Если Вы пишете ANSI C (C89) стиль, таким образом:
main (int argc, char **argv) { ... }
тогда функциональное определение имеет прототип.
После миллиона различных попыток я наконец наткнулся на этот форум .
В нем говорится:
Очевидно, изображения, назначенные в IB, загружаются в представления изображений с использованием
imageName
.imageNamed
кэширует изображения таким образом, чтобы их можно было выгружать. Вы можете загрузить изображения вviewDidLoad
с помощьюinitWithContentsOfFile
, а затем назначить их представлениям.
Где-то еще я читал, что imageNamed
- это дьявол ], поэтому я бы предпочел, чтобы мои изображения не загружались таким образом.
(Кстати, я использую iPhone OS 3.1)
В итоге я оставил UIImageView
нетронутым в IB, но с пустым значением .image
. Модифицированный код выглядит примерно так:
- (void)viewDidLoad {
NSString *path = [NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], @"myImageThatBeforeWasAValueinIB.jpg"];
UIImage *image = [UIImage imageWithContentsOfFile:path];
outlet.image = image;
// do the rest of my stuff as it was
[super viewDidLoad];
}
- (void)dealloc {
outlet.image = nil;
[outlet release], outlet = nil;
[super dealloc];
}
И теперь все работает как шарм! Память восстанавливается, когда я выгружаю перо и когда получаю предупреждения о памяти.
В значительной степени, если у вас есть IBOutlets
для UIImageView
s, а память - это проблема (это всегда я угадайте), вы можете спроектировать все, что хотите, в IB, и когда придет время подключить их к розеткам, удалить ссылку на изображение в IB и создать его из кода. IB действительно хорош для создания вашего приложения. Было бы отстойно делать все это с помощью кода, но я также нашел эту прекрасную утилиту, которая конвертирует перья в код цели c , хотя я еще не тестировал ее.
Вы пытались установить нулевые переменные выхода в dealloc? You are correctly implementing the setView method, but you are setting your outlet variables to nil in the viewDidUnload method instead of dealloc. As discussed here, you should implement dealloc as follows:
- (void)setView:(UIView *)aView {
if (!aView) { // view is being set to nil
// set outlets to nil, e.g.
self.anOutlet = nil;
}
// Invoke super's implementation last
[super setView:aView];
}
- (void)dealloc {
// release outlets and set outlet variables to nil
[anOutlet release], anOutlet = nil;
[super dealloc];
}
EDIT: if the outlets are UIImageViews, then it may be the case that you need to do
anOutlet.image = nil;
because setting the UIImage’s instance image property should increase the retain count of the UIImage’s instance by 1.