我应该更好始终写
@interface MyClass
{
NSTextField * myTextField ;
}
@property (assign) NSTextField * myTextField ;
或只是
@interface MyClass
{
NSTextField * myTextField ;
}
为什么我有理由认为我们应该添加@property
行:
我最近有一个程序,如果插座没有吸气剂/装置器,它将无法工作。
另外:我们在创建项目时找到以下行
@property (assign) IBOutlet NSWindow *window;
答案 0 :(得分: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
内进行,即使在扩展程序中也是如此。
答案 1 :(得分:1)
您需要的只是使用IBOutlet
的Interface Builder的属性。如果您不使用Interface Builder,则不需要IBOutlet
。如果你没有使用Interface Builder,你可能根本不需要属性(属性通常是公共的,而实例变量总是私有的。)
@interface MyClass : UIViewController
@property (assign) IBOutlet NSTextField *myTextField ;
您不需要创建实例变量或将其合成为您完成的。
您可以在代码中使用self.myTextField
访问它。
答案 2 :(得分:1)
我个人更喜欢,如果你需要你的对象参考范围,那么在课堂之外再去做属性声明。否则将其声明为类括号内的实例变量和实现文件中的实例变量。 (如果你没有进一步继承这个变量特征)
所以,
@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中继承。
@interface ViewController () {
NSString *myString;
}
所以这只会在.m文件中具有可见性,而不是其他地方。
现在声明@property
- 只有在需要setter-getter默认方法(如setMyString等)时才需要声明。这也可以根据你对该实例的可见性要求在.m和.m中声明。
希望你现在得到这个概念。这完全取决于能见度。