滚动图像中强弱属性的区别

时间:2016-01-11 18:37:46

标签: ios objective-c

在我的应用程序中,我有一个scrollview,我在子视图中设置了20个图像。

当我像这样设置图像视图的弱属性时

@property (weak, nonatomic) IBOutlet UIImageView *ImageofScrollView;

ImageView不显示任何图像。

当我设置该图像视图的强大属性时,如下所示

@property (strong, nonatomic) IBOutlet UIImageView *ImageofScrollView;

然后所有图像都正常显示。

我无法理解这个房产里发生了什么?

for (int i = 0; i <[Array count]; i++)
    {
        //set frame for scroll view image
        CGRect frame;
        frame.origin.y = self.ScrollView.frame.size.height/2 * i;
        frame.origin.x = self.ImageofScrollView.frame.origin.x;
        frame.size.height = self.ScrollView.frame.size.height/2;
        frame.size.width=self.ImageofScrollView.frame.size.width;

        NSMutableDictionary *mudi=[[NSMutableDictionary alloc]init];
        mudic=[Array objectAtIndex:i];

            self.ImageofScrollView=[[UIImageView alloc]initWithFrame:frame];
            self.ImageofScrollView.contentMode=UIViewContentModeScaleAspectFit;
            [commonUtils setImageViewAFNetworking:_ImageofScrollView withImageUrl:[mudic objectForKey:@"logourl"] withPlaceholderImage:nil];
            [self.ScrollViewaddSubview:self.ImageofScrollView];

    }

2 个答案:

答案 0 :(得分:2)

您的代码存在的问题是滥用了图片视图属性。在您的代码中根本不需要它。在循环内使用局部变量,如下所示:

for (NSInteger i = 0; i < [Array count]; i++)
{
    NSMutableDictionary *mudic = Array[i];

    //set frame for scroll view image
    CGRect frame;
    frame.origin.y = self.ScrollView.frame.size.height/2 * i;
    frame.origin.x = self.ImageofScrollView.frame.origin.x;
    frame.size.height = self.ScrollView.frame.size.height/2;
    frame.size.width = self.ImageofScrollView.frame.size.width;

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    [commonUtils setImageViewAFNetworking:imageView withImageUrl:mudic[@"logourl"] withPlaceholderImage:nil];
    [self.ScrollViewaddSubview:imageView];
}

其他几点:

  1. 变量和方法名称应以小写字母开头。类名以大写字母开头。 (例如,将Array变量重命名为array
  2. 使用正确的数据类型。循环变量应该是NSInteger,而不是int,因为所有NSArray方法都使用NSInteger,而不是int
  3. 使用现代语法。它更容易阅读和写作。
  4. 您不必要为mudic变量分配一个浪费的数组。
  5. 即使您滥用了某个属性,我怀疑如果您从以下两行切换,您的代码也可以使用weak属性:

    [commonUtils setImageViewAFNetworking:_ImageofScrollView withImageUrl:[mudic objectForKey:@"logourl"] withPlaceholderImage:nil];
    [self.ScrollViewaddSubview:self.ImageofScrollView];
    

    为:

    [self.ScrollViewaddSubview:self.ImageofScrollView];
    [commonUtils setImageViewAFNetworking:_ImageofScrollView withImageUrl:[mudic objectForKey:@"logourl"] withPlaceholderImage:nil];
    

    这可能有所帮助,因为将图像视图添加为子视图会保留强大的参考。但这真的没有实际意义,因为你根本就不应该这样做。

答案 1 :(得分:1)

声明一个强大的属性是要求系统保证只要你在那里就会存在被引用的对象。如果您具有循环的强关系,这可能会导致内存泄漏。这就是声明一个物体变弱的原因:这意味着你不需要这种保证。大多数情况下,当你知道某个其他对象与被引用对象有很强的关系时,你会这样做,所以你确定它会存在。这样做是为了防止循环的强关系。所以:A - 强 - &gt; B和B - 强 - &gt; C和C - 强 - > A表示不会释放任何对象。所以你至少要使其中一个关系变弱。在您将子视图声明为弱的情况下,如果没有其他对象与它们有很强的关系,系统可以自由地释放它们。因此,在您看到它们之前,它会将它们解除分配。

相关问题