Objective c 使用合成突变与赋值

Objective c 使用合成突变与赋值,objective-c,Objective C,在我的程序中,我在init方法中为属性赋值。稍后,我将使用此属性来响应事件 给定一个名为Object的属性为什么合成的setter[self-setObject:obj]可以工作,但是Object=obj给出了无效的选择器异常?是因为变异子在obj上的引用计数中加了一个吗 编辑:以下是更多代码,以提供上下文。当我在上面说“工作”时,我的意思是没有错误地运行 以下是对象(视图控制器)的初始化,其中包含属性: 注意:所有属性都声明为(非原子,保留) 下面是初始化此视图控制器的方法调用: @synth

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

给定一个名为Object的属性为什么合成的setter
[self-setObject:obj]
可以工作,但是
Object=obj
给出了无效的选择器异常?是因为变异子在obj上的引用计数中加了一个吗

编辑:以下是更多代码,以提供上下文。当我在上面说“工作”时,我的意思是没有错误地运行

以下是对象(视图控制器)的初始化,其中包含属性:

注意:所有属性都声明为
(非原子,保留)

下面是初始化此视图控制器的方法调用:

@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;
}

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


一种方法是自己调用retain,或者如果定义为(非原子,retain),则可以使用合成setter

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

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


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

您发布的代码给出了答案。你已经设置了信息亭,所以不要释放它。不再需要在initWithNibName:等中分配_Kiosk。只需使用dealoc方法释放Kiosk。如果要更改Kiosk,请使用
class.Kiosk=
以便调用该属性,该属性将保留该属性并释放以前的Kiosk。

这里发生的事情不太清楚。您能发布一些代码吗?例如,显示IVAR、属性声明、类的初始化以及访问对象属性的代码?FWIW,“工作”是什么意思?什么无效选择器?谢谢您的时间!我添加了更多的上下文。当我说work时,我的意思是运行时没有错误,(没有得到无效的选择器错误。也许我应该在这两个地方都包含
\u Kiosk
属性,它在头文件中声明为
@property(非原子,保留)
。如果您想要“自动生成”要调用的setter:使用点符号:self.\u kiosk=kioskAwesome!感谢您的解释!
@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;
}