//.h
@property (weak, nonatomic) IBOutlet UIImageView *picImageStage;
//.m
NSString *name = [NSString stringWithFormat:@"allen.png"];
UIImage *image = [UIImage imageNamed:name];
UIImageView *t = [[UIImageView alloc]initWithImage:image];
self.picImageStage = t; //正确//将变量声明为 retain, 实现文件中去除临时变量。
//.h
@property (retain, nonatomic) IBOutlet UIImageView *picImageStage;
//.m
NSString *name = [NSString stringWithFormat:@"allen.png"];
UIImage *image = [UIImage imageNamed:name];
self.picImageStage = [[UIImageView alloc]initWithImage:image]; //正确//.h
@property (weak, nonatomic) IBOutlet UIImageView *picImageStage;
//.m
NSString *name = [NSString stringWithFormat:@"allen.png"];
UIImage *image = [UIImage imageNamed:name];
self.picImageStage = [[UIImageView alloc]initWithImage:image]; //错误,为什么

解决方案 »

  1.   

    其实你的第一个写法也是有错误的你这两种写法,都不会作用到 你 的XIB文件里面对应的控件(假设后者运行于XIB文件之后),因为alloc是生成了一个新的instance(实例),一个新的内存地址如果你把IBOutlet去掉,两种写法都是正确的
      

  2.   

    //第一种写法:
    //.h
    @property (weak, nonatomic) IBOutlet UIImageView *picImageStage;
    //.m
    NSString *name = [NSString stringWithFormat:@"allen.png"];
    UIImage *image = [UIImage imageNamed:name];
    UIImageView *t = [[UIImageView alloc]initWithImage:image];
    self.picImageStage = t; //正确//第二种写法:
    //将变量声明为 retain, 实现文件中去除临时变量。
    //.h
    @property (retain, nonatomic) IBOutlet UIImageView *picImageStage;
    //.m
    NSString *name = [NSString stringWithFormat:@"allen.png"];
    UIImage *image = [UIImage imageNamed:name];
    self.picImageStage = [[UIImageView alloc]initWithImage:image]; //正确//第三种写法:
    //.h
    @property (weak, nonatomic) IBOutlet UIImageView *picImageStage;
    //.m
    NSString *name = [NSString stringWithFormat:@"allen.png"];
    UIImage *image = [UIImage imageNamed:name];
    self.picImageStage = [[UIImageView alloc]initWithImage:image]; //错误,为什么谢谢 a21064346 的回复,我这里有三种写法,我主要是不太明白第三种方式。
      

  3.   

    我不知道你说的错误是运行错误还是编译错误?
    但原因应该是这样的
    第一中写法
    UIImageView *t = [[UIImageView alloc]initWithImage:image];
    self.picImageStage = t; //正确
    虽然self.picImageStage是weak的也就是对t没有retain。但t自身没有释放,所以后续还可以操作,出了函数就不行了第三种写法
    self.picImageStage = [[UIImageView alloc]initWithImage:image]; //错误,为什么
    没有变量承载[[UIImageView alloc]initWithImage:image],而self.picImageStage也没有对其Retain所以创建出来就接着销毁了。
    所以赋值没有意义。
      

  4.   

    在第三段代码中,你声明了@property是weak。所以UIImageView会立即被释放,因为如果对同一个对象,没有一个Strong属性的关系,weak属性的关系就等于零。在第一段代码中,你首先将UIImageView分配给了本地变量,而本地变量隐藏的是Strong属性的。如果脱离的Strong属性范围,除非你再指定给它一个Strong关系,不然属性也会被立即释放。。如果你将UIImageView添加为另一个view的子视图也会出现这种情况。所以创建一个Strong关系吧。
      

  5.   

    1.理解xib的含义。IBOutlet 关键字标示的xib中的控件。你既然在xib文件中声明了,为什么要重新构造UIImageView 。
    2.weak和strong应该是ARC机制应用属性。如果用了arc的话retain就不能用了。
      

  6.   

    首先,很感谢大家的回复,
    对于 closewbq 的观点,在第二点上有点不太理解,用了ARC的话,就不能在使用retain了嘛,如果,我要讲其作为成员变量的话,我想还是应该需要的吧,只不过用了arc,不需要自己去写 dealloc. 之前没有说清楚,是 运行 的时候获取不到数据,这个好像跟c++不一样,突然有点想法,也许是这样理解,当声明为weak的变量,他本身就不具有承载数据的能力,他只能是引用被retain之后的数据。不知道是不是这样理解。