Почему назначение блока objc должно быть «копировать», а не «назначать»? - PullRequest
4 голосов
/ 12 января 2011

Я использую блоки в Objective-C и не нашел хорошего объяснения того, почему блоку, если вы собираетесь назначить его переменной экземпляра, нужно присвоить copy а не assign?

например:

typedef void (^MyBlock)();

@interface SomeClass : NSObject
{
    MyBlock myblock;
    // Other ivars
}

@property (nonatomic, copy) MyBlock myblock;  // Why must this be 'copy'???

//  other declarations

@end

Ответы [ 3 ]

9 голосов
/ 12 января 2011

Хорошо, давайте проанализируем это:

Допустим, вы создаете блок внутри некоторого метода, присваиваете его некоторой переменной:

MyBlock block = ^{};

Затем вы просто присваиваете его свойству с помощьюassign:

self.myblock = block;

Когда возвращаемый метод возвращается, переменная block выйдет из области видимости и будет освобождена.Итак, имея это в виду, вы должны copy объект блока и затем сохранить его в переменной вашего экземпляра.Таким образом, вы можете владеть блоком на весь срок жизни содержащего его объекта.

4 голосов
/ 12 января 2011

Это потому, что блоки странные .

0 голосов
/ 12 января 2011

есть хорошее объяснение в видео wwdc "Advanced Objective-C и Сборка мусора", которое стоит посмотреть, если вы начинаете разбираться с блоками и хотите, чтобы кое-что из внутреннего было объяснено.Там есть и другие замечательные разговоры.Настоятельно рекомендуется.

...