Исправлено предупреждение о проблеме с памятью, когда утечка не может найти его
Я снимаю приведенный ниже код в контроллере представления.. Я исправляю проблему с памятью. Когда я закомментирую, представление действительно загружается, даже если требуется больше 80 МБ памяти, что я должен сделать, чтобы решить эту проблему. Я изменил все переменные с сильного на слабый.
@interface bookNowViewController : UIViewController<GMSMapViewDelegate, UIGestureRecognizerDelegate>
@property (weak, nonatomic) IBOutlet UICollectionView *collectionViewBook;
@property (weak, nonatomic) IBOutlet GMSMapView *mapLoc;
@property (weak, nonatomic) IBOutlet UILabel *distanceLbl;
@property (weak, nonatomic) IBOutlet UILabel *rateLbl;
@property (weak, nonatomic) IBOutlet UICollectionView *collectionViewFacility;
@property (weak, nonatomic) IBOutlet UIView *contentView;
@property (weak, nonatomic) IBOutlet UIScrollView *mainScrollView;
@property (weak, nonatomic) IBOutlet UIImageView *animatedImages;//images with fading effect
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *facilityCollectionViewHight;
@property (weak, nonatomic) IBOutlet UILabel *noSportsAvailable;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *facilityLblHightConstant;
@property (weak, nonatomic) IBOutlet UILabel *stName;
@property (weak, nonatomic) IBOutlet UILabel *stAddress;
@property (weak, nonatomic) IBOutlet UIButton *btnI;
@property (weak, nonatomic) IBOutlet UIButton *moreBt;
@property (weak, nonatomic) IBOutlet UIButton *bookNowBt;
@property (weak, nonatomic) IBOutlet UILabel *spRating;
@property (weak, nonatomic) IBOutlet UIView *iNewView;
@property (weak, nonatomic) IBOutlet UILabel *infoLabel;
@property (weak, nonatomic) IBOutlet UILabel *lblIText;
@property (weak, nonatomic) IBOutlet UITextView *textView;
@property (weak, nonatomic) IBOutlet UILabel *confirmationLblText;
и в.m файле
@interface bookNowViewController (){
NSMutableArray *savedList, *stadiumAddress, *stadiumLatitude, *stadiumLongitude, *stadiumId, *stadiumImages, *stadiumPrice, *stadiumRating, *stadiumName, *savedImages, *listFacility, *facility, *vendorId, *vendorName, *sportsName;
NSString *post_id2, *postIndex2, *combineData2, *STName;
NSString *raterName, *ratingValue, *raterImage, *comment;
NSInteger myInt;
UIButton *button;
UILabel *navLabel;
NSString *stadium_Id;
NSMutableArray *imageView;// animation images array
UIView *hideView;
UITapGestureRecognizer *oneTap;
NSUInteger jk;
}
@end
и в viewdidload
[NSTimer scheduledTimerWithTimeInterval:5.0 target:self
selector:@selector(swapImage2) userInfo:nil repeats:YES];
[[NSUserDefaults standardUserDefaults] setObject: nil forKey: @"paymentTag"];
self.navigationController.navigationBar.hidden = NO;
stadium_Id = [[NSUserDefaults standardUserDefaults] valueForKey:@"stadium_Id"];
NSLog(@"%@", stadium_Id);
[ProgressHUD showSuccess:@"" Interaction:YES];
NSString *combined2 = stadium_Id;
NSArray* combineData = [[NSArray alloc]init];
combineData = [combined2 componentsSeparatedByString: @" "];
post_id2 = [combineData objectAtIndex:0];
[[NSUserDefaults standardUserDefaults] setObject: post_id2 forKey: @"stadiumid"];
NSLog(@"%@", post_id2);
postIndex2 = [ combineData objectAtIndex:1];
STName =[combineData objectAtIndex:2];
myInt = [postIndex2 integerValue];
NSLog(@"%ld", (long)myInt);
[self getStadiumDetail];
[self map2];
savedImages = [[NSUserDefaults standardUserDefaults] valueForKey:@"sportsImage"];
sportsName = [[NSUserDefaults standardUserDefaults] valueForKey:@"sportsName"];
if (savedImages.count<1) {
_infoLabel.hidden = NO;
_bookNowBt.hidden = YES;
}
else{
_infoLabel.hidden = YES;
}
[_collectionViewBook reloadData];
[_collectionViewFacility reloadData];
//////////tap gesture
oneTap.numberOfTapsRequired=1;
oneTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTap332)];
oneTap.delegate = self;
// [ProgressHUD showSuccess:@"" Interaction:YES];
self.btnI.layer.cornerRadius = self.btnI.frame.size.width/2;
[self.btnI.layer setBorderWidth:2.0];
[self.btnI.layer setBorderColor:[[UIColor grayColor] CGColor]];
_moreBt.layer.cornerRadius = 4.0f;
_bookNowBt.layer.cornerRadius = 4.0f;
_rateLbl.layer.borderColor = [UIColor lightGrayColor].CGColor;
_rateLbl.layer.borderWidth = 2.0f;
_rateLbl.layer.cornerRadius =_rateLbl.frame.size.width/2;
_rateLbl.clipsToBounds = YES;
_confirmationLblText.text = [[NSUserDefaults standardUserDefaults] valueForKey:@"savedPayText"];
1 ответ
В конце концов, обнулите все изображения, которые вы объявили ранее.
После каждого pushtoViewController nil ссылка, которую вы для него создали.
Используйте @autoreleasepool.
сохраняйте слабые ссылки для Outlets и назначайте любые сильные ссылки для nil** inviewWillDisapper: . Вы можете представить viewController модально как временное прерывание для получения важной информации от пользователя.
Вместо создания новых MKMapView по мере необходимости в приложении, я добавил свойство mkMapView в свой AppDelegate и создавал его только при необходимости. После того, как он был создан, он навсегда живет в AppDelegate, и я использую этот единственный экземпляр везде, где это необходимо. Это действительно помогло уменьшить объем используемой памяти, так как я ранее создавал пару разных MKMapView, и оба довольно быстро прожигали память.
Не используйте -imageNamed Я повторяю, никогда не используйте метод imageNamed, потому что он кэширует изображения. Используйте это вместо -imageNamed: (создайте метод в appDelegate и затем вызывайте его где угодно)
- (UIImage *) method4TakeImagesFromBundel: (NSString *) nameOfImage {NSString fileLocation = [[NSBundle mainBundle] pathForResource: nameOftheImage ofType: @ "png"]; UIImage yourImage = [[UIImage alloc] initWithContentsOfFile: fileLocation]; вернуть ваше изображение; }
- После получения изображения сожмите его и используйте:
NSData * imgData = UIImageJPEGRepresentation (rainyImage, 0.1 / сжатие, качество /);
- Вы можете дополнительно изменить его размер:
- (UIImage *) imageWithImage: (UIImage *) image convertToSize: (CGSize) size {UIGraphicsBeginImageContext (size); [изображение drawInRect: CGRectMake (0, 0, size.width, size.height)]; UIImage * destImage = UIGraphicsGetImageFromCurrentImageContext ();
UIGraphicsEndImageContext (); вернуть destImage; }