2016-12-12 13 views
0

シンプルなコレクションビューを追加し、バックエンドからフェッチしたアイテムを追加します。すべてのオブジェクトをnsmutablearrayに追加するとメモリが少なくなりますが、フェッチされたオブジェクトをNSObjectに追加するとコレクションビューでは、より多くのメモリが必要です。ここで メモリの問題nsobjectとnsmutablearray UICollectionView

サンプルコード

myObjectModel.hある

#import <Foundation/Foundation.h> 

@interface myObjectModel: NSObject 


@property (nonatomic, strong) NSString *objectTitle; 
@property (nonatomic, strong) NSString *objectDesc; 
@property (nonatomic, strong) NSString *objectImgURL; 

- (id)initWithObjectTitle:(NSString *)dTitle 
      objectImgURL:(NSString *)dObjectImgURL 
       objectDesc:(NSString *)dObjectDesc; 
@end 

myObjectModel.m

#import "myObjectModel.h" 

@implementation myObjectModel 

- (id)initWithObjectTitle:(NSString *)dTitle 
      objectImgURL:(NSString *)dObjectImgURL 
       objectDesc:(NSString *)dObjectDesc { 
    self = [super init]; 
    if (self) { 
     self.objectTitle = dTitle; 
     self.objectImgURL = dObjectImgURL; 
     self.objectDesc = dObjectDesc; 
    } 
    return self; 
} 

@end; 
次いで

Iはcollectionviewの一方を有し、私のUIViewControllerにこのヘッダをインポートすべてのオブジェクトを取得するこのメソッドを追加してそれらのオブジェクトを追加するDその後、NSMutableArrayのここ

 BackendlessDataQuery *query = [BackendlessDataQuery query]; 
      query.queryOptions.pageSize = @(100); //set page size 
     [[backendless.persistenceService of:[Channels class]] find:query response:^(BackendlessCollection *backendlessObjects) { 

      NSArray *currentPage = [backendlessObjects getCurrentPage]; 
    NSMutableArray *arrData = [[NSMutableArray alloc]init]; 
      for (Objects *objects in currentPage) { 

       @autoreleasepool { 

    myObjectModel *dataItem = [[myObjectModel alloc]initWithObjectTitle:backendlessObjects.title 
      objectImgURL:backendlessObjects.image 
       objectDesc:backendlessObjects.Desc; 



     [arrData addObject:dataItem]; 
    } 
//Test is a nsarray added in the header file 
self.test = arrData; 
[self.collectionView reloadData]; 
} error:^(Fault *fault) { 



    }]; 

にそれらを保存すると、私はすべてのオブジェクトがcollectionviewに表示されます。このコードを実行したとき、私は私のコレクションのデータソース

#pragma mark - UICollectionViewDatasource 

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView; { 
    return 1; 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ 

    return [test count]; 
} 

    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

     myCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"data" forIndexPath:indexPath]; 

     myObjectModel *dataItem = (myObjectModel*)[test objectAtIndex:indexPath.row]; 
     // cell.objectTitle.text = dataItem.objectTitle; 



     [cell.channelImg sd_setImageWithURL:[NSURL URLWithString:dataItem.objectImgURL] placeholderImage:[UIImage imageNamed:@"NoImage.png"]]; 

     return cell; 
    } 

に追加するものですが、スクロールしながらメモリを保持します増加する。

+0

私はあなたの質問をしませんでした。 – Mohammadalijf

+0

'collectionViewCells'を再利用していますか?あなたの 'collectionView'の' dataSource'を共有してください。 – Adeel

+0

フェッチされた配列をCore Dataに配置しようとしていますか?その理由はNSObjectですか?助けを得るためにもっと明確にする。 –

答えて

0

理由は、これが非同期で、それがメモリを増加させないことがありますが線の上にコメントURL.ifからイメージをダウンロードします。この

[cell.channelImg sd_setImageWithURL:[NSURL URLWithString:dataItem.objectImgURL] placeholderImage:[UIImage imageNamed:@"NoImage.png"]]; 

を使用しているテストアレイを使用してメモリを増加する理由はありません。