【问题标题】:IOS: call a method in another classIOS:调用另一个类中的方法
【发布时间】:2011-10-07 14:14:40
【问题描述】:

我有一个带有“MethodA”的类“ClassA”,我还有一个“ClassB”,我想从“ClassB”调用“methodA”;我写

@classA;

@property(nonatomic, retain) ClassA *classA;
//and also @synthesize...

然后我调用方法

[self.classA method];

但它不调用该方法....然后我在classB中的viewdidload中写

self.classA = [[ClassA alloc]init];

但是这个东西会重置 ClassA 中的变量。

我该如何解决这种情况?

【问题讨论】:

  • 为什么要在 viewDidLoad 方法中实例化属性?通常当你有一个属于另一个类的属性时,你会在类的“init”方法中实例化它。类似于 - stackoverflow.com/questions/7639179/…

标签: objective-c ios xcode class


【解决方案1】:

编辑:我决定重写我的答案,因为我认为原文措辞不好。

我认为您没有理解 Objective-C 2.0 点符号的作用。这很令人困惑,尤其是在使用 C 或 C++ 编程时,因为它在语法上等同于 struct 字段或 class 变量访问运算符,但在语义上有所不同。

使用时:

self.classA = newClassA;

你实际上是在做同样的事情:

[self setClassA: newClassA];

@property classA 使用retain 属性定义时,编译器会生成setter 方法,如下所示:

- (void) setClassA:(ClassA *)newClassA
{
    if (classA != newClassA)
    {
        [newClassA retain];
        [classA release];
        classA = newClassA;
    }
}

在你给出的代码中:

[self.classA method];

实际上展开为:

[self setClassA: method];

这不是你想要的。

避免这种混淆的最简单方法是根本不使用点表示法,尤其是在处理变量分配或释放的同一类的实例方法中。

【讨论】:

  • 但是在这种情况下它不会执行classA中的方法,因为classA的实例是nil
  • 没看懂,能不能写个例子?
  • trojanfoe,这很好地解释了为什么代码不起作用,但您将如何做到这一点才能使其真正起作用?简单地删除点似乎没有帮助
【解决方案2】:

您正在使用 alloc 和 init 创建一个新的 ClassA 实例。您需要将该属性设置为您现有的 classA 实例,如果没有更多上下文,很难建议如何使用,但也许当您创建 class b 时,请执行

classB.classA = self;

这假设 A 类首先创建 B 类。

【讨论】:

  • @blackguardian,你能解释一下你是如何创建 classB 实例的吗?
  • 在A类中我做#import classB;在我做@property (retain) ClassB *classB;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多