代码有什么区别:
[[self label] setText:@"Hello"];
[label setText:@"Hello"];
如果我从课堂上调用它们,它们基本相同是否正确?因此,如果我从另一个班级调用它,它将是:
[[someclass label] setText:@"Hello"];
someclass.label.text = @"Hello";
它是否正确?这个自我让我迷失方向。
代码有什么区别:
[[self label] setText:@"Hello"];
[label setText:@"Hello"];
如果我从课堂上调用它们,它们基本相同是否正确?因此,如果我从另一个班级调用它,它将是:
[[someclass label] setText:@"Hello"];
someclass.label.text = @"Hello";
它是否正确?这个自我让我迷失方向。
self
是指向已调用该方法的对象的指针。
[label setText:]
大概会直接访问实例变量。其他方式都通过访问器方法。
是的,两种方式都是正确的。在
someclass.label.text = @"Hello";
您正在直接访问该属性
而在
[[someclass label] setText:@"Hello"];
您正在使用 setter 方法设置由目标 C 为您创建的文本属性的值。
但我更喜欢 set 方法。但是使用属性并没有错。
自我只是向您展示 Label 或您采取的任何东西属于当前班级的方式。self 只会告诉您该实体属于您声明它或为其分配一些值的同一当前类。
如果你将该标签分配给其他类是另一回事。
混淆源于@synthesize
默认情况下会生成一个与属性同名的 iVar。
该[[self label] setText:@"Hello"];
线路将访问该属性label
并调用该属性setText
。
将[label setText:@"Hello"];
访问 iVarlabel
并调用setText
它。
不同之处在于,当您使用 iVar 时,您在属性上设置的任何设置(原子、复制、保留等)都不会受到尊重。
如果您没有任何特别的理由不使用该属性,通常最好只使用该属性。您可以通过使用另一个名称合成 iVar 来使这更容易记住;
@synthesize label = _label;