对象变量和对象语法

时间:2013-07-19 17:48:35

标签: objective-c

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

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持有/表示一个对象还是它实际上成为对象????

2 个答案:

答案 0 :(得分:3)

c1c2不是对象,它们是指向对象的指针。类似地,compResult也是一个指针,但在声明时它是未初始化的,这意味着它没有指向任何特定的对象。

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

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

答案 1 :(得分:1)

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

在赋值compResult包含对add方法中分配的对象的引用之后。在ARC下,默认情况下该变量被视为__strong,这意味着当compResult超出范围时,将释放结果对象。

<小时/> * 从技术上讲,c1c2是指针,但是因为在启用ARC的代码中,它们获得了保留和释放它们所指向的对象的特殊权力,我称之为“对象引用“。