小编Flo*_*Flo的帖子

达到内存限制时NSCache崩溃(仅限iOS 7)

我们在我们的应用程序中使用NSCache进行UIImages.这适用于小于7的iOS版本.当发生内存警告时,NSCache会按预期释放对象.但是,在iOS 7上,我们的应用程序在第一次内存警告后不久崩溃.因此,似乎从未发布与NSCache一起存储的对象,但缓存正在增长,直到应用程序崩溃.用仪器进行分析证实了这种怀疑.

是否有其他人遇到此问题,您是否找到了解决方法或已经跟踪错误?

看起来这些人有同样的问题:http://www.photosmithapp.com/index.php/2013/10/photosmith-3-0-2-photo-caching-and-ios-7/

我创建了一个小样本应用程序来说明问题.按下按钮时,将-(IBAction)fillCache:(id)sender调用该方法.从那时起,计时器-(void)addImageToCache:(id)sender每100毫秒调用一次.在此方法中,生成UIImage并将其写入缓存.

在带有iOS 7.0.3的iPad Mini及其512 MB内存中,它在约350次迭代后崩溃.

在具有iOS 5和512 MB内存的iPad 2上,它在某些时候也会崩溃,但仅在至少3000次迭代之后才会崩溃.仪器显示每次发生内存警告时,UIImage实例的数量会减少.在iOS 7上并非如此.

- (IBAction)fillCache:(id)sender
{
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(addImageToCache:) userInfo:nil repeats:YES];
}

- (void)addImageToCache:(id)sender
{
    @autoreleasepool {

        CGRect rect = CGRectMake(0, 0, 500, 500);
        UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        NSString *poolKey = [NSString stringWithFormat:@"junk_%d", count++];
        [self.cache setObject:image forKey:poolKey];

    }
}
Run Code Online (Sandbox Code Playgroud)

memory objective-c nscache ios7

8
推荐指数
1
解决办法
6431
查看次数

更新到iPhone SDK 4.0后,链接器错误(仅限模拟器)具有自己的库

我最近更新到iPhone SDK 4.0,不再能够为iPhone模拟器构建我的项目.问题是ld找不到我自己的一个库的类:

"_OBJC_CLASS_$_Book", referenced from:
   objc-class-ref-to-Book in Category.o
   (maybe you meant: ...)
ld: symbol(s) not found
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我已经阅读了一些关于类似问题的其他帖子,比如这里."不幸的是",我的问题与SDK框架无关,但是我自己的lib,所以这里提到的解决方案不适用于此.

该库包含在我的目标的"Link Binary With Libraries"下,库搜索路径是正确的(使用XCode和直接在我的项目文件中使用纯文本编辑器进行检查)并正确添加到gcc命令中.

我使用iPhone模拟器3.2作为基础SDK,但SDK 4.0也出现同样的问题.同样,这适用于我的设备目标,但不适用于我的模拟器目标.不过,在我从iPhone SDK 3.2更新到4.0之前,它同时适用于两者.我还能够通过创建只有一个文件和链接库的新项目来重现此错误.但是,在我更新XCode和我的SDK之前,lib应该没问题,因为它适用于模拟器3.2.

更多事实:Mac OS X 10.6.3,XCode 3.2.3 64位,iPhone OS 3.2,GCC 4.2

任何帮助将受到高度赞赏.


编辑:

重新安装SDK 3.2后,一切都按预期工作了.必须注意的是,每次安装都会覆盖/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs文件夹中的SDK.然后,我再次尝试重新安装SDK 4.0,并发生与上述相同的错误.我没有更改项目中的任何内容,并始终使用3.2作为Base SDK.

因此,问题可以缩小到以下选项:

  • 苹果改变了...... 在模拟器SDK 3.2中导致问题
  • XCode 3.2.3的更改会导致问题
  • 构建我自己的库时错误/缺少编译器标志(但是,这些标志只会导致更改的SDK或更改的IDE出现问题)

