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

时间:2013-12-31 16:13:01

标签: ios iphone objective-c coding-style getter-setter

很抱歉,如果这是一个初学者问题,但我想知道使用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;

}

除了可读性和代码的整洁性之外,还有其他任何好处吗?反正有没有提高效率?

1 个答案:

答案 0 :(得分:2)

您对该主题有great benchmark made by Big Nerd Ranch

通常我会将属性作为最佳实践。这很有用,因为你有:

  • 您的财产将被访问的预期地点(getter)
  • 您的财产将被设置的预期地点(设置者)

这通常有助于调试(您可以覆盖setter或在那里设置断点来检查谁正在更改属性以及何时更改)并且您可以执行一些惰性实例化。

通常我使用数组或以编程方式创建的视图进行延迟实例化。例如:

@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就绪结构。