我经常在代码中看到以不同方式使用实例变量,我不确定如何在objective-c中正确使用它们。例如,在以下代码中,我声明了属性imagePicker
,它还创建了基础实例变量_imagePicker
。
@interface ViewController ()
@property (nonatomic, strong) UIImagePickerController *imagePicker;
@end
@implementation ViewController
-(void)initVariables{
}
我何时才能正确使用以下内容?我已经看到了代码中使用的所有三种方法,但是不了解使用它们的情况。
self._imagePicker =
_imagePicker.property
imagePicker.property
答案 0 :(得分:4)
我认为你列出的任何片段都不会起作用......
self._imagePicker //Does not exists, it should be self.imagePicker
_imagePicker.property //There is no property "property" in object of type UIImagePickerController
//And the same error goes for your last example.
我猜你已经看到了两种常见的方法。 self.imagePicker
或_imagePicker
。这两个接入点做了不同的事情,在不同的情况下很有用。
self.imagePicker =
实际上调用了[self setImagePicker:object]
方法。如果您不手动创建此方法,编译器将为您合成该方法。
_imagePicker =
只是直接设置对象而不调用该方法。
因此,如果您实现自己的[self setImagePicker:]
方法,这就成了一个问题。在这种方法中,您可以执行以下操作:
-(void)setImagePicker:(UIImagePickerController*)controller
{
self.imagePicker = controller;
}
这段代码非常糟糕。由于编译器将self.imagePicker =
更改为[self setImagePicker:]
,因此您将递归调用该方法到无止境。你的程序崩溃了(经过一段时间100%的CPU使用和没有UI功能)。相反,您应该在编写setter方法时直接使用实例变量:
-(void)setImagePicker:(UIImagePickerController*)controller
{
_imagePicker = controller;
}
我希望这能解释一下。