在标头中定义类属性

时间:2015-08-06 12:33:37

标签: objective-c properties header-files

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

@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

他们俩都做同样的事吗?

3 个答案:

答案 0 :(得分:1)

答案 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文件。