【问题标题】:I want to set ivar using -> operator我想使用 -> 运算符设置 ivar
【发布时间】:2012-06-28 15:18:28
【问题描述】:

我想使用 -> 运算符设置 ivar。我收到一个错误:无法静态分配接口类型。我不想要点运算符。

 @interface Dream : NSObject

 @property (nonatomic, assign) BOOL isBeer;

 @end

类视图控制器

 - (void)viewDidLoad
{
 [super viewDidLoad];

  Dream dr1;
  (&dr1)->isBear = YES;
 }

【问题讨论】:

  • 很久没用->操作符了。我忘记了一些方面。现在我正在尝试更新我对这个运算符的了解。

标签: objective-c ios ivar


【解决方案1】:

您在声明中缺少“*”:

Dream *dr1;

这就是编译器出错的原因。

在 Objective-C 中,对象仅由指针引用,就像使用 new() 创建的 C++ 实例一样。

另外请注意,对于 Objective-C 对象,'->'(箭头)和 '.'(点)之间的区别与 C++ 对象/C 结构相同。在 C/C++ 中,您使用点来访问堆栈变量的成员,例如:

// Stack
MyClass myObject;
myObject.memeber = 1; 

MyStruct info;
info.member = 1;


// Heap
MyClass* pMyObject = new MyClass();
myObject->memeber = 1; 

MyStruct* pInfo = (MyStruct*) malloc(sizeof(MyStruct));
pInfo->member = 1;

而在 Objective-C 中,所有对象都是堆的(仅由指针引用),因此您只能使用箭头访问成员。

另一方面,点具有不同的含义,即为属性调用 getter/setter,可能由 ivar 支持。(取决于内部)

【讨论】:

  • 或者正如 joerick 所说,你只能在堆上创建对象,而不能在栈上。
  • 访问堆上的未初始化对象;双倍的乐趣!
【解决方案2】:

您需要将实例变量公开:

@interface Dream : NSObject
{
@public
    BOOL isBeer;
}
@end

类视图控制器

- (void)viewDidLoad
{
    [super viewDidLoad];

    Dream *dr1 = [[Dream alloc] init];
    dr1->isBeer = YES;
}

【讨论】:

  • 产生的错误实际上出在Dream dr1;这一行,你不能在栈上创建objective-C对象。
  • @joerick 嗯?我想你想对这个问题发表评论?
  • 您更正了答案中的两个错误 - 一个是 ivar 的可见性,但您也更正了对象声明...对象声明导致 无法静态分配接口类型 错误,我只是指出这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
相关资源
最近更新 更多