Если у меня есть собственный класс под названием 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
И я синтезирую сеттер и получатель в моем контроллере представления:
#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];
}
Работает отлично. Я мог бы просто отказаться от сеттера и напрямую получить доступ к переменной frontLeft, но у меня создалось впечатление, что я должен использовать сеттеры и геттеры как можно чаще, и логически кажется, что setFrontLeft метод должен работать.
Это поднимает дополнительный вопрос, который мои коллеги продолжают задавать по этому поводу (все мы новички в Objective-C); зачем вообще использовать сеттеры и геттеры, если вы принадлежите к тому же классу, что и эти сеттеры и геттеры.