簡體   English   中英

滾動圖像中強弱屬性的區別

[英]Difference between strong and weak property in scrolling image

在我的應用程序中,我有一個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];

    }

您的代碼的問題是濫用圖像視圖屬性。 在您的代碼中根本不需要它。 在循環內使用局部變量,如下所示:

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變量分配一個浪費的數組。

即使你為此濫用了一個屬性,我懷疑你的代碼可以使用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];

這可能有所幫助,因為將圖像視圖添加為子視圖會保留強大的參考。 但這真的沒有實際意義,因為你根本就不應該這樣做。

將屬性聲明為強大是要求系統保證只要您在那里,所引用的對象就會存在。 如果您具有循環的強關系,這可能會導致內存泄漏。 這就是將對象聲明為弱的原因:這意味着您不需要此保證。 大多數情況下,當你知道某個其他對象與被引用對象有很強的關系時,你會這樣做,所以你確定它會存在。 這樣做是為了防止循環的強關系。 所以:A - 強 - > B和B - 強 - > C和C - 強 - > A意味着沒有任何對象將被釋放。 所以你至少要使其中一個關系變弱。 在您將子視圖聲明為弱的情況下,如果沒有其他對象與它們有很強的關系,系統可以自由地釋放它們。 因此,在您看到它們之前,它會釋放它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM