Дилемма назначения и переназначения указателя Objective-C - PullRequest
1 голос
/ 14 января 2011

Если я сделаю это:

1 NSMutableArray *near = [[NSMutableArray alloc] init];
2 NSMutableArray *all = [[NSMutableArray alloc] init];
3 NSMutableArray *current = near;
4 current = all;

Что происходит с near?

В строке 3 я устанавливаю ток, чтобы он указывал на тот же адрес, что и ближний, так что теперь у меня есть две переменные, указывающие на одно и то же место в памяти, или я задаю ток, чтобы он указывал на местоположение рядом в памяти, чтобы Теперь у меня есть эта структура:

текущий -> рядом -> NSMutableArray

Очевидной разницей будет значение near в строке 4. Если первое происходит, near не трогается и все еще указывает на свое первоначальное место в памяти. Если последнее происходит,

Ответы [ 4 ]

4 голосов
/ 14 января 2011
1 NSMutableArray *near = [[NSMutableArray alloc] init];

вы создали NSMutableObjectArray с сохранением счетчика 1, «рядом» указывает на него

2 NSMutableArray *all = [[NSMutableArray alloc] init];

вы создали NSMutableObjectArray с сохранением счетчика 1, «все» указывает на него

3 NSMutableArray *current = near;

'current' теперь указывает на тот же объект, что и 'near', т. Е. NSMutableArray с сохраняемым счетчиком 1

4 current = all;

'current' теперь указывает натот же объект, что и у «all», то есть NSMutableArray с сохраняемым счетом 1

отмечает счет сохранения, обычно хорошо, когда вы ссылаетесь на объект, чтобы увеличить количество хранения, чтобы убедиться, что объект все ещеесли другая переменная освобождена:

current = [all retain];
...
[current release];
1 голос
/ 14 января 2011

Вы устанавливаете current, чтобы указать на то же место в памяти, на которое указывает near. Чтобы current указывал на область памяти near, он должен был бы сказать:

current = &near;
0 голосов
/ 14 января 2011
current = all;

просто назначает все на текущий.Следовательно, вы все еще должны отпустить all, когда вы закончите;[all release];.То же самое при ассизировании рядом с током;(Поскольку вы создаете их, используя alloc init)

Это именно то поведение, которое вы получаете, когда объявляете свойство с атрибутом assign с той лишь разницей, что вы не используете self для доступа к current:

@property(nonatomic, assign) NSMutableArray *current;

вы синтезируете его:

@synthesize current;

и затем присваиваете:

NSMutableArray *near = [[NSMutableArray alloc] init];
NSMutableArray *all = [[NSMutableArray alloc] init];
...
self.current = all;  //in your program you will do: current = all;
self.current = near; //in your programm you will do: current = near;
...
[all release];
[near release];

в своем методе dealloc:

current = nil; //this is not necessary but good to do.
//see I am not releasing 'current'?

В качестве альтернативыесть подход сохранения (объяснено @Anders):

@property(atomic, retain) NSMutableArray *current;

self.current = all; //will be similar to: current = [all retain];

, и в этом случае вам нужно будет выпустить current позже

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

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

NSLog(@"current: %p / near: %p", current, near);

В строке 4 рядом будет по-прежнему указывать на тот же объект.

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