我的应用程序在其整个生命周期中创建了一些我需要的临时文件.我最终需要处理这些文件,因此它们不会占用设备上的空间.我想我可以在应用程序退出时删除它们,但是由于引入了多任务处理,因此生命周期并不像以前那么简单.我的主要问题是:当我的应用程序进入后台并在以后被杀时,它会收到applicationWillTerminate:吗?或者只是从记忆中消失了?
当应用程序进入后台时,我无法进行清理,因为它可以在操作过程中进行后台处理,并且一旦它返回到前台就需要临时文件.我想我可以在启动时清理文件,但applicationWillTerminate:无论如何我对这种行为感兴趣.
我是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以来有什么变化吗?
今天我读到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++ 有一个丑陋的缺点吗?
我真的不考虑在生产中使用这些东西,我只是对各种解决方案感兴趣.你能想出一些有效但没有明显缺点的东西吗?基于范围和基于功能的解决方案都很有趣.
我有一个应用程序,允许附加多个视频资产并将一个或多个音轨添加到合成.一切似乎都有效,我可以使用最终的合成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) 我习惯从外面为我的对象提供依赖项.Interface Builder是一个帮助实现此目的的工具,但我无法使用多个笔尖.一旦我将主笔尖分成更多文件,我就不能再在不同笔尖中的对象之间建立连接.使用文件所有者并没有多大帮助,因为它只允许我将一个对象传递给一个笔尖.
例:

这里A和B是一些更高级别的对象,C和D是某种更低级别的服务.只要所有物体都在一个大笔尖内(第一张图片),一切都很好.但是当我将笔尖分开分开A和B时,我很难将它们连接到C和D.(显然我不想创建C和D的两个实例,我希望A和B都能说同一个C和D不使用单身人士.)
是否可以在Interface Builder中执行此操作?怎么样?
我有一个使用几个自定义框架的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子文件夹中.(希望这很清楚.)
我有一个对话窗口,可以通过自定义取消按钮或使用系统红色窗口按钮取消.取消对话框时,我需要执行一些简单的逻辑.如何检测到用户按下了红色按钮?
我知道我可以使用-windowWillClose:委托回调检测正在关闭的窗口.但是,当对话成功后以编程方式关闭窗口时,也会调用此回调.我也知道我可以简单地设置一个BOOL标志,但有更好的解决方案吗?如果我能检测到红色按钮激活,那将是最好的.
是自动调用iPhone的代码吗?
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:11111111111"]]);
Run Code Online (Sandbox Code Playgroud) 我们有一个需要访问辅助功能 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) 我有一个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) iphone ×3
cocoa ×2
ios ×2
macos ×2
xcode ×2
audio ×1
avfoundation ×1
cabal ×1
frameworks ×1
go ×1
haskell ×1
ios4 ×1
nswindow ×1
objective-c ×1
unit-testing ×1