如果我有一個自定義類名爲輪胎:爲什麼我不能通過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