弱引用与强引用
__weak typeof(type) 与 __strong typeof(type)。
typeof()可以根据括号里面的变量,自动识别变量类型并返回该类型。__weak弱引用,__strong强引用
- 使用的方式
- 默认使用方式
__weak __typeof__(self) weakSelf = self; __strong __typeof__(weakSelf) strongSelf = weakSelf;
- 宏定义使用
1. 使用@WeakSelf的方式,这种方式用法有点像原生使用(个人感觉略微装逼的使用方式,但是用着不爽,代码不主动补全(可以拉成代码块,然后就好了)) #define WeakSelf(type) autoreleasepool{} __weak __typeof__(type) weakSelf = type; #define StrongSelf(type) autoreleasepool{} __strong __typeof__(type) strongSelf = type; // 如此定义之后可以在这句代码之后直接使用变量weakSelf @WeakSelf(self); weakSelf.title = @"下一个界面"; // 例如如此使用 // 强引用也是如此 @StrongSelf(weakSelf); // 这里是weakSelf strongSelf.title = @"下一个界面"; 2. 使用WeakSelf #define WeakSelf(type) __weak __typeof__(type) weakSelf = type; #define StrongSelf(type) __strong __typeof__(type) strongSelf = type; // 如此定义之后可以在这句代码之后直接使用变量weakSelf WeakSelf(self); weakSelf.title = @"下一个界面"; // 例如如此使用 // 强引用也是如此 StrongSelf(weakSelf); // **这里是weakSelf** strongSelf.title = @"下一个界面";
- 另一个宏定义的方式
#define selfWeak(type) autoreleasepool{} __weak typeof(type) type##Weak = type; #define selfStrong(type) autoreleasepool{} __strong typeof(type##Weak) type##Strong = type##Weak; 或者 #define selfWeak(type) __weak typeof(type) type##Weak = type; #define selfStrong(type) __strong typeof(type##Weak) type##Strong = type##Weak; 这是对第一种的扩展,可以适应更多的方式。我使用selfWeak,只是想保持第二个变量大写。 当然你也可以使用这种方式 #define WeakSelf(type) __weak typeof(type) weak##type = type; #define StrongSelf(type) __strong typeof(weak##type) strong##type = weak##type; // 如此定义之后可以在这句代码之后直接使用变量weakself WeakSelf(self); weakself.title = @"下一个界面"; // 例如如此使用 // 强引用也是如此 StrongSelf(self); // **这里是self** strongself.title = @"下一个界面";
- 区别一就是第一个只适用与self,另一个使用面广。
- 区别二用法上,第一个StrongSelf(weakSelf),另一个StrongSelf(self)。就是第二个会自动处理变量名字。