Различить iVar и параметр метода? - PullRequest
1 голос
/ 16 сентября 2011

У меня есть такое свойство:

@property (nonatomic, strong) IBOutlet UIImageView *backgroundImageHolder;

Я хочу настроить установщик, и XCode заполняет сигнатуру метода следующим образом:

-(void)setBackgroundImageHolder:(UIImageView *)backgroundImageHolder {

Однако, чтобы действительно что-то сделать в методе, я должен изменить параметр backgroundImageHolder на что-то вроде backgroundImageHolderIn. Есть ли способ избежать этого? Есть ли способ установить iVar, не вызывая повторно установщик (вызывая бесконечный цикл) или просто снова ссылаясь на параметр?

Я только что попробовал:

self->backgroundImageHolder = backgroundImageHolder;

но компилятор все равно предупреждает меня.

Примечание: Я использую автоматически сгенерированный iVar, который компилятор создает для свойства, но по умолчанию его имя совпадает.

Ответы [ 4 ]

1 голос
/ 16 сентября 2011

Ну, конфликтующее имя параметра, похоже, уже довольно хорошо охвачено. По сути, вы должны либо:

  • Переименовать входящий аргумент
  • Переименуйте синтезированный iVar

Если у вас есть аргумент метода, отличный от iVar, который вы пытаетесь установить, у вас есть все, что вам нужно для написания пользовательского установщика. Чтобы избежать бесконечного цикла, вы не должны вызывать тот установщик, который вы сейчас реализуете, будь то с помощью точечного синтаксиса или синтаксиса метода скобок. Вместо этого обратитесь непосредственно к поддержке iVar. Вам нужно будет позаботиться о том, чтобы вручную реализовать семантику управления памятью, которую вы объявили в свойстве (хотя назначьте или сохраните и т.

// Backed by _myProperty iVar.
- (void)setMyProperty:(NSInteger)myProperty {

    // Insert custom code here...

    [self setMyProperty:myProperty]; // Obviously bad.

    self.myProperty = myProperty;    // Less obviously bad (thanks dot syntax)
                                     // but semantically identical to the previous line.

    _myProperty = myProperty         // Good, (assuming assign semantics).
}
1 голос
/ 16 сентября 2011

Вы можете указать компилятору, как назвать сгенерированный ивар:

@synthesize propertyName = iVarName;

Если на самом деле существует ивар с именем iVarName, который используется.Если он не существует, компилятор создаст его для вас.

Например:

@synthesize backgroundImageHolder = myBackgroundImageHolder;

Теперь вы можете получить доступ к переменной экземпляра myBackgroundImageHolder.Вам не нужно сначала объявлять это в интерфейсе.

0 голосов
/ 16 сентября 2011

Самое ясное, что можно сделать, это:

В своем заголовке определите iVar для backgroundImageHolder следующим образом:

@interface Something : NSObject
{
  IBOutlet UIImageView *_backgroundImageHolder
}

Обратите внимание на начальное подчеркивание.

Затем в вашем файле .m используйте любой синтезированный вызов, например:

@synthesize backgroundImageHolder=_backgroundImageHolder;

или просто определите методы получения и установки самостоятельно: тогда вы сможете получить доступ к ивару через "_backgroundImageHolder" без какой-либо опасности случайного повторного вызова метода установки.

0 голосов
/ 16 сентября 2011

Компилятор предупреждает вас, потому что, когда вы объявляете @property, он создает переменную экземпляра с точно таким же именем, что и свойство (и как параметр метода метода set). Один из способов избежать этого - создать переменную экземпляра с другим именем, а затем связать ее со свойством, используя @synthesize, например:

// .h
@interface Foo : NSObject {
    IBOutlet UIImageView *myfooImageView;
}

@property (nonatomic, retain) UIImageView *publicFooImageView;

// .m
@implementation Foo
@synthesize publicFooImageView=myfooImageView;
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...