Передача указателя по ссылке на класс и использование его - PullRequest
0 голосов
/ 16 мая 2011

Я пытаюсь передать указатель по ссылке на объект из класса A в класс B. В классе BI хочу назначить этот указатель на ivar, а также прочитать и записать его.это дает мне ошибки (не имеет значения, какие ошибки).Это моя первая попытка с указателями, поэтому, пожалуйста, исправьте мое понимание.

Class A

//This is the parameter I would like to pass as a pointer and be able to manipulate from class B
NSString *name = @"Cyprian";

-(void)passAParameter{

   ClassB *classB = [[ClassB alloc] initWithAPointer:&name];
   ...
}


Class B

// ClassB.h
@interface ClassB{

    NSString **nameFromClassA;
}
@property(nonatomic,assign)NSString **nameFromClassA;

-(id)initWithAPointer:(NSString **)name;
// ClassB.m


@implementation ClassB

@synthesize nameFromClassA;

-(id)initWithAPointer:(NSString **)name{
   *nameFromClassA = *name;
}

//Print the name
-(void)printName{
   NSLog(@"Name: %@", *nameFromClassA);
}

//Will this change the name in class A?
-(void)changeNameInClassA:(NSString* newName){
   *nameFromClassA = newName;
}

Ответы [ 2 ]

2 голосов
/ 16 мая 2011

Пожалуйста, не используйте двойные указатели здесь.Вы не должны обращаться с такими вещами.Это более простой подход:

В экземпляре ClassA:

-(void)passAParameter{
   NSString *name = @"Cyprian";
   ClassB *classB = [[ClassB alloc] initWithAPointer:name];
   ...
}

Пока вы определяете ClassB следующим образом: ClassB.h:

@interface ClassB{    

    NSString *nameFromClassA;
}
@property(nonatomic,retain) NSString *nameFromClassA; // Retaining it will give you less headaches

-(id)initWithAPointer:(NSString *)name;
@end

ClassB.m:

@implementation ClassB

@synthesize nameFromClassA;

// You should release all retained object when deallocating self
- (void) dealloc {
    [nameFromClassA release];
    nameFromClassA = nil;
    [super dealloc];
}

-(id)initWithAPointer:(NSString *)name{
    if ((self = [super init])) {     // Always init the object from super!
        self.nameFromClassA = name;  // Retain the object calling self.
    }
    return self;
}

//Print the name
-(void)printName{
   NSLog(@"Name: %@", nameFromClassA);
}

//Will this change the name in class A?
-(void)changeNameInClassA:(NSString* newName){
    self.nameFromClassA = newName; // Retain it calling self.
}

@end
1 голос
/ 16 мая 2011

Назначение в вашем методе initWithAPointer: должно быть просто:

nameFromClassA = name;

Тем не менее, этот шаблон кода пахнет плохим дизайном. Какую цель высокого уровня вы пытаетесь достичь?

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