我还在/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.2.sdk上为此文件夹的旧版本和新版本执行了文件夹差异.事实证明,"相同"的SDK中实际上有微小的变化.不过,我仍然认为这是一个IDE /编译器标志问题.

有人有什么想法吗?我不想永远坚持3.2 ...

compiler-construction iphone xcode ios4 ios-simulator

6
推荐指数
1
解决办法
1520
查看次数

UITableView:根据滚动偏移更改节标题高度

我有一个简单的UITableView,并希望有一个"粘性"标题(当表滚动时它保持原样).但是,我想根据滚动位置更改标题的高度.这意味着例如标头最初是100px高.当您向下滚动表格时,标题高度应根据表格视图偏移量减小,直到它保持在最小高度,例如50px.

这是它应该是这样的:

在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述

我已经构建了一个快速原型,但它表现不佳.您是否有任何关于如何使其工作并同时保持平滑滚动表视图的想法?

这是我做的:

根据表视图偏移量返回节标题高度:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{

    CGFloat percentage = max(0, (SCROLL_OFFSET_HEADER_SHRINK - tableView.contentOffset.y) / SCROLL_OFFSET_HEADER_SHRINK);
    int newHeight = max(MIN_HEADER_HEIGHT, min(MAX_HEADER_HEIGHT, MIN_HEADER_HEIGHT + percentage * (MAX_HEADER_HEIGHT - MIN_HEADER_HEIGHT)));
    return newHeight;
}
Run Code Online (Sandbox Code Playgroud)

更新每个滚动事件的表视图,以确保标题高度更改:(这是一件坏事,导致性能不佳)

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ((self.tableView.contentOffset.y > SCROLL_OFFSET_HEADER_SHRINK && 
         self.tableView.tableHeaderView.frame.size.height > MIN_HEADER_HEIGHT) ||
        self.tableView.contentOffset.y < SCROLL_OFFSET_HEADER_SHRINK) {
        [self.tableView reloadData];
    }
}
Run Code Online (Sandbox Code Playgroud)

任何其他方式设置节标题高度而不必重新加载整个表将帮助我很多!我希望这可以在iOS 5+上运行.

height dynamic uitableview ios

6
推荐指数
0
解决办法
4429
查看次数

iOS:如果用户仍有资格免费试用应用内购买订阅,我该如何查明?

我们在iOS应用中提供可自动更新的应用内购买订阅.我们现在想要为我们的订阅添加免费试用期,这已经正常.在我们的应用程序的"商店视图"中,我们显示产品信息以及" 立即免费测试 " 按钮.

但是,如果用户订阅,享受一个不错的免费月份(可能需要支付更多费用)然后取消,她将能够再次看到我们的"商店视图".现在Apple确保同一个App Store用户不再获得免费试用,这是一件好事.但这就是为什么我们也不想让用户" 现在免费测试 ",而是在这种情况下"立即订阅 ".

所以我的问题是:是否有办法告诉(在用户实际购买之前),他是否仍有资格获得免费试用?

如果用户之前已经订阅过,我们可以查看我们自己的用户数据库,但是当她再次使用我们的应用程序注册时,她仍会看到" 现在免费测试 ",但由于她的App Store帐户,她将无法看到已经用完了免费试用期.

objective-c subscription storekit in-app-purchase ios

6
推荐指数
1
解决办法
1290
查看次数

Android:如何检测电子墨水屏幕?

我想让我的应用程序对电子墨水屏幕更友好,即减少渐变,删除动画等.在我为这些屏幕类型添加单独的布局之前,我首先需要一种方法来检测它们.有人找到了这样做的好方法吗?

显示器类看起来并不像它提供了一种方法来检测显示类型...

编辑:通过电子墨水屏幕,我的意思是一个与电子纸技术一起使用的屏幕.

android screen e-ink

5
推荐指数
1
解决办法
658
查看次数