Objective-C指针赋值和重新分配困境

时间:2011-01-14 07:40:20

标签: objective-c pointers

如果我这样做:

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

near会怎样?

在第3行,我设置当前指向与近处相同的地址,以便我现在有两个指向内存中相同位置的变量,或者我设置当前指向内存附近的位置,以便我现在有这个结构:

当前 - >附近 - >的NSMutableArray

明显的区别在于第4行附近的值。如果前者正在发生,附近是未受影响的,仍然指向它在记忆中的初始位置。如果发生后者,

4 个答案:

答案 0 :(得分:4)

1 NSMutableArray *near = [[NSMutableArray alloc] init];

你创建了一个NSMutableObjectArray,其保留计数为1,'near'指向它

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

你创建了一个NSMutableObjectArray,保留计数为1,'all'指向它

3 NSMutableArray *current = near;

'current'现在指向与'near'相同的对象,即具有保留计数1的NSMutableArray

4 current = all;

'current'现在指向与'all'相同的对象,即具有保留计数1的NSMutableArray

注意保留计数,当你引用一个对象来增加保留计数以确保在释放另一个变量时对象仍然存在时通常是好的:

current = [all retain];
...
[current release];

答案 1 :(得分:1)

您要将current设置为指向near指向的内存中的相同位置。为了使current指向near的内存位置,它必须说:

current = &near;

答案 2 :(得分:0)

在第3行,当前和接近指向同一对象(内存中的位置)。您只需记录两个对象的内存地址即可验证:

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

在第4行,near仍将指向同一个对象。

答案 3 :(得分:0)

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