在 headers 中定义 class 属性

Defining class properties in headers

请有人向我解释以下两种语法之间的区别:

@interface BCScanner : CDVPlugin <BCScannerDelegate> 

@property (nonatomic, copy) NSString *buttonCallback;
@property (nonatomic, retain) UIView* childView;
@property (nonatomic, retain) UIButton*  imageButton;

- (void)createView;

@end

对比

@interface BCScanner : CDVPlugin <BCScannerDelegate> {
    NSString *buttonCallback;
    UIView* childView;
    UIButton*  imageButton;
}

- (void)createView;

@end

他们做同样的事情吗?

属性只是 setter 和 getter。

更多信息请查看-

https://www.bignerdranch.com/blog/should-i-use-a-property-or-an-instance-variable/

http://rypress.com/tutorials/objective-c/properties

您有两种选择来定义变量。

@interface BCScanner : CDVPlugin <BCScannerDelegate> {
     UIButton*  imageButton;
}

在这种情况下,您无需 class 即可访问变量。

[imageButton setTitle:.... ];

但是,这个变量是私有的。 要访问此变量,您必须编写 getter 或 setter 来设置值。

如果用@属性定义变量,你可以用class访问变量:

self.imageButton

或者您可以使用来自另一个 class 的 setter:

[AnotherClassVariable setImageButton:(UIButton *)];

在这种情况下,自动声明此变量的访问器和修改器方法(使用@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];
    }
}

这段代码:

@interface BCScanner : CDVPlugin <BCScannerDelegate> 

@property (nonatomic, copy) NSString *buttonCallback;
@property (nonatomic, retain) UIView* childView;
@property (nonatomic, retain) UIButton*  imageButton;

- (void)createView;

@end

定义一个 class 具有 3 个 public 属性。这些 public 属性可以被任何其他 class 使用,包括 BSScanner class 本身。这是定义您希望其他 classes 能够访问的属性的正确方法。

其他代码块:

@interface BCScanner : CDVPlugin <BCScannerDelegate> {
    NSString *buttonCallback;
    UIView* childView;
    UIButton*  imageButton;
}

- (void)createView;

@end

未定义任何属性。相反,它声明了三个私有实例变量。这些变量只能由 BCScanner class 的实例访问。其他 class 无法直接访问变量。没有理由在 public 头文件中声明私有实例变量。这些应移至 .m 文件中的私有 class 扩展名。

是否声明 public 属性或私有 ivar 取决于值的需要。如果其他 classes 应该能够访问这些值,则在 .h 文件中声明 public 属性。如果没有其他 class 应该有访问权限,则在 .m 文件而不是 .h 文件中声明私有 ivars。