在Xcode 4.4之前的大多数项目中,我意识到开发人员同时声明了一个同名的ivar和一个属性.例
@interface SecondViewController : UIViewController
{
NSString *string;
}
@property (strong, retain) NSString *string;
Run Code Online (Sandbox Code Playgroud)
所以我不知道为什么?
只是风格问题,习惯于过去编译器的行为.
现在在较新的编译器中,这不是必需的.一旦你创建了一个属性,就会在场景后面创建一个ivar并合成它.
编译器将别名合成为_propertyName,即使您可以选择更改此默认行为.
@interface AppDelegate : NSObject <NSApplicationDelegate>{
NSString *bigString;
}
@property(strong)NSString *smallString;
@end
Run Code Online (Sandbox Code Playgroud)
@implementation AppDelegate
@synthesize smallString=bigString;
-(void)awakeFromNib{
self.smallString=@"hello";
NSLog(@"%@",self.smallString);
}
@end
Run Code Online (Sandbox Code Playgroud)
我不能代表其他人说话,但我不会使用相同的名字。如果我确实声明了一个实例变量,它会带有一个前导下划线,因此很明显我指的是实例变量还是 setter/getter 方法。
使用 Xcode 4.4+,您不需要声明或调用实例变量@synthesize,编译器将自动创建一个带有前导下划线的实例变量,并为您提供 setter/getter 方法。
然而,我认为这种机制不是一个好主意,因为它鼓励开发人员公开不应公开的类的属性。
例如,这摘自《开始 iOS 6 开发》:
@interface BIDViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIButton *button;
- (IBAction)buttonPressed:(UIButton *)sender;
@end
Run Code Online (Sandbox Code Playgroud)
现在,虽然我知道您不想一次用太多概念让初学者感到困惑,但您通过UIButton向该视图控制器的用户公开对象和操作方法,立即违反了面向对象封装,并且两者都不应该公开。
例如,如果使用类执行以下操作,会发生什么情况:
BIDViewController *vc = ...;
vc.button = nil;
Run Code Online (Sandbox Code Playgroud)
或者
vc.buttonPressed(mySegmentedControl);
Run Code Online (Sandbox Code Playgroud)
一切地狱都崩溃了。现在,虽然有 1000 种方法可以破坏程序,而我们无法防御所有这些方法,但我们不想创建一个已经很弱的系统(Objective-C 在定义谁可以调用一个程序和谁不能调用一个程序方面几乎没有提供任何帮助)你的方法)较弱。
上面的实现最好使用私有实例变量和方法来完成,这两者都受到 Interface Builder 的支持:
@implementation BIDViewController ()
{
IBOutlet UIButton *_button;
}
- (IBAction)_buttonPressed:(UIButton *)sender;
@end
Run Code Online (Sandbox Code Playgroud)
任何使用类都将很难打破该模型。
但当然,这对开发人员来说需要更多的思考和打字,因此苹果引入了新功能,以便他们可以在更短的时间内完成他们想要的事情(当你简单地将一个插座拖到头文件中时,几乎不需要打字,并且两者都可以)为您提供了声明和实现框架)。
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |