NSString @property, с помощью копии вместо сохраняют

Эта проблема более корректно обрабатывается, разбивая ее на две части.

Первым является преобразование float в int с эквивалентным битовым шаблоном:

def float32_bit_pattern(value):
    return sum(ord(b) << 8*i for i,b in enumerate(struct.pack('f', value)))

Next преобразуйте int в строку:

def int_to_binary(value, bits):
    return bin(value).replace('0b', '').rjust(bits, '0')

Теперь соедините их:

>>> int_to_binary(float32_bit_pattern(1.0), 32)
'00111111100000000000000000000000'
16
задан Coocoo4Cocoa 25 February 2009 в 19:18
поделиться

3 ответа

Да, это - так, чтобы это могло сделать уникальную копию, не влияя на существующие данные. Синтезируемые методы set по существу похожи на это:

// For @synthesize(nonatomic, retain) foo:
- (void) setFoo(NSFoo *theFoo)
{
    [theFoo retain];  // retain new value
    [foo release];    // release old value, if any
    foo = theFoo;     // assign new value
}

// For @synthesize(nonatomic, copy) foo:
- (void) setFoo(NSFoo *theFoo)
{
    NSFoo* newFoo = [theFoo copy];  // make copy
    [foo release];  // release old value, if any
    foo = newFoo;   // assign new value
}

Примечание порядок операций здесь важен - новое значение должно сохраняться/копироваться, прежде чем старое значение выпущено, в случае самоприсвоения. Если бы Вы выпустили сначала и затем присвоили свойство себе, то Вы могли бы освободить значение случайно. Также обратите внимание, что, если старое значение nil, отправляя его release, сообщение в порядке, начиная с отправки сообщения к nil, объект явно позволяется и ничего не делает.

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

// suppose the 'foo' property is declared 'retain' and the 'bar' property is
// declared 'copy'
NSFoo *foo = ...;
NSBar *bar = ...;
someObject.foo = foo;
someObject.bar = bar;
[foo changeInternalState];  // someObject.foo also changes, since it's the same object
[bar changeInternalState];  // someObject.bar does NOT change, since it's a copy
38
ответ дан 30 November 2019 в 16:19
поделиться

Помните, что существует NS, Изменяемый Строка. Это было бы действительно плохо, чтобы быть в состоянии видоизменить содержание строки, которой некоторый другой объект владеет (скажите путем удаления половины его символов), особенно если Вы не понимаете влияние на другой объект. Поэтому это хорошо для другого объекта сделать его собственную копию.

можно ли сказать, что “well, почему я только не копирую строку прежде, чем присвоить его там? ”. Возможно, объект хочет изменяемую строку, и Ваш неизменен. Если необходимо скопировать строку сначала, то необходимо искать, какой вид строки она хочет в ее документации или заголовке, то сделайте правильный вид копии (каждый раз). Таким образом, Вы просто говорите other.string = myString, и это делает любой вид копии этим wants—, Вы не должны волноваться об этом.

3
ответ дан 30 November 2019 в 16:19
поделиться

(По какой-то причине этот пост появляется над последующим вопросом, на который я пытаюсь ответить) Re:

Вы имели в виду, что мне нужно скопировать объект 'foo' перед выпуском 'foo' ?? но в чем проблема, если я перехожу на 'foo' перед копированием 'foo' ??, потому что это два разных объекта, я не могу понять, почему освобождение одного влияет на другое !!!!

В большинстве случаев вы правы. Если они на самом деле два отдельных объекта, это не имеет значения. Проблема заключается в том, что вы назначаете один и тот же объект обратно в себя. Если бы вы сказали

[myObject setFoo: moof];
[myObject setFoo: moof];

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

Это может произойти? Наверное, больше, чем вы думаете. Конечно, бывают случаи, когда пользователь может дважды нажать кнопку «обновить», например.

Надеюсь, это понятно и полезно.

0
ответ дан 30 November 2019 в 16:19
поделиться