2011-07-04 161 views
3

我對下面解釋的一個指針情況感到困惑;指針混淆

在A類

@property(nonatomic,retain)NSMutableArray *words; 

在B類現在

@property(nonatomic,retain)NSMutableArray *words; 

//creating a pointer to words from classB 
self.words = [classB words]; 

,如果我在一個類中添加新詞話陣列,爲什麼不讓我看到,在類的話陣列字B'我認爲我在B類中的單詞數組是指向A類單詞的指針?

+0

兩者都屬於不同的類別。那麼怎麼可能呢? –

+0

@Cyprian classB中的'''屬性是在你做任務的時候實例化的嗎? –

+1

它應該工作。你的代碼中還有其他的東西會導致數組不同。 – 2011-07-04 10:09:02

回答

1

正如你們中的一些人在這裏所說的那樣,它應該是有效的。我的代碼中有一些錯誤。不過想給一個小例子代碼來證明這是應該的:

#import "PointersAppDelegate.h" 

#import "PointersViewController.h" 

#import "ClassA.h" 
#import "ClassB.h" 

@implementation PointersAppDelegate 

@synthesize window=_window; 

@synthesize viewController=_viewController; 

@synthesize classA, classB; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    classA = [[ClassA alloc] init]; 
    classB = [[ClassB alloc] init]; 

    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 

    //Add new word to words in classA 
    [[classA words] addObject:@"two"]; 

    //Print words in classB 
    [classB print]; 

    return YES; 
} 

- (void)dealloc 
{ 
    [_window release]; 
    [_viewController release]; 

    [classA release]; 
    [classB release]; 

    [super dealloc]; 
} 

@end 

// A類

// ClassA.h 

@interface ClassA : NSObject { 
    NSMutableArray *words; 
} 
@property(nonatomic,retain)NSMutableArray *words; 

@end 


// ClassA.m 

#import "ClassA.h" 

@implementation ClassA 

@synthesize words; 


- (id)init{ 
    self = [super init]; 
    if (self) { 
     words = [[NSMutableArray alloc] initWithObjects:@"one", nil]; 
    } 
    return self; 
} 


- (void)dealloc { 
    [words release]; 
    [super dealloc]; 
} 
@end 

ClassB的

// ClassB.h 

#import <Foundation/Foundation.h> 


@interface ClassB : NSObject { 
    NSMutableArray *words; 
} 
@property(nonatomic,retain)NSMutableArray *words; 

-(void)print; 

@end 


// ClassB.m 
#import "ClassB.h" 
#import "PointersAppDelegate.h" 

@implementation ClassB 

@synthesize words; 

- (id)init{ 
    self = [super init]; 
    if (self) { 
     self.words = [[(PointersAppDelegate*)[[UIApplication sharedApplication] delegate] classA] words]; 
    } 
    return self; 
} 

-(void)print{ 
    for(int i=0;i<[words count];i++) 
     NSLog(@"%@", [words objectAtIndex:i]); 
} 

- (void)dealloc { 
    [words release]; 

    [super dealloc]; 
} 
@end 

結果是:

2011-07-04 12:38:33.759 Pointers[20059:707] one 
2011-07-04 12:38:33.767 Pointers[20059:707] two 
1

基本上變化應該反映在兩個數組,直到你改變任何兩個物體的一些地方在你的代碼中參考

//creating a pointer to words from classB 
self.words = [classB words]; 

而在你A類B類一些地方,

self.words = someOtherArray; 

這將使陣列兩個類的指向不同的對象。

+0

我認爲保留只是聲明一個對象的所有權,而不是創建它的副本。 – Cyprian

+0

@Cyprian,是的。抱歉。你是對的。確保你沒有分配任何其他引用到這兩個單詞數組中的任何其他地方。 - EmptyStack – EmptyStack

+0

實際上就像Bavarious所說的,這個想法是正確的,我的代碼中有一些錯誤。 – Cyprian

1

它是你嘗試運行的代碼嗎? 如果是的話,看起來你的B類代碼中有一個mystake,因爲單詞在B類中與[classB單詞]是一樣的。 (在B類中:self.words = [classB words])。 也許一個像這樣的指令:self.words = [classA words] ....應該解決你的問題(假設classA是類A的一個對象)。