如果我有一个自定义类名为轮胎:为什么我不能通过setter初始化一个类?
#import <Foundation/Foundation.h>
@interface Tires : NSObject {
@private
NSString *brand;
int size;
}
@property (nonatomic,copy) NSString *brand;
@property int size;
- (id)init;
- (void)dealloc;
@end
=============================================
#import "Tires.h"
@implementation Tires
@synthesize brand, size;
- (id)init {
if (self = [super init]) {
[self setBrand:[[NSString alloc] initWithString:@""]];
[self setSize:0];
}
return self;
}
- (void)dealloc {
[super dealloc];
[brand release];
}
@end
我合成在我的视图控制器一个setter和getter:
#import <UIKit/UIKit.h>
#import "Tires.h"
@interface testViewController : UIViewController {
Tires *frontLeft, *frontRight, *backleft, *backRight;
}
@property (nonatomic,copy) Tires *frontLeft, *frontRight, *backleft, *backRight;
@end
====================================
#import "testViewController.h"
@implementation testViewController
@synthesize frontLeft, frontRight, backleft, backRight;
- (void)viewDidLoad {
[super viewDidLoad];
[self setFrontLeft:[[Tires alloc] init]];
}
- (void)dealloc {
[super dealloc];
}
@end
它死后[自setFrontLeft:[轮胎页头] init]]回来。它编译得很好,当我运行调试器时,它实际上一直通过轮胎上的init方法,但一旦它回来,它就会死掉,视图永不会出现。但是,如果我改变viewDidLoad中方法:
- (void)viewDidLoad {
[super viewDidLoad];
frontLeft = [[Tires alloc] init];
}
它工作得很好。我可以直接抛弃setter并直接访问变量,但我的印象是,我应该尽可能地使用setter和getter,并且逻辑上看起来像setFrontLeft方法应该起作用。
这引发了一个额外的问题,我的同事们不断询问这些问题(我们都是Objective-C的新手);如果你和那些制定者和获得者在同一个班上,那么为什么要使用制定者和获得者呢?
为什么在同一个班级中使用setter/getter?因为你的setter(以及更不常用的getter)可能不仅仅是分配值而是做其他事情,例如管理资源或更新其他实例变量。在类中直接访问变量意味着您必须复制该附加功能,否则将失去内部一致性。它打破封装。我相信在构造函数中没有使用综合属性方法是一个原则,因为它们可能没有完全建立 - 但是我没有充分理解构造函数如何失败。 – walkytalky 2010-05-02 22:11:55