有時候項目中會有些model須要copy, 這個時候就須要實現 NSCopying 協議方法copyWithZone了3d
可是不少時候都是一個個屬性來賦值, 這樣作屬性少還能夠, 可是若是有不少屬性呢, 難道也要一個一個去賦值嗎? 顯然還須要更好的解決辦法對象
如下是用runtime來實現copyWithZong方法的姿式:blog
// copy代碼請下拉:get
- (id)copyWithZone:(NSZone *)zone {string
id objCopy = [[[self class] allocWithZone:zone] init];it
// 1.獲取屬性列表class
unsigned int propertyCount = 0;List
objc_property_t * propertyArray = class_copyPropertyList([self class], &propertyCount);select
for (int i=0; i<propertyCount; i++) {model
objc_property_t property = propertyArray[i];
// 2.屬性名字
const char * propertyName = property_getName(property);
NSString * key = [NSString stringWithUTF8String:propertyName];
// 3.經過屬性名拿到屬性值
id value=[self valueForKey:key];
NSLog(@"name:%s,value:%@",propertyName,value);
// 4.判斷 值對象是否響應copyWithZone
if ([value respondsToSelector:@selector(copyWithZone:)]) {
//5. 設置屬性值
[objCopy setValue:[value copy] forKey:key];
}else{
[objCopy setValue:value forKey:key];
}
}
//*****切記須要手動釋放
free(propertyArray);
return objCopy;
}