我刚开始用ARC编程,
当我用演示测试weak
,strong
@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应用程序崩溃,:))
答案 0 :(得分:2)
如果仔细观察,你会发现编辑的警告说:
自动合成属性
ctView
将使用合成变量_ctView
,而不是现有变量ctView
这是非常不言自明的。
这是因为现有版本的编译器会在声明属性时自动合成变量。事实上,跳过@synthesized
指令将导致编译器以这种形式为您插入
@synthesize ctView = _ctView;
自动创建
_ctView
-ctView
-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种方式修复它:
self.ctView = [[CTView alloc] init...
代替ctView = ...
并删除您自己定义的变量。_ctView = ...
。@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
的地址。