У меня есть информация о модификаторах и областях iOS Block, и мне нужна помощь.Описание показать в полном коде - PullRequest
0 голосов
/ 29 ноября 2018

Я провел эксперимент, как показано на рисунке, но не смог понять результат.

Это мой полный код:

#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

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Я не могу найти очень четкого объяснения семантики модификатора ARC strong при использовании для свойств в MRC, но кажется, что в Clang, strong для свойств в MRC означает сохраняющий установщик, если свойствоимеет неблокируемый тип и метод копирования, если свойство имеет тип блока.Я нашел коммит в 2011 в Clang, который реализовал это поведение.

Так вот почему ваш DemoBlock4 копируется - это свойство strong типа блока, для которогоClang создает синтезированный установщик, который копирует блок.

(Обратите внимание, что это отличается от retain, что всегда означает сохранение установщика, даже если свойство имеет тип блока. Поэтому, если вы измените DemoBlock4 с strong до retain, вы увидите, что вместо этого она печатает __NSStackBlock__, и компилятор выдаст вам предупреждение.)

0 голосов
/ 29 ноября 2018

Что касается strong против copy семантики для свойств блока, вы должны использовать copy семантику (а в ARC это происходит автоматически).См. Программирование с помощью Objective-C: Работа с блоками , в котором говорится:

Объекты используют свойства для отслеживания блоков

Синтаксис определения свойства для отслеживания блока аналогичен переменной блока:

@interface XYZObject : NSObject
@property (copy) void (^blockProperty)(void);
@end

Примечание: В качестве атрибута свойства следует указать copy, посколькублок должен быть скопирован, чтобы отслеживать его захваченное состояние за пределами исходной области видимости.Это не то, о чем вам нужно беспокоиться при использовании автоматического подсчета ссылок, поскольку это произойдет автоматически, но лучше всего, чтобы атрибут свойства отображал результирующее поведение.Для получения дополнительной информации см. Темы программирования блоков .

...