类别

它既可以为类添加方法,也可以添加实例(属性)

添加新的实例变量的例子:

利用 runtime 编程知识: objc_setAssociatedObject 和 objc_getAssociatedObject

//  
//  Teacher+Profession.m  
//    

#import "Teacher+Profession.h"  
#import <objc/runtime.h>  

const char *ProfessionType = "NSString *";  //就是属性的key
@implementation Teacher (Profession)  

-(void)setProf:(NSString*)prof  
{  
    objc_setAssociatedObject(self, ProfessionType, prof, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
}  

-(NSString *)prof  
{  
    NSString *pro = objc_getAssociatedObject(self, ProfessionType);  
    return pro;  
}  

@end  
/** 
 * Sets an associated value for a given object using a given key and association policy.
 * 
 * @param object The source object for the association.
 * @param key The key for the association.
 * @param value The value to associate with the key key for object. Pass nil to clear an existing association.
 * @param policy The policy for the association. For possible values, see “Associative Object Behaviors.”
 * 
 * @see objc_setAssociatedObject
 * @see objc_removeAssociatedObjects
 */
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);

/** 
 * Returns the value associated with a given object for a given key.
 * 
 * @param object The source object for the association.
 * @param key The key for the association.
 * 
 * @return The value associated with the key \e key for \e object.
 * 
 * @see objc_setAssociatedObject
 */
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);
发布了456 篇原创文章 · 获赞 310 · 访问量 40万+

猜你喜欢

转载自blog.csdn.net/u011018979/article/details/78033027