Object-C @property 小结

本文详细介绍了Objective-C中@property的概念及使用方法,包括其如何简化setter和getter方法的创建过程,以及不同属性修饰符的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OC像iphone手机一样与众不同,虽然有很多优秀的地方,对于刚接触的人还是有很多不适应。自己做iphone开发不久,之前对@property使用有很多不解,现在把自己理解的做下小结:


        一、@property 是什么?

        简单点说,属性就是一种支持访问对象成员变更的快捷的方法,可以自动的生成setter和getter方法(setter只支持传一个参数)。

        面向对象思想的基本特点为封装、继承、多态。封装性主要体现在无法直接访问对象成员变量,如果需要的话,通过setter和getter方法访问成员变量。这样的话,通常要为每一个支持外边访问的成员变量写两个方法,这种操作比较繁琐且无意义。通过@property可以简化这种方法。

        声明:属性要在头文件中声明,声明格式为: @property (attributes) type propertyName; 

        实现(合成):实现要在.m文件中,格式为 @synthesize   name = _name; 而在xcode4.4以后的版本,系统会自动合成, 等价于自己写了代码“ @synthesize  name = _name;” 。 也就是说如果没有特殊需求,只需要在头文件中声明而无需实现,就可以直接使用了。

        成员变量访问权限:头文件中声明的成员变量,默认是protected,.m文件中声明的成员变量,默认是private的。合成属性时,@synthesize  propertyName = _name;如果变量_name没有声明,系统会自动生成该成员变量且为private权限。如果_name已声明,它们会自动合成。

ClassA.h

@interface ClassA : NSObject {
    int _int4; //默认为protected
@public    //可以通过这种方式指定成员变量的访问权限
    int _int1;
    int _int5;
@protected
    int _int2;
@private
    int _int3;
}
@property int int1;
@property int int5;
@property int myPro;

@end

ClassA.m

@implementation ClassA{
    int _intPrivate;//此处声明的变量为private的
}
@synthesize int1=_myInt8;//_myIn8没有声明,会自动成生,在此类中可以访问
                         //成员变量 _int5 会被自动合成到属性,可以在外部通过“obj -> _int5"的方式直接访问。
                         //系统会自动生成_myPro,只在本类中可以访问
@end


        二、使用

        声明一个属性,如果没有声明为只读的,它默认会生成两个方法 - (type)name 和 - (void)setName; 为了可读性等其它原因,也可以改变属性的setter和getter访问名称,

@property  (setter=setMyValue, getter=getBool) NSInteger  value;

这样的话就可以通过 [obj setMyValue:10] 和 [obj getBool]方法业访问成员变量了,此时setValue方法会被覆盖,不再存在。


        三、@property的修饰属性(attributes )

        可读性:readwrite / readonly ,不写的话默认为readwrite,即会合成setter和getter方法。

原子性:nonatomic / 【默认】,系统默认setter和getter为原子操作(没有atomic关键字),如果想设置为非原子操作,可以nonatomic。       

        内存 assign / retain / weak / strong ,在非ARC环境下, assign为默认,引用计数不变;retain引用计数加1;在引用计数环境下,默认为strong,与retain作用相同;从5.0系统后引入了weak,作用与assign相似,不过当所指向对象引用为0时,自动置为nil。

        

        

### Objective-C 中 `@property` 的用法 在 Objective-C 编程语言中,`@property` 是一种声明属性的方式,简化了对象成员变量的访问控制和内存管理。通过使用 `@property` 关键字可以定义类中的公共接口来获取或设置实例变量。 #### 声明 Property 通常情况下,在头文件 (.h 文件) 中声明属性: ```objc @interface MyClass : NSObject @property (nonatomic, assign) int myInteger; @end ``` 上述代码片段展示了如何创建名为 `myInteger` 的整型属性[^1]。 #### 属性修饰符 当声明一个 property 时,可以通过指定不同的修饰符来自定义其行为。常见的修饰符有 nonatomic/atomic、assign/retain/copy 和 readonly/readwrite 等等。 - **nonatomic / atomic**: 控制多线程环境下的数据安全,默认为 nonatomic。 - **assign / retain / copy**: 定义赋值操作的行为;对于基本数据类型应使用 assign;对于对象指针则根据需求选用 retain 或者 copy[^2]。 - **readonly / readwrite**: 设置该属性是否可读写,默认是 readwrite。 例如: ```objc // 只读字符串属性 @property (copy, readonly) NSString *name; ``` #### 自动合成支持 现代版本的 Xcode 提供自动合成功能,这意味着编译器会自动生成 getter/setter 方法以及对应的 _ivar_(下划线开头的实例变量)。如果希望手动实现这些方法,则可以在 .m 文件内重载它们[^3]。 ```objc @implementation MyClass @synthesize myInteger = _myInteger; // 显式关联 ivar 到 property - (int)myInteger { return _myInteger; } - (void)setMyInteger:(int)newVal { _myInteger = newVal; } @end ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值