如何在objective-c中正确使用实例变量?

时间:2014-05-02 18:46:08

标签: ios objective-c

我经常在代码中看到以不同方式使用实例变量,我不确定如何在objective-c中正确使用它们。例如,在以下代码中,我声明了属性imagePicker,它还创建了基础实例变量_imagePicker

@interface ViewController ()

@property (nonatomic, strong) UIImagePickerController *imagePicker;

@end

@implementation ViewController


-(void)initVariables{


}

我何时才能正确使用以下内容?我已经看到了代码中使用的所有三种方法,但是不了解使用它们的情况。

self._imagePicker =

_imagePicker.property 

imagePicker.property

1 个答案:

答案 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;
}

我希望这能解释一下。

相关问题