小编zou*_*oul的帖子

如何在后台杀死应用程序时执行清理?

我的应用程序在其整个生命周期中创建了一些我需要的临时文件.我最终需要处理这些文件,因此它们不会占用设备上的空间.我想我可以在应用程序退出时删除它们,但是由于引入了多任务处理,因此生命周期并不像以前那么简单.我的主要问题是:当我的应用程序进入后台并在以后被杀时,它会收到applicationWillTerminate:吗?或者只是从记忆中消失了?

当应用程序进入后台时,我无法进行清理,因为它可以在操作过程中进行后台处理,并且一旦它返回到前台就需要临时文件.我想我可以在启动时清理文件,但applicationWillTerminate:无论如何我对这种行为感兴趣.

temporary-files application-lifecycle ios

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

如何阅读iOS 4崩溃日志?

我是iPhone的新手,请耐心等待.

我的应用程序崩溃并在DiagonosticReports中创建.crash文件,但它几乎没有任何信息.它没有告诉我它执行的最后一行代码是什么.在挖掘时,我发现这个博客讨论了符号化工具:

/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneRemoteDevice.xcodeplugin/Contents/Resources/symbolicatecrash
Run Code Online (Sandbox Code Playgroud)

指定目录中不存在此工具.自iOS 3以来有什么变化吗?

iphone ios4 ios

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

在Objective-C中实现Go的'defer'语句?

今天我读到defer了Go语言中的陈述:

一个延迟声明推动一个函数调用到列表中.在周围函数返回后执行已保存调用的列表.延迟通常用于简化执行各种清理操作的功能.

我认为在Objective-C中实现类似的东西会很有趣.你知道怎么做吗?我考虑过调度终结器,自动释放的对象和C++析构函数.

自动释放的对象:

@interface Defer : NSObject {}
+ (id) withCode: (dispatch_block_t) block;
@end

@implementation Defer
- (void) dealloc {
    block();
    [super dealloc];
}
@end

#define defer(__x) [Defer withCode:^{__x}]

- (void) function
{
    defer(NSLog(@"Done"));
    …
}
Run Code Online (Sandbox Code Playgroud)

自动释放的对象似乎是至少持续到函数末尾的唯一解决方案,因为其他解决方案将在当前范围结束时触发.另一方面,他们可以在记忆中停留更长时间,这将是一个麻烦.

Dispatch终结器是我的第一个想法,因为块存在于堆栈中,因此当堆栈展开时我可以轻松地执行某些操作.但是在浏览文档后看起来我不能将一个简单的"析构函数"函数附加到块中,是吗?

C++析构函数大致相同,我会创建一个基于堆栈的对象,其中一个块在析构函数运行时执行.这会将普通.m文件转换为Objective-C++ 有一个丑陋的缺点吗?

我真的不考虑在生产中使用这些东西,我只是对各种解决方案感兴趣.你能想出一些有效但没有明显缺点的东西吗?基于范围和基于功能的解决方案都很有趣.

objective-c go deferred-execution

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

AVAssetExportSession不导出音轨

我有一个应用程序,允许附加多个视频资产并将一个或多个音轨添加到合成.一切似乎都有效,我可以使用最终的合成AVPlayer(尽管音频水平似乎很低).将合成导出到文件后,音轨缺失.

我的代码主要基于WWDC10会话的AVEditDemo示例代码.我已经针对AVEditDemo代码仔细检查了我的代码,但无法找到可能存在的问题.我也检查了论坛,但没有太多与AVFoundation相关的帖子/解决方案.

我们非常欢迎任何帮助.干杯,

让 - 皮埃尔·


使用额外音轨构建合成的方法

笔记:

compositionArray:包含构建组合的资产.
AssetView:包含AVURLAsset的对象.

