1

如果我的主文件中有以下内容

int main ( int argc, const char * argv[])
    {
        @autoreleasepool
        {
            Complex * c1 = [[Complex alloc] init];
            Complex * c2 = [[Complex alloc] init];

            Complex * compResult;

            compResult = [c1 add: c2]; 
            [compResult print];
        {

         return0;        

    {

/**implementation of add method **/
-(Complex *) add: (Complex *) f
{
    Complex *result = [[Complex alloc] init]
    result.real = real + f.real;
    result.imaginary = imaginary + f.imaginary;
    return result;
} 

我知道 c1 和 c2 是对象,但是 compResult 被认为是一个变量,直到我们执行 compResult = [c1 add: c2];

我在这里的假设是 add 方法返回一个 Object 并通过执行 compResult = [c1 add: c2]; 我们将 compResult 设置为等于该对象。那么这会将 compResult 变成一个对象吗?

所以在我看来compResult是一个接收[c1 add: c2]结果的变量,但是当我们做[compResult print]时,我真的很困惑,因为我认为你只能在发送消息时使用这种语法(在这个案例打印)到一个对象?

我想我的主要问题是我们做了 compResult = [c1 add: c2]; 变量 compResult 是持有/代表一个对象还是它实际上成为对象????

4

2 回答 2

3

c1并且c2不是对象,它们是指向对象的指针。同样,compResult也是一个指针,但在声明它的时候它是未初始化的,这意味着它不指向任何特定的对象。

当您通过 调用该add:方法时[c1 add:c2],将创建一个新对象并返回指向它的指针。该指针被分配给compResult. compResult仍然只是一个指针,与 and 完全一样c1c2但现在它指向这个新创建的对象,这意味着您可以[compResult print]像以前一样向该对象发送消息(如 )[c1 add:c2]

add:编辑说明:从您现在使用的保留对象中返回一个自动释放的对象会更惯用。

于 2013-07-19T17:53:34.180 回答
1

对象也不c1c2——它们都是对对象*的引用,如其声明中的星号所示。它们之间的区别在于它们compResult都是在声明时初始化的,而compResult最初是未初始化的。

赋值后compResult持有对add方法内部分配的对象的引用。在 ARC 下,默认考虑变量__strong,这意味着结果对象将在compResult超出范围时被释放。


*从技术上讲,c1andc2是指针,但由于在启用 ARC 的代码中它们获得了保留和释放它们指向的对象的特殊能力,我称它们为“对象引用”。

于 2013-07-19T17:57:01.730 回答