Почему не может я @synthesize средства доступа в категории?

Если вы ничего не делаете с символической ссылкой, попробуйте просто прикоснуться к ссылке?

all : f-b3

init : clean
        ln -s -f f-b2 s-b2

clean :
        -rm f-* s-*

f-b1 :
    touch f-b1 # not necessarily just touch in real makefile

f-b2 : f-b1
    touch f-b2

s-b2 : f-b2
    touch s-b2 # would be just this in real makefile

f-b3 : s-b2
    touch f-b3

Пример make result:

$ make init
rm f-* s-*
ln -s -f f-b2 s-b2
$ make
touch f-b1
touch f-b2
touch s-b2
touch f-b3
$ touch f-b1
$ make
touch f-b2
touch s-b2
touch f-b3
$ touch f-b2
$ make
touch f-b3
7
задан 18 May 2009 в 17:56
поделиться

2 ответа

Проблема в том, что категории логически отделены от своих классов и даже хранятся отдельно в двоичный файл. Внутренняя реализация заключается в том, что структура описания класса содержит массив списков методов, который изначально содержит только список методов, определенных в основном блоке @implementation . Поскольку модули компоновщика ObjC загружают новые категории, их списки методов добавляются в этот массив.

Из-за этой реализации сами категории не имеют средств доступа к хранилищу для класса и, следовательно, не могут его изменять (это также открывает вопрос, что делать, когда категория не загружается).

Наконец, с более логической, чем технической точки зрения, идея состоит в том, что категория не имеет никакого «владения» структурой класса в памяти, она просто связывает некоторые новые методы . Для полной поддержки синтеза свойств потребуется как-то изменить хранилище класса

Решение? Вы либо помещаете операторы @synthesize в свой основной блок @implementation, либо просто реализуете свои собственные средства доступа непосредственно в категории @implementation.

сами категории не имеют средств доступа к хранилищу для класса и, следовательно, не могут его изменять (это также открывает вопрос о том, что делать, когда категория не загружена).

Наконец, из более логичного, чем с технической точки зрения идея состоит в том, что категория не имеет никакого «владения» структурой класса в памяти, она просто связывает некоторые новые методы. Для полной поддержки синтеза свойств потребуется как-то изменить хранилище класса

Решение? Вы либо помещаете операторы @synthesize в свой основной блок @implementation, либо просто реализуете свои собственные средства доступа непосредственно в категории @implementation.

сами категории не имеют средств доступа к хранилищу для класса и, следовательно, не могут его изменять (это также открывает вопрос о том, что делать, когда категория не загружена).

Наконец, из более логичного, чем с технической точки зрения идея состоит в том, что категория не имеет никакого «владения» структурой класса в памяти, она просто связывает некоторые новые методы. Для полной поддержки синтеза свойств потребуется как-то изменить хранилище класса

Решение? Вы либо помещаете операторы @synthesize в свой основной блок @implementation, либо просто реализуете свои собственные средства доступа непосредственно в категории @implementation.

с более логической, чем технической точки зрения, идея состоит в том, что категория не имеет никакого «владения» структурой класса в памяти, она просто связывает некоторые новые методы. Для полной поддержки синтеза свойств потребуется как-то изменить хранилище класса

Решение? Вы либо помещаете операторы @synthesize в свой основной блок @implementation, либо просто реализуете свои собственные средства доступа непосредственно в категории @implementation.

с более логической, чем технической точки зрения, идея состоит в том, что категория не имеет никакого «владения» структурой класса в памяти, она просто связывает некоторые новые методы. Для полной поддержки синтеза свойств потребуется как-то изменить хранилище класса

Решение? Вы либо помещаете операторы @synthesize в свой основной блок @implementation, либо просто реализуете свои собственные средства доступа непосредственно в категории @implementation.

s хранилище каким-то образом

Решение? Вы либо помещаете операторы @synthesize в свой основной блок @implementation, либо просто реализуете свои собственные средства доступа непосредственно в категории @implementation.

s хранилище каким-то образом

Решение? Вы либо помещаете операторы @synthesize в свой основной блок @implementation, либо просто реализуете свои собственные средства доступа непосредственно в категории @implementation.

9
ответ дан 7 December 2019 в 03:20
поделиться

Заданный здесь вопрос касается проблемы частного доступа. Это подходит из точки зрения, не являющейся частным доступом.

0
ответ дан 7 December 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: