在我的程序中,我正在为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;
}
答案 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 )。