Если NSString является классом и передается по ссылке, то почему этот вывод? [Дубликат]

Я наследую и переопределяю RotatingFileHandler обработчика ведения журнала python.

Значение RotatingFileHandler имеет значение self.baseFilename, обработчик будет использовать self.baseFilename для создания logFile. (когда он создает файл первым или когда происходит опрокидывание )

self.shouldRollover() method, Он проверяет, должен ли обработчик листать файл журнала опроса или нет.

Если этот метод return 1, это означает, что произойдет опрокидывание или return 0.

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

----------- ------------------------------Редактировать------------------- ----------------------

Я отправляю код примера.

from logging import handlers

class DailyRotatingFileHandler(handlers.RotatingFileHandler):

    def __init__(self, alias, basedir, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0):
        """
        @summary: 
        Set self.baseFilename to date string of today.
        The handler create logFile named self.baseFilename
        """
        self.basedir_ = basedir
        self.alias_ = alias

        self.baseFilename = self.getBaseFilename()

        handlers.RotatingFileHandler.__init__(self, self.baseFilename, mode, maxBytes, backupCount, encoding, delay)

    def getBaseFilename(self):
        """
        @summary: Return logFile name string formatted to "today.log.alias"
        """
        self.today_ = datetime.date.today()
        basename_ = self.today_.strftime("%Y-%m-%d") + ".log" + '.' + self.alias_
        return os.path.join(self.basedir_, basename_)

    def shouldRollover(self, record):
        """
        @summary: 
        Rollover happen 
        1. When the logFile size is get over maxBytes.
        2. When date is changed.

        @see: BaseRotatingHandler.emit
        """

        if self.stream is None:                
            self.stream = self._open()

        if self.maxBytes > 0 :                  
            msg = "%s\n" % self.format(record)
            self.stream.seek(0, 2)  
            if self.stream.tell() + len(msg) >= self.maxBytes:
                return 1

        if self.today_ != datetime.date.today():
            self.baseFilename = self.getBaseFilename()
            return 1

        return 0

Это DailyRotatingFileHandler создаст файл журнала, например

2016-10-05.log.alias
2016-10-05.log.alias.1
2016-10-05.log.alias.2
2016-10-06.log.alias
2016-10-06.log.alias.1
2016-10-07.log.alias.1
3
задан john doe 13 May 2016 в 03:40
поделиться

7 ответов

предположим, что строка: @ "200" адрес указателя: 0xeeff @ "100" адрес указателя: 0xeeaa

, поэтому ваш код может измениться следующим образом:

 NSString *johnsMoney = @"200";
(johnsMoney = 0xeeff)
 NSString *marysMoney = johnsMoney;
(marysMoney = 0xeeff)

 johnsMoney = @"100";
(johnsMoney = 0xeeaa)
(marysMoney = 0xeeff) 

marysMoney адрес указателя не изменен, но адрес указателя johnsMoney изменился.

Как то же: предположим, что объект: адрес указателя dog1: 0xeeff

, поэтому ваш код может измениться следующим образом:

Dog *dog1 = [[Dog alloc] init];
(dog1 pointer address: 0xeeff)

dog1.name = @"Dog 1";

Dog *dog2 = dog1;
(dog2 pointer address: 0xeeff)

dog1.name = @"Dog 3";
(dog1 pointer address still: 0xeeff)
(dog2 pointer address still: 0xeeff)

Поскольку все они указывают на один и тот же адрес, оба они изменились.

0
ответ дан arrfu 20 August 2018 в 11:30
поделиться

Нет. Помните, что вы имеете дело с указателями. Итак, когда вы делаете

johnsMoney = @"100";

Вы устанавливаете указатель johnsMoney на другой адрес памяти, который содержит значение @"100". marysMoney по-прежнему указывает на исходный адрес со значением @"200".

0
ответ дан drekka 20 August 2018 в 11:30
поделиться

johnsMoney и marysMoney являются указателями на строки .

Когда вы пишете johnsMoney = @"100", теперь он указывает на другую строку. Это не меняет marysMoney, который все еще указывает на исходную строку.

Если вы использовали NSMutableString, а вы [johnsMoney setString:@"100"], то это изменило бы базовые данные (к которым обе переменные все равно будет указывать).

4
ответ дан jtbandes 20 August 2018 в 11:30
поделиться

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

0
ответ дан meda 20 August 2018 в 11:30
поделиться

@ "200" является объектной записью для объекта NSString. У него будет собственное пространство памяти, и johnsmoney укажет на него. Итак, marysmoney никогда не указывает на johnsmoney.

Что на самом деле происходит, это ...

Johns Money 200 // pointer 1
Marys Money 200 // pointer 1
Johns Money 100 // pointer 2
Marys Money 200 // pointer 1

johnsmoney указывает на @ "200". marysmoney также указывает на «200». Когда johnsmoney назначается @ «100», johnsmoney указывает на «100». Пока marysmoney все еще указывает на @ "200".

0
ответ дан Michael Colon 20 August 2018 в 11:30
поделиться

Это не ссылки. Это указатели объектов. Если две переменные указывают на один и тот же объект, изменение одного указателя на другой объект не влияет на другой указатель.

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

1
ответ дан rmaddy 20 August 2018 в 11:30
поделиться
  • 1
    Указатели объектов являются ссылками . Они просто независимы друг от друга. – Avi 13 May 2016 в 07:16

просто.

NSString *johnsMoney = @"200";
//here johnsMoney is declared as NSString, so it will be string type.
//any thing given inside @"" will be considered as string.
//currently, johnsMoney contains 200.

NSString *marysMoney = johnsMoney;
//here marysMoney is declared as NSString, so it will be string type.
//johnsMoney is already a string. therefore, marysMoney automatically reads the
//string in johnsMoney. so currently, marysMoney will also be 200.

NSLog(@"Johns Money %@",johnsMoney);
NSLog(@"Marys Money %@",marysMoney);
//both will be printed as 200. right?

johnsMoney = @"100";
//now johnsMoney reassigned as 100.
//but still marysMoney is 200.
//there is nothing written for changing maryMoney from 200.

NSLog(@"Johns Money %@",johnsMoney);
NSLog(@"Marys Money %@",marysMoney);

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

Note:if any one feels that it is rubbish, kindly please avoid my answer. am sorry to post it. i just only vomited the pointer concept. i don't know how much correct is my answer.

0
ответ дан soorej babu 20 August 2018 в 11:30
поделиться