【发布时间】:2010-05-02 21:13:49
【问题描述】:
如果我有一个名为 Tires 的自定义类:
#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
我在 View Controller 中合成了一个 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
它在 [self setFrontLeft:[[Tires alloc] init]] 回来后死掉。它编译得很好,当我运行调试器时,它实际上一直通过轮胎上的 init 方法,但是一旦它回来它就会死掉并且视图永远不会出现。但是,如果我将 viewDidLoad 方法更改为:
- (void)viewDidLoad {
[super viewDidLoad];
frontLeft = [[Tires alloc] init];
}
它工作得很好。我可以放弃 setter 并直接访问 frontLeft 变量,但我的印象是我应该尽可能多地使用 setter 和 getter,从逻辑上讲它看起来像 setFrontLeft方法应该有效。
这带来了我的同事在这些方面不断提出的另一个问题(我们都是 Objective-C 的新手);如果您与那些 setter 和 getter 属于同一类,为什么还要使用 setter 和 getter。
【问题讨论】:
-
为什么要在同一个类中使用 setter/getter?因为您的 setter(以及很少见的 getter)可能会做一些事情,而不仅仅是分配值,例如管理资源或更新其他实例变量。直接在类中访问变量意味着您必须复制该附加功能,否则可能会失去内部一致性。它破坏了封装。我相信在构造函数中不使用合成属性方法是有原则的,因为它们可能没有完全设置好——但我对内部结构不够了解,无法理解它们是如何失败的。
标签: objective-c setter getter