Objective-c - сохранить счет, когда я меняю вид - PullRequest
0 голосов
/ 08 декабря 2010

Я объявил UIImage и UIImage View в одном контроллере вида следующим образом:

В файле .h:

UIImageView* itemImageView;
UIImage* itemImage;

@property (nonatomic, retain) UIImage* itemImage;
@property (nonatomic, retain) UIImageView* itemImageView;

В файле .m:

@synthesize itemImage, itemImageView;

В другом представлении я устанавливаю его значение:

UIImage *image = [UIImage imageNamed:@"name1.png"];
imgView.itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
imgView.itemImageView.image = image;

[self.parentViewController.view addSubview:imgView.itemImageView];
[self dismissModalViewControllerAnimated:YES];  

В этом методе счет сохранения itemImageView равен 2.

Но когда я возвращаюсь к представлению, в которое я положилсвойство и синтез, количество сохранений равно 0, и я не могу получить доступ к объекту.

Есть идеи, что происходит?

Ответы [ 3 ]

0 голосов
/ 08 декабря 2010

ваша проблема с этой строкой:

[self.parentViewController.view addSubview:imgView.itemImageView];

это, скорее всего, следует отредактировать следующим образом:

[self.parentViewController.view addSubview:self.parentViewController.itemImageView];

это приводит к вопросу о том, действительно ли imgView эквивалентен parentViewController.Посмотреть.если вы хотите, чтобы это было, то вам нужно выяснить, где это было назначено и посмотреть, где вы все испортили.если нет, то нет смысла использовать его для чего-либо, кроме временного контейнера для создания объектов ur перед его назначением.

edit: утечка памяти - это отдельная проблема, да, но я не уверен, как вы объявили imgViewв методе, поэтому я оставил это для вас, чтобы решить:)

0 голосов
/ 08 декабря 2010
UIImageView* itemImageView;
...
@property (nonatomic, retain) UIImageView* itemImageView;
...
imgView.itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];

Это вызывает двойное сохранение, поскольку alloc увеличивает счетчик хранения на 1, как и настройка retain для @property.

Общий шаблон для настройки свойств выглядит следующим образом:Итак:

.h:

SomeClass* someClass;
...
@property (nonatomic, retain) SomeClass* someClass;

.m:

SomeClass* temporarySomeClass = [[SomeClass alloc] init];
self.someClass = temporarySomeClass;
[temporarySomeClass release];
...

Здесь мы используем временную переменную для хранения выделенного нами объекта, а затемвыполняя релиз сразу после.

Вы увидите это в примере кода Apple, наверняка.

0 голосов
/ 08 декабря 2010

Ваш код здесь выглядит нормально. (Помимо утечки памяти) Вы присваиваете ImageView с счетом сохранения +1 для itemImageView, который увеличит его до двух. Вам нужно вызвать release в вашем ImageView после установки его в itemImageView:

UIImageView* iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
imgView.itemImageView = iv;
[iv release];

Однако это не решит вашу проблему (это даже усугубит ..) Можете ли вы показать больше кода? Вы пробовали пройти через это с помощью отладчика?

...