使用合成的mutator与赋值

时间:2011-07-28 07:42:06

标签: objective-c

在我的程序中,我正在为init方法中的属性赋值。我稍后使用此属性来响应事件。

给定一个名为Object的属性; 为什么合成的setter [self setObject:obj]可以正常工作,但是Object = obj会给出一个无效的选择器异常?是因为mutator在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 个答案:

答案 0 :(得分:1)

@property基本上只声明了两种方法:setFoo:foo@synthesize将为这些方法创建方法体,这些方法将正确保留新值并释放旧值。

但是,直接分配给实例变量不会调用这些访问器方法。它只是使指针指向一个新对象。如果您要手动设置实例变量,则需要确保正确保留新值并释放旧值。

请注意,[self setFoo:someFoo]self.foo = someFoo都会调用访问器方法,而foo = someFoo只是直接设置实例变量,绕过你的setter方法。

答案 1 :(得分:1)

您发布的代码给出了答案。你已经设置了_Kiosk,所以不要发布它。无需在initWithNibName中分配_Kiosk:等。了。只需在dealloc方法中释放Kiosk即可。如果您想更改Kiosk,请使用class.Kiosk =,以便调用该属性,该属性必须保留该属性并释放以前的自助服务终端。

答案 2 :(得分:0)

您最终必须在[init ..]方法中保留您的kiosk参数。否则它将被释放,并且您很快或稍后会收到错误。

一种方法是通过调用retain来自己完成,或者你可以使用合成的setter,如果它被定义为(nonatomic, retain )。