八 23
NearApple技术 assign, attribute, copy, Objective C, property, readonly, readwrite
一直以来个人觉得如果一个类是的property是readonly的那么再指定其他的如assign/retain/copy这样的属性就实在是没有什么意义了。确实你想想既然都readonly了,肯定是没有setter的,既然没有setter那么谈assign/retain/copy又有什么意义呢?所以一直以来我从来不对readonly的property加retain/copy属性申明,默认assign就足够了,simple is beautiful!
但是我现在发现我错了,其实一直都有一种这种感觉,只是没有找到100%的充分理由为readonly加上retain/copy。但是假如你要在你的subclass改写property,而加入你要改写的是一个NSString,你像把这个属性设置为readwrite和copy,往往杯具就发生了,编译时候可恶的warning 产生了,因为copy和之前默认的assign明显不相同啊!
终上,不论什么时候,都要为你的readonly的对象属性加上合适的retain/copy申明。你现在不用,但不说明你将来就不会用,出来混迟早都要还的!
八 15
NearApple技术 instance variable, NSManagedObject, property, 没有实例变量
趁现在还记忆犹新,而且还小有兴奋,把自己怎么实现RT话题写下来。
这个问题其实是在我学习CoreData的时候就一直存在,在CoreData里面有一个“很酷”的类NSManagedObject,只要是找个类的子类,那么这些类的property只要申明并且在.m里面申明为dynamic就可以,而不需要为property指定特定的实力变量,用起来特别方便。这让我这个经常实用property的人觉得真的是匪夷所思啊。一直在想找个玩意儿到底是采用了什么魔法,才能够导致property和实力变量之间的依赖可以剥离。而且前段时间和Kevin同学一起讨论了一下,但是都表示没有头绪。
最近又刚好温习了一下Objective-C Runtime Programming Guide这才恍然大悟,于是花了一天的时间就实现出了类似的效果。并且通过这次实践,对动态语言到底有多动态又有了从来没有过的深入认识,这种感觉很过瘾。
具体是怎么实现的不想多讲,原理不难,过程也不复杂,自己看源代码去,但是要求对oc runtime要有所了解。最终的效果就是我实现一个叫SmartObject 的类,只要是从找个类继承下来的类就可以想NSManagedObject的子类那样不用给出实力变量就可以使用property了!具体使用如下:
1 2 3 4 5 6 7
| #import "SmartObject.h"
@interface TestClass : SmartObject {
}
@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSString *location;
@property (nonatomic, retain) NSDate *date;
@end |
1 2 3 4 5 6
| #import "TestClass.h"
@implementation TestClass
@dynamic title;
@dynamic location;
@dynamic date;
@end |
结果就可以这样使用了:
1 2 3 4 5 6 7 8 9 10
| TestClass *_myObject;
...
_myObject = [[TestClass alloc] init];
_myObject.title = @"this is title";
_myObject.location = @"this is location";
_myObject.date = [NSDate date];
...
NSLog(_myObject.title, nil);
NSLog(_myObject.location, nil);
NSLog([_myObject.date description], nil); |
感觉是不是很酷啊~
近期评论