`

(转)如何在Category类中定义成员变量

    博客分类:
  • IOS
 
阅读更多

转自:https://zhidao.baidu.com/question/2077039115014176428.html

 

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

 

分享到:
评论

相关推荐

    038集-Intent类的重要成员变量

    通过理解和熟练运用Intent类的这些关键成员变量,开发者能够更高效地在Android应用中实现组件间的通信,提高应用的灵活性和用户体验。不断学习和实践,才能真正掌握Intent的精髓,成为出色的Android开发者。

    Objective-C, Category, 实现分析, 源代码

    Category中的方法被存储在类的“方法列表”中,这样类在运行时就能调用这些新添加的方法。Category还能添加实例变量,但这些变量只能在Category的实现文件中访问,无法在其他地方直接使用。 Objective-C的Category...

    ListCtrl_Category_Groups

    这些头文件中包含了类的声明、成员变量和方法,是实现分组功能的关键部分。 6. **标准预编译头文件**:"stdafx.cpp"和"stdafx.h"是MFC项目中的预编译头文件,包含了常用库和宏定义,可以提高编译速度。 7. **资源...

    OC语法底层原理精简版.pdf

    Category与Class Extension的区别在于Class Extension在编译时就包含在类信息中,而Category是在运行时合并。Category有自己的`load`方法,它在类或分类加载时被调用,`load`方法是可以继承的,但通常由系统自动调用...

    达内ios面试题

    - 实例变量默认是私有的,可以直接在类的实例化部分声明。`@private`关键字也可用于明确声明私有变量。 4. **const和volatile关键字**: - `const`关键字表示"只读",用于声明常量。例如,`const int a`声明了一...

    简单介绍iOS开发中关于category的应用

    在Category的头文件中,你可以像定义普通类那样声明新的方法。例如,在`MyClass+HelloWorld.h`中,我们添加了一个名为`HelloWorld`的方法。 3. **实现Category的方法**: 在Category的实现文件中,你将为声明的...

    OC底层原理之OC语法课件ppt

    - Category包含`load`方法,在类或Category加载时由系统自动调用。 - `load`方法可以继承,但在实际应用中通常由系统自动调用。 - **load与initialize方法的区别**: - `load`方法在类加载时调用,而`initialize`...

    组件类的详细明细

    属性允许我们以面向对象的方式封装和访问类的成员变量,同时提供了数据验证和设置默认值的能力。自定义控件时,可以通过添加属性来扩展其功能,例如添加一个布尔型的`IsEnabled`属性,用于控制控件是否可交互。 ...

    优质java课件 java程序设计教程(第6版)04.中期回顾 类、构造方法(共18页).ppt

    `private`成员只能在类内部访问,`public`成员在任何地方都可访问,而没有修饰符的成员只在同包内可访问。 封装是面向对象编程的核心原则之一,它隐藏了对象的内部实现细节,仅暴露出必要的接口供外部使用。通过...

    使用IDA分析高级数据结构

    在IDA中,可以通过定义联合体并设置成员变量的方式来模拟这种特性。 ##### 3.3 位字段 对于像`struct software_info_t`这样的结构体,其中包含了多个位字段,IDA也提供了相应的方法来定义这些特殊的字段。在定义...

    vc程序调试技术[定义].pdf

    8. 显示成员变量和函数提示:如果编辑状态下成员变量或函数提示不显示,可能是因为VC++的bug。解决方法是关闭工程,删除“.ncb”文件,然后重新打开工程。 9. 删除ClassWizard生成的类:要彻底删除一个类,首先在...

    ssd5\ssd5实验\exercise3

    因此,"Category.cpp"可能包含了"Category"类的定义,包括其成员变量(属性)和成员函数(方法)。 接下来,我们看"Categories.cpp"。这可能是对多个"Category"对象进行管理和操作的模块。在C++中,"Categories...

    Objective-C培训教程

    接口部分描述了类的名称、继承的父类以及类的成员变量和方法声明;实现部分则包含了方法的具体实现代码。类名的命名规则通常是以大写字母开头,而实例变量和方法名通常以小写字母开头。在Objective-C中,函数(方法...

    ssd5-exercise3

    具体而言,这段代码围绕着一个名为“Categories”的类和另一个名为“Category”的类进行,这两个类用于管理和操作分类信息,可能在电子商务、数据库管理或其他需要对大量数据进行分类处理的场景中应用广泛。...

    《Java程序设计教程》第章.pptx

    为了允许外部访问这些变量,我们可以在类中创建公有方法如`getName()`、`setName(String name)`等,使得用户可以调用这些方法进行操作,而不是直接访问私有变量。 **继承**是面向对象的另一个重要特性,它允许创建...

    IOS 面试题

    - 类中的`static`成员变量属于类本身,而非类的实例,所有实例共享同一份拷贝。 - `static`成员函数不能访问类的非静态成员,因为它们不与特定实例关联。 理解这些基本概念对于iOS开发者来说至关重要,它们构成了...

    Visual_C++开发工具与调试技巧整理

    在宏(或变量、函数)定义处,按下`F12`键,或者右键点击后选择“转至定义”(Go To Definition),系统会自动定位到对应的定义位置。 【Visual C++开发工具与调试技巧】 Visual C++是微软公司推出的一种集成开发环境...

    最全最好的IOS面试题

    5. 类中的static函数不能访问非static成员变量,因为它们不与特定实例绑定,但可以访问static成员变量和调用其他static函数。 总之,这些面试题涵盖了Objective-C的关键特性,如面向对象的实现方式,以及C++中const...

    TestForCustomDetail.zip ue4自定义面板

    - 要自定义Class的细节面板,可以在蓝图类中定义`EditAnywhere`、`Category`等属性,以控制它们在细节面板上的显示方式。 - 通过蓝图事件图表,可以添加自定义事件和功能,这些将在面板上以可调用的节点形式出现。...

    IOS面试题2(答案)参照.pdf

    - 在类中,`static`成员变量属于类而非类的实例,所有实例共享同一个`static`成员变量的值,且可通过类名直接访问。 6. **const和volatile的结合**: 一个变量可以同时是`const`和`volatile`,比如,它是一个由...

Global site tag (gtag.js) - Google Analytics