OC是不能直接修改对象的结构体的成员变量属性,一般做法是先取出对象的结构体变量,修改该取出来的结构体变量里面的成员,再把结构体对象赋值给原来的结构体变量,在UI中为了简化代码一般对UIView做一个category,这个分类把上面修改结构体成员变量的方法封装起来, @interface UIView (Extension) @property(nonatomic,assign)CGFloat x; @property(nonatomic,assign)CGFloat y; @end #import"UIView+Extension.h" @implementationUIView (Extension) - (void)setX:(CGFloat)x { CGRect frame =self.frame; frame.origin.x= x; self.frame= frame; } - (void)setY:(CGFloat)y { CGRect frame =self.frame; frame.origin.y= y; self.frame= frame; } @end 问题来了,category是为已有的类动态添加新的行为,不能添加新的成员变量,在.h文件中为什么添加了x和y的变量? 这个就要弄清@property关键字了,在类中@property关键字会生成私有成员变量,和申明getter setter方法,但是在分类中只会声明getter和setter方法,不会生成成员变量 扩展: 如果在.m中手动实现了setter和getter方法,x-code就不会自动生成@synthesize,也就不会生成成员变量 点语法访问的是getter方法,对象的->调用才是访问的成员变量 如果我们真的需要给category增加属性的实现,需要借助于运行时的两个函数: objc_setAssociatedObject objc_getAssociatedObject
(1)在老式的代码中,@property只能写在@interface @end中,@synthesize只能写在@implementation @end中,自从xcode 4.4后,@property就独揽了@property和@synthesize的功能。
(2)@property int age;这句话完成了3个功能:1)生成_age成员变量的get和set方法的声明;2)生成_age成员变量set和get方法的实现;3)生成一个_age的成员变量。
注意:这种方式生成的成员变量是private的。
(3)可以通过在{}中加上int _age;显示的声明_age为protected的。
(4)原则:get和set方法同变量一样,如果你自己定义了,那么就使用你已经定义的,如果没有定义,那么就自动生成一个。
(5)手动实现:
1)如果手动实现了set方法,那么编译器就只生成get方法和成员变量;
2)如果手动实现了get方法,那么编译器就只生成set方法和成员变量;
3)如果set和get方法都是手动实现的,那么编译器将不会生成成员变量。