Я провел эксперимент, как показано на рисунке, но не смог понять результат.
Это мой полный код:
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,strong) void (^DemoBlock4)(void);
@property(nonatomic,copy) void (^DemoBlock5)(void);
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Now is MRC, The copy shoudn't Automatic.
int a = 6;
// //__NSStackBlock__
void (^DemoBlock2)(void) = ^{
NSLog(@"DemoBlock2 %d",a);
};
NSLog(@"DemoBlock2 %@",DemoBlock2);
//__NSMallocBlock__
// This is I executed it manually 'copy',[DemoBlock2 copy] is exactly the same as DemoBLock3
NSLog(@"DemoBlock2.Copy %@",[DemoBlock2 copy]);
void (^DemoBLock3)(void) = [DemoBlock2 copy];
NSLog(@"DemoBlock3 %@",DemoBLock3);
//But why self.DemoBlock4 is same __NSMallocBlock__? And I used the 'strong' modifier.
//self.DemoBlock4 log is exactly the same as self.DemoBlock5(I user 'copy'),
self.DemoBlock4 = ^{
NSLog(@"%d",a);
};
NSLog(@"DemoBlock4 %@",self.DemoBlock4);
self.DemoBlock5 = ^{
NSLog(@"%d",a);
};
NSLog(@"DemoBlock5 %@",self.DemoBlock5);
}
Это журнал:
2018-11-30 13:02:35.170860+0800 blocktest[73540:8352045] DemoBlock2 <__NSStackBlock__: 0x7ffeea3b89f8>
2018-11-30 13:02:35.170994+0800 blocktest[73540:8352045] DemoBlock2.Copy <__NSMallocBlock__: 0x60c00005eba0>
2018-11-30 13:02:35.171102+0800 blocktest[73540:8352045] DemoBlock3 <__NSMallocBlock__: 0x60800004ec70>
2018-11-30 13:02:35.171215+0800 blocktest[73540:8352045] DemoBlock4 <__NSMallocBlock__: 0x60c00005f680>
2018-11-30 13:02:35.171320+0800 blocktest[73540:8352045] DemoBlock5 <__NSMallocBlock__: 0x60c00005f0e0>
Итак, свойство copy (например, [копия DemoBlock2]) является автоматическим, даже MRC?
И это делает copy и strong выглядит так же.
Я много об этом читал и узнал, что Apple рекомендует использовать копирование, но я бы хотел узнать больше о том, что происходит, когда в качестве свойства используются различные модификаторы.Итак, я написал этот Купол.
Вот так:
@interface XYZObject : NSObject
@property (copy) void (^blockProperty)(void);
@end
-fno-objc-arc ViewController