很抱歉,如果这是一个初学者问题,但我想知道使用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;
}
除了可读性和代码的整洁性之外,还有其他任何好处吗?反正有没有提高效率?
答案 0 :(得分:2)
您对该主题有great benchmark made by Big Nerd Ranch。
通常我会将属性作为最佳实践。这很有用,因为你有:
这通常有助于调试(您可以覆盖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就绪结构。