2

我应该总是写吗

    @interface MyClass
    {
        NSTextField * myTextField ;
    }
    @property (assign)  NSTextField * myTextField ;

要不就

    @interface MyClass
    {
        NSTextField * myTextField ;
    }

?

为什么我有理由认为我们应该添加该@property行:

  • 我最近有一个程序,如果插座没有 getter/setter,它将无法工作。

  • 加:我们在创建项目时发现了以下行

    @property (assign) IBOutlet NSWindow *window;
    
4

3 回答 3

3

一旦你property为一个出口对象或任何其他对象创建了一个 ivar,就会为它创建一个(在新的编译器中)。

现在创建 ivars 和属性已过时。甚至property与自动合成相匹配。

如果您真的想要 ivars,那么您可以将其放入.m文件中,或者如果您希望它们是私有的,则使用它们为类添加扩展名。

出口应该有setter/getter

是的,您确实需要多次访问它们。比如检查单选按钮、复选框的状态,设置stringValue为NSTextField,通过[tableView reloadData]重新加载表格等。

@interface MyClass
    {
        NSTextField * myTextField ; //this is ivar
    }
    @property (assign)  NSTextField * myTextField ; //this is property
@end

无论您放入什么.h都是public可访问的,如果您想隐藏它,.m即使在扩展中也可以这样做。

于 2013-03-19T16:59:05.723 回答
1

我个人更喜欢,如果你需要你的对象引用范围,那么在类之外使用属性声明。否则将其声明为类括号内的实例变量,并在实现文件中声明。(如果您没有进一步继承此变量功能)

所以,

  • 如果您需要在类之外访问变量实例,请声明属性。在 MyClassViewController.h 头文件中

@property (strong, nonatomic) IBOutlet NSTextField *myTextField;

所以现在在其他类中,可以通过以下方式访问它:

MyClassViewController *myClassViewController = [[MyClassViewController alloc] init];
[myClassViewController.myTextField setText:@"MyValue"];

也得到像

NSLog(@"%@", [myClassViewController.myTextField text]);
  • 如果您不希望这样的公共访问,但您希望它被继承。然后在类声明块本身中声明。在 ViewController.h 头文件中

    @interface ViewController { @public: // or @protected
      NSString *myString;
    }
    

现在,如果有另一个类继承了 ViewController 类,那么这个属性将根据其访问说明符在 ChildViewController 中被继承。

  • 如果您想要完全隐藏的属性或变量。就像它甚至没有在该类本身之外使用一样,那么您可以在私有类别本身的实现文件(.m)中声明它。在 ViewController.m 文件中:

@interface ViewController () {

  NSString *myString;
}

因此,这将仅在 .m 文件中可见,其他任何地方都没有。

现在声明@property- 只有在需要 setter-getter 默认方法(如 setMyString 等)时才需要声明它。这也可以根据您对该实例的可见性要求在 .h 和 .m 中声明。

希望现在你能理解这个概念。一切都与能见度有关。

于 2013-03-19T17:26:48.803 回答
1

All you need is the property for Interface Builder using IBOutlet. If you're not using Interface Builder you don't need IBOutlet. If you're not using Interface Builder you may not even need a property at all (properties are generally public, while instance variables are always private).

@interface MyClass : UIViewController

@property (assign) IBOutlet NSTextField *myTextField ;

You don't need to create an instance variable or synthesize it as its done for you.

You can access it with self.myTextField in your code.

于 2013-03-19T17:02:02.063 回答