Это выглядит довольно хорошо, за исключением того, что вы оставили свои свойства открытыми для произвольных манипуляций внешними объектами В идеале данные должны обрабатываться непосредственно только самим классом модели, а внешние объекты должны иметь доступ только через специальные методы.
Например, что если какой-то внешний код вызывает это:
myIRTileset.tileTemplates=someArray;
Бум, ты потерял все свои данные.
Вы должны определить оба свойства данных только для чтения. Затем напишите методы доступа, внутренние для класса, которые будут управлять их сохранением в реализации класса. Таким образом, единственный способ для внешнего объекта изменить tileTemplates - это вызвать методы - insertTileTemplates:atIndexes:
и removeTileTemplatesAtIndexes:
.
Edit01:
Я думаю, что исказил это с первого хода, поэтому позвольте мне попробовать еще раз. Вам следует настроить класс модели данных по следующей схеме:
Интерфейс
@interface PrivateTest : NSObject {
@private
//iVar is invisible outside the class, even its subclasses
NSString *privateString;
@public
//iVar is visible and settable to every object.
NSString *publicString;
}
@property(nonatomic, retain) NSString *publicString; //property accessors are visible, settable and getable.
//These methods control logical operations on the private iVar.
- (void) setPrivateToPublic;
- (NSString *) returnPrivateString;
@end
Таким образом, при использовании это будет выглядеть так:
Осуществление
#import "PrivateTest.h"
//private class extension category defines
// the propert setters and getters
// internal to the class
@interface PrivateTest ()
@property(nonatomic, retain) NSString *privateString;
@end
@implementation PrivateTest
//normal synthesize directives
@synthesize privateString;
@synthesize publicString;
// Methods that control access to private
- (void) setPrivateToPublic{
//Here we do a contrived validation test
if (self.privateString != nil) {
self.privateString=self.publicString;
}
}
- (NSString *) returnPrivateString{
return self.privateString;
}
@end
Вы бы использовали это так:
PrivateTest *pt=[[PrivateTest alloc] init];
// If you try to set private directly as in the next line
// the complier throws and error
//pt.privateString=@"Bob"; ==> "object cannot be set - either readonly property or no setter found"
pt.publicString=@"Steve";
[pt setPrivateToPublic];
NSLog(@"private=%@",[pt returnPrivateString]); //==> "Steve"
Теперь у класса есть пуленепробиваемая целостность данных. Любой объект в вашем приложении может установить и получить строковое свойство publicString
, но ни один внешний объект не может установить или получить private
.
Это означает, что вы можете безопасно разрешить доступ к экземпляру для любого объекта в вашем приложении, не беспокоясь о том, что небрежная строка кода в каком-то второстепенном объекте или методе все испортит.