property 中的strong 与weak,assign

本文深入解析Objective-C中strong与weak关键字的区别及应用。通过实例演示strong如何增加引用计数,以及weak如何避免野指针问题。

property 中的strong 与weak

strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切

 

@property (nonatomic, strong) NSString *string1;   

@property (nonatomic, strong) NSString *string2;  

 

有这样两个属性,

 

 @synthesize string1;   

@synthesize string2;  

 

 

猜一下下面代码将输出什么结果?

 

self.string1 = @"String 1";   

self.string2 = self.string1;   

self.string1 = nil;  

NSLog(@"String 2 = %@", self.string2);  

 

 

结果是:String 2 = String 1

由于string2是strong定义的属性,所以引用计数+1,使得它们所指向的值都是@"String 1", 如果你对retain熟悉的话,这理解并不难。

 

接着我们来看weak关键字:

如果这样声明两个属性:

 

@property (nonatomic, strong) NSString *string1;   

@property (nonatomic, weak) NSString *string2;  


并定义 

@synthesize string1;   

@synthesize string2;  

 

 
 


再来猜一下,下面输出是什么?

 

 self.string1 = @"String 1";   

self.string2 = self.string1;   

self.string1 = nil;  

NSLog(@"String 2 = %@", self.string2);  


结果是:String 2 = null

 

分析一下,由于self.string1与self.string2指向同一地址,且string2没有retain内存地址,而self.string1=nil释放了内存,所以string1为nil。声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样的好处能有效的防止野指针。在c/c++开发过程中,为何大牛都说指针的空间释放了后,都要将指针赋为NULL. 在这儿用weak关键字帮我们做了这一步。


以上来自:http://www.cnblogs.com/mybkn/archive/2012/03/08/2384860.html



使用assign: 对基础数据类型 (NSInteger)和C数据类型(int, float, double, char,等)

assign 不太清楚,大概的意思应该是这样:大家用的是统一个地址,你变,我也变。


`@property (nonatomic, assign)` 是 Objective-C 中用于声明属性的关键字组合,用于告诉编译器该属性的**原子性**和**内存管理语义**。 --- ## 🔍 分析:`@property (nonatomic, assign) long familyId;` ### ✅ `@property` - 是 Objective-C 中用于声明属性的语法糖。 - 编译器会自动为你生成: - **getter 方法**(如 `- (long)familyId;`) - **setter 方法**(如 `- (void)setFamilyId:(long)familyId;`) --- ### ✅ `nonatomic` - 表示这个属性是**非原子性的**(non-atomic)。 - 不保证线程安全。 - 访问速度更快,适合在单线程或你已经控制访问方式的情况下使用。 | 修饰符 | 是否线程安全 | 说明 | |--------|---------------|------| | `atomic` | ✅ 是,默认值 | 保证线程安全,性能略差 | | `nonatomic` | ❌ 否 | 不保证线程安全,性能更好,推荐使用 | --- ### ✅ `assign` - 表示这个属性使用**赋值**的方式进行内存管理。 - 不会增加引用计数(适用于基本数据类型,如 `int`, `float`, `long`, `BOOL`, `struct` 等)。 | 修饰符 | 适用类型 | 是否增加引用计数 | 说明 | |--------|-----------|------------------|------| | `assign` | 基本数据类型 | ❌ 否 | 只做简单赋值 | | `retain` / `strong` | 对象类型(如 `NSString *`) | ✅ 是 | 保留对象 | | `weak` | 对象类型 | ❌ 否 | 弱引用,不增加引用计数 | --- ## ✅ 举个例子: ```objective-c @property (nonatomic, assign) long familyId; ``` 等价于: ```objective-c - (long)familyId { return _familyId; } - (void)setFamilyId:(long)familyId { _familyId = familyId; } ``` 没有涉及内存管理(因为是 `long` 类型,不是对象)。 --- ## 🧠 什么时候用 `assign`? | 类型 | 推荐修饰符 | |------|-------------| | `int`, `float`, `long`, `BOOL` | `assign` | | `NSString *`, `NSArray *` 等对象类型 | `strong` 或 `weak` | | `delegate` | `weak`(防止循环引用) | --- ## ✅ 总结 | 修饰符 | 说明 | 适用类型 | |--------|------|-----------| | `nonatomic` | 非原子操作,不保证线程安全,性能好 | 所有类型 | | `assign` | 简单赋值,不涉及内存管理 | 基本数据类型(如 `long`) | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值