如果我的主文件中有以下内容
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持有/表示一个对象还是它实际上成为对象????
答案 0 :(得分:3)
c1
和c2
不是对象,它们是指向对象的指针。类似地,compResult
也是一个指针,但在声明时它是未初始化的,这意味着它没有指向任何特定的对象。
当您通过add:
调用[c1 add:c2]
方法时,会创建一个新对象并返回指向它的指针。该指针已分配给compResult
。 compResult
仍然只是一个指针,与c1
和c2
完全相同,但现在它指向这个新创建的对象,这意味着您可以向该对象发送消息(如[compResult print]
)就像你之前使用[c1 add:c2]
一样。
编辑说明:从add:
返回一个自动释放的对象而不是你现在使用的保留对象会更加惯用。
答案 1 :(得分:1)
c1
和c2
都不是对象 - 它们都是对象 * 的引用,如声明中的星号所示。它们与compResult
之间的区别在于它们都是在声明时初始化的,而compResult
最初是未初始化的。
在赋值compResult
包含对add
方法中分配的对象的引用之后。在ARC下,默认情况下该变量被视为__strong
,这意味着当compResult
超出范围时,将释放结果对象。
c1
和c2
是指针,但是因为在启用ARC的代码中,它们获得了保留和释放它们所指向的对象的特殊权力,我称之为“对象引用“。