如果我这样做:
1 NSMutableArray *near = [[NSMutableArray alloc] init];
2 NSMutableArray *all = [[NSMutableArray alloc] init];
3 NSMutableArray *current = near;
4 current = all;
near
会怎样?
在第3行,我设置当前指向与近处相同的地址,以便我现在有两个指向内存中相同位置的变量,或者我设置当前指向内存附近的位置,以便我现在有这个结构:
当前 - >附近 - >的NSMutableArray
明显的区别在于第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