请有人解释以下两种语法之间的区别:
@interface BCScanner : CDVPlugin <BCScannerDelegate>
@property (nonatomic, copy) NSString *buttonCallback;
@property (nonatomic, retain) UIView* childView;
@property (nonatomic, retain) UIButton* imageButton;
- (void)createView;
@end
VS
@interface BCScanner : CDVPlugin <BCScannerDelegate> {
NSString *buttonCallback;
UIView* childView;
UIButton* imageButton;
}
- (void)createView;
@end
他们俩都做同样的事吗?
答案 0 :(得分:1)
属性只是设置者和吸气剂。
了解更多信息 -
https://www.bignerdranch.com/blog/should-i-use-a-property-or-an-instance-variable/
答案 1 :(得分:1)
您有两种选择来定义变量。
@interface BCScanner : CDVPlugin <BCScannerDelegate> {
UIButton* imageButton;
}
在这种情况下,您可以访问您班级的变量。
[imageButton setTitle:.... ];
但是,这个变量是私有的。 要访问此变量,您必须写入getter或setter来设置值。
如果使用@property定义变量,则可以使用class:
访问变量self.imageButton
或者您可以使用其他类中的setter:
[AnotherClassVariable setImageButton:(UIButton *)];
在这种情况下,自动声明此变量的accessor和mutator方法(使用@synthesize)。
实际使用可以是这样的:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"segueId"]){
MyClassWithProperty *dc = segue.destinationViewController;
dc.imageButton = self.imageButton;
//[dc setImageButton:self.imageButton];
}
}
答案 2 :(得分:1)
这段代码:
@interface BCScanner : CDVPlugin <BCScannerDelegate>
@property (nonatomic, copy) NSString *buttonCallback;
@property (nonatomic, retain) UIView* childView;
@property (nonatomic, retain) UIButton* imageButton;
- (void)createView;
@end
定义一个包含3个公共属性的类。这些公共属性可以由任何其他类使用,包括BSScanner
类本身。这是定义您希望其他类可以访问的属性的正确方法。
另一块代码:
@interface BCScanner : CDVPlugin <BCScannerDelegate> {
NSString *buttonCallback;
UIView* childView;
UIButton* imageButton;
}
- (void)createView;
@end
没有定义任何属性。相反,它声明了三个私有实例变量。这些变量只能由BCScanner
类的实例访问。其他类没有直接访问变量。没有理由在公共头文件中声明私有实例变量。这些应该移动到.m文件中的私有类扩展名。
是否声明公共属性或私有ivars取决于值的需要。如果其他类应该能够访问这些值,则在.h文件中声明公共属性。如果没有其他类可以访问,则在.m文件中声明私有ivars,而不是.h文件。