- (AVMutableComposition *)buildCompositionObjects
{
// no assets available, return nil
if ([compositionArray count] < 1)
{
    return nil;
}

// get the asset video size
AssetView * view =  [compositionArray objectAtIndex:0];
AVURLAsset * asset = view.asset;

CGSize videoSize = [asset naturalSize];

// create new composition
AVMutableComposition * cmp = [AVMutableComposition composition];

// set the size
cmp.naturalSize = videoSize;

// build composition
[self buildComposition:cmp];

// add any extra audio …
Run Code Online (Sandbox Code Playgroud)

iphone audio avfoundation

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

我可以使用Interface Builder在多个笔尖之间注入依赖关系吗?

我习惯从外面为我的对象提供依赖项.Interface Builder是一个帮助实现此目的的工具,但我无法使用多个笔尖.一旦我将主笔尖分成更多文件,我就不能再在不同笔尖中的对象之间建立连接.使用文件所有者并没有多大帮助,因为它只允许我将一个对象传递给一个笔尖.

例:

在此输入图像描述

这里A和B是一些更高级别的对象,C和D是某种更低级别的服务.只要所有物体都在一个大笔尖内(第一张图片),一切都很好.但是当我将笔尖分开分开A和B时,我很难将它们连接到C和D.(显然我不想创建C和D的两个实例,我希望A和B都能说同一个C和D不使用单身人士.)

是否可以在Interface Builder中执行此操作?怎么样?

cocoa dependency-injection interface-builder

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

如何从自定义框架中删除标头?

我有一个使用几个自定义框架的Mac Cocoa应用程序.(Apple将它们称为私有,它是与应用程序一起分发在应用程序包中的框架.)在每个框架中都有一个Headers包含框架头文件的文件夹.在生成的应用程序包中不需要这些,我想将它们保密.目前我使用Run Script构建阶段,其中包含以下行:

# Remove all headers from our private frameworks
find "${TARGET_BUILD_DIR}" -name Headers -print0 | xargs -0 rm -rf
Run Code Online (Sandbox Code Playgroud)

这是做到这一点的方式,还是有更好的方法?


关于我的项目结构的更多信息:我在我的主项目中嵌套了三个Xcode项目,这些项目将我的私有框架作为他们的产品.框架被设置为我的主要目标的目标依赖项.设置的最后一部分是复制文件构建阶段,它接受框架并将它们复制到应用程序包内的Frameworks子文件夹中.(希望这很清楚.)

macos xcode frameworks mac-frameworks

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

如何使用红色窗口按钮检测我的窗口是否正在关闭?

我有一个对话窗口,可以通过自定义取消按钮或使用系统红色窗口按钮取消.取消对话框时,我需要执行一些简单的逻辑.如何检测到用户按下了红色按钮?

我知道我可以使用-windowWillClose:委托回调检测正在关闭的窗口.但是,当对话成功后以编程方式关闭窗口时,也会调用此回调.我也知道我可以简单地设置一个BOOL标志,但有更好的解决方案吗?如果我能检测到红色按钮激活,那将是最好的.

cocoa nswindow nswindowcontroller

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

在iPhone上拨打电话的正确URL是什么?

是自动调用iPhone的代码吗?

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:11111111111"]]);
Run Code Online (Sandbox Code Playgroud)

iphone xcode

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

即使应用程序在白名单中,AXIsProcessTrustedWithOptions 也返回 NO

我们有一个需要访问辅助功能 API 的 Mac App Store 应用程序。从 10.9 Mavericks 开始,对于想要使用辅助功能 API(系统偏好设置?安全和隐私?辅助功能)的应用程序,有一个系统白名单。

在为我们的应用程序测试更新时,我们注意到从旧版本升级后,系统告诉我们我们无权使用 Accessibility API(AXIsProcessTrustedWithOptions返回NO),即使我们的应用程序在白名单中,选中复选框。一旦我们取消选中并重新选中权限,一切正常。

显然,这对我们来说不是一个可以接受的升级方案,尤其是因为可访问性白名单在系统偏好设置中深藏不露,无法通过代码访问。

这是系统bug吗?有已知的解决方法吗?我们会接受在大更新后必须重新检查辅助功能权限 - 将您的用户导航到系统偏好设置只是为了看到已经选中的复选框,而该功能没有工作,这很糟糕。

更新:


在第一次升级后启动期间,系统在控制台中抱怨:

16/03/15 06:47:10,343 tccd[190]: Unable to verify code signing identity of com.company.app:  code failed to satisfy specified code requirement(s)
16/03/15 06:47:10,350 universalAccessAuthWarn[401]: AccessibilityAPI: pid 471, is not allowed to access the accessibility API. Path: /path/to/app
Run Code Online (Sandbox Code Playgroud)

奇怪的是,一旦可访问性白名单上的权限复选框被取消选中并重新选中,即使二进制文件相同,在后续启动期间控制台中也没有错误。


我已经深入了解了实现访问白名单 ( /Library/Application Support/com.apple.TCC/TCC.db)的 SQLite 数据库。该access表包含一个csreq看起来像一些应用程序指纹/哈希 blob 的列:

$ sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db 'select …
Run Code Online (Sandbox Code Playgroud)

macos accessibility mac-app-store

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

尽管存在测试失败,但仍会运行"cabal测试"

我有一个Cabal测试目标:

test-suite Tests
  type:              exitcode-stdio-1.0
  main-is:           Main.hs
  hs-source-dirs:    test, src
  build-depends:     base, …
  default-language:  Haskell2010
Run Code Online (Sandbox Code Playgroud)

一个简单的测试Main.hs:

import Test.HUnit
testSanity = TestCase $ assertEqual "Should fail" 2 1
main = runTestTT testSanity
Run Code Online (Sandbox Code Playgroud)

现在运行cabal test通行证:

Test suite Tests: RUNNING...
Test suite Tests: PASS
Test suite logged to: dist/test/Project-0.1.0-Tests.log
1 of 1 test suites (1 of 1 test cases) passed.
Run Code Online (Sandbox Code Playgroud)

即使在测试套件日志中正确记录了失败:

Test suite Tests: RUNNING...

Cases: 1  Tried: 0  Errors: 0  Failures: 0

### Failure:
Should fail
expected: 2 …
Run Code Online (Sandbox Code Playgroud)

haskell unit-testing cabal

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