使用Setter和Getter方法与直接操作的好处

对不起,如果这是一个初学者的问题,但我想知道什么好处是使用setter和getter方法,而不是直接直接操纵它们。 我在obj-c,我想知道在内存/ CPU使用方面是否有任何好处。

例如,我在上传图像之前裁剪一张图像,然后在拍摄/拾取后裁切。 我把所有的代码放在didFinishPickingMediaWithInfo方法中。 所以它看起来像下面这样:

 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ //Create image imageFile = [info objectForKey:UIImagePickerControllerOriginalImage]; //Unhide imageView and populate selectedImage.hidden = false; selectedImage.image = imageFile; //Create original image for reservation originalImage = imageFile; //Crop image UIGraphicsBeginImageContext(selectedImage.frame.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextRotateCTM(context, 2*M_PI); [selectedImage.layer renderInContext:context]; imageFile = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //Update imageView with croppedImage selectedImage.image = imageFile; //Dismiss image picker [imagePickerController dismissViewControllerAnimated:YES completion:nil]; } 

所以我们说我做同样的事情,但有一个方法来填充selectedImage imageView和裁剪图像的方法,所以它看起来如下所示:

 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ //Create image [self setImage:[info objectForKey:UIImagePickerControllerOriginalImage]]; //Create local image UIImage * localImage = [self returnImage]; //Unhide imageView and populate selectedImage.hidden = false; [self populateImageView:localImage]; //Create original image for reservation originalImage = localImage; //Crop image localImage = [self getImageFromContext:localImage withImageView:selectedImage]; //Update imageView with croppedImage [self populateImageView:localImage]; //Dismiss image picker [imagePickerController dismissViewControllerAnimated:YES completion:nil]; } //Crop image method -(UIImage *)getImageFromContext:(UIImage *)image withImageView:(UIImageView *)imageView{ UIGraphicsBeginImageContext(imageView.frame.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextRotateCTM(context, 2*M_PI); [imageView.layer renderInContext:context]; image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; image = nil; context = nil; } -(void)populateImageView:(UIImage *)image{ selectedImage.image = image; } - (void)setImage:(UIImage *)image{ imageFile = image; } -(UIImage *)returnImage{ return imageFile; } 

那么除了代码的可读性和整洁性之外,还有其他的好处吗? 有没有办法使这个更有效率?

Big Nerd Ranch在这方面有很好的基准 。

通常我使用属性作为最佳实践。 这是有用的,因为你有:

  • 一个预期的地方,你的财产将被访问(getter)
  • 一个预期的地方,你的财产将被设置(二传手)

这通常有助于debugging(可以覆盖setter或在那里设置断点来检查谁正在改变属性以及何时改变),并且可以做一些懒惰的实例化。

通常我懒惰的实例化与数组或以编程方式创build的意见。 例如:

 @property(nonatomic, strong) UIView *myView; -(UIView*) myView { if(!_myView) { //I usually prefer a function over macros _myView = [[UIView alloc] initWithFrame: [self myViewFrame]]; _myView.backgroundColor = [UIColor redColor]; } return _myView; } 

Jacky Boy粗体的另一个重要因素是,你有一个免费的KVO就绪结构的属性。