[英]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];
}
其他幾點:
Array
變量重命名為array
)。 NSInteger
,而不是int
因為所有NSArray
方法都使用NSInteger
,而不是int
。 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.