IOS的属性和实例变量

实际上,@property声明的是属性,并不是实例变量。但是编译器会根据属性,自动生成实例变量,和对应的access方法。所以已经在interface里声明了@property,就不再需要在implementation里再声明实例变量了。

要记住,属性不是实例变量,而是根据属性会生成实例变量(和对应的access方法)。所以,属性名叫name,而实例变量的名字并不是name。在我这个环境ios7+xcode5,命名规则似乎是在属性前面加上_

因为oc中点表达式是表示调用方法,所以如果只有实例变量而无对应属性,是无法使用点操作来访问实例变量的。如果点表达式出现在等号 = 左边,该属性名称的setter方法将被调用。如果点表达式出现在右边,该属性名称的getter方法将被调用。

 

 

类与类别中添加的属性要区分开来,因为类别中只能添加方法,不能添加实例变量。经常会在ios的代码中看到在类别中添加属性,这种情况下,是不会自动生成实例变量的。

注意一点,匿名类别(匿名扩展)是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法)。

 

 

导入  <objc/runtime.h> 即可以使用 objc_setAssociatedObject 这个运行时函数。可以将一个对象与另外一个对象关联。其实就实现了拓展一个类的内存。

@interface UIScrollView (MyRefresh)  
@property(strong,nonatomic) DefaultTopLoadView *topShowView;  
@end  
@implementation UIScrollView (MyRefresh)  
static char topShowViewChar; 
-(DefaultTopLoadView *)topShowView{  
    return objc_getAssociatedObject(self, &topShowViewChar);  
}  
-(void)setTopShowView:(DefaultTopLoadView *)topShowView{  
    objc_setAssociatedObject(self, &topShowViewChar,topShowView,OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
}  
@end

 

 

 
posted @ 2015-10-25 13:16  郭晓倩  阅读(1000)  评论(0编辑  收藏  举报