iOS ARC @property和self

时间:2013-08-21 08:37:09

标签: ios properties automatic-ref-counting

我刚开始用ARC编程, 当我用演示测试weakstrong @property时,我发现了一件奇怪的事情; 这是代码:

在.h文件中,我创建了一个成员变量ctView并添加@property来管理getter和setter。

    @interface ViewController : UIViewController
    {
      CTView * ctView;
    }
    @property(nonatomic,strong)CTView * ctView;

然后在.m文件中,viewdidload方法,我打印出点地址。

ctView = [[CTView alloc] initWithFrame:CGRectMake(10,10,300,400)];    
NSLog(@"%p %p ",self.ctView,ctView);

日志:

0x0 0x7156530

谢谢大家,我犯了一个错误,MRC代码在LLVM GCC 4.2编译器上,ARC代码是Apple LLVM 4.1,这个问题使得MRC应用程序崩溃,:))

5 个答案:

答案 0 :(得分:2)

如果仔细观察,你会发现编辑的警告说:

  

自动合成属性ctView将使用合成变量_ctView,而不是现有变量ctView

这是非常不言自明的。

这是因为现有版本的编译器会在声明属性时自动合成变量。事实上,跳过@synthesized指令将导致编译器以这种形式为您插入

@synthesize ctView = _ctView;

自动创建

  • 实例变量_ctView
  • getter方法-ctView
  • setter方法-setCtView:

不再需要声明变量属性(除非你支持用Objective-C 1.x编写的遗留代码),所以你可以跳过变量声明和{{1完全指令。如果您真的想要使用变量,则必须明确插入

@synthesize

在您的实现文件中,但您没有任何好处,您也将破坏实例变量的命名约定。

答案 1 :(得分:1)

使用新的Xcode,您不再需要声明ivar,可以使用与属性相同的名称自动创建,但前缀为_。 因此,您的财产ctView的ivar称为_ctView

如果你想使用自己的ivar,你必须告诉编译器:

@synthesize ctView = ctView;

答案 2 :(得分:1)

如果你没有提供你自己的属性的getter和setter的实现,或者如果你只是在没有提供变量名的情况下@synthesize它们,Objective-C将自动通过名称等于_ +属性的变量来支持你的属性名称。因此,在您的情况下,您的ctView属性会自动由名为_ctView的变量支持。您自己定义的实例变量是不同的变量。

您可以通过3种方式修复它:

  1. 仅使用getter和setter访问您的媒体资源,因此请使用self.ctView = [[CTView alloc] init...代替ctView = ...并删除您自己定义的变量。
  2. 使用正确的名称访问您的实例变量:_ctView = ...
  3. 让编译器通过.m文件中的@synthesize ctView = ctView;知道要使用的后备变量。

答案 3 :(得分:1)

在Xcode4.4之后,您不需要@synthesize具有实例变量的属性,它可以自动完成。但是,自动生成的ivar名称是属性的前缀为“_”,因此除了手动添加ctView之外,self.ctView iVar和@sythesize ctView=ctView不一样。

答案 4 :(得分:-1)

self.ctView,这是一个名为_ctView的iVar,永远不会获得alloc inited。 只有ctView(注意!= _ctView)才被分配。

这就是为什么你没有得到self.ctView_ctView的地址。