Использование синтезированного мутатора против присвоения - PullRequest
0 голосов
/ 28 июля 2011

В моей программе я присваиваю значение свойству в методе init. Позже я использую это свойство в ответ на событие.

Дано свойство с именем Object; почему работает синтезированный сеттер [self setObject:obj], но Object = obj выдает исключение Invalid Selector? Это потому, что мутатор добавляет один к счетчику ссылок на obj?

Редактировать: Вот еще код, чтобы дать контекст. Когда я говорю «работа» выше, я имею в виду запустить без ошибок.

Вот инициализация объекта (A View Controller), который имеет свойство в нем:

Примечание: Все свойства объявлены как (nonatomic, retain).

@synthesize _Kiosk;

....

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andKiosk: (Kiosk*) kiosk
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        [self set_Kiosk:kiosk]; //This work witout error. _kiosk = kiosk Fails at point below.
    }
    return self;
}

....

- (IBAction) ActionPressed:(id)sender
{
    [_CompanyName setText: [_Kiosk _CompanyName]];  //Failure happens here
}

А вот вызов метода, который инициализирует этот View Controller:

@synthesize _Kiosk;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [[UIApplication sharedApplication] setStatusBarHidden:true withAnimation:UIStatusBarAnimationFade];

    _Kiosk = [[Kiosk alloc] init];
    self.window.rootViewController = [_KioskViewController initWithNibName:@"iPadKioskView" bundle:nil andKiosk: _Kiosk];

    [_Kiosk release];
    [self.window makeKeyAndVisible];
    return YES;
}

Ответы [ 3 ]

1 голос
/ 28 июля 2011

@property в основном просто объявляет два метода: setFoo: и foo. @synthesize создаст тела методов для этих методов, которые правильно сохранят новое значение и освободят старое.

Однако непосредственное присвоение переменной экземпляра не вызывает эти методы доступа. Он просто указывает указатель на новый объект. Если вы собираетесь вручную установить переменную экземпляра, вам необходимо убедиться, что вы правильно сохранили новое значение и освободили старое.

Обратите внимание, что [self setFoo:someFoo] и self.foo = someFoo будут вызывать метод доступа, тогда как foo = someFoo просто устанавливает переменную экземпляра напрямую, минуя ваш метод установки.

1 голос
/ 28 июля 2011

Ваш опубликованный код дал ответ. Вы уже установили _Kiosk, поэтому не отпускайте его. Нет необходимости назначать _Kiosk в initWithNibName: и т. Д. больше. Просто отпустите киоск в методе dealloc. Если вы хотите изменить киоск, используйте class.Kiosk =, чтобы вызвать свойство, которое обязательно сохранит его и освободит предыдущий киоск.

0 голосов
/ 28 июля 2011

Вы обязательно должны сохранить свой параметр киоска в методе [init ..].В противном случае оно будет выпущено, и вы получите ошибку рано или поздно.

Один из способов - сделать это самостоятельно, вызвав для него команду retain, или вы можете использовать синтезированный сеттер, если он определен как (неатомный, сохранить ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...