我正在使用iOS 4.0 SDK运行Xcode 3.2.3.我使用Base SDK = iphoneos4.0,Active SDK = iphoneos4.0,Deployment Target = 3.1.3和Architecture = standard(arm6 arm7)构建了我的应用程序.编译器= GCC 4.2.据我了解,这是为iOS 4和3 构建应用程序的正确方法.
该应用程序在运行iOS 4的设备上运行良好.但是当您尝试在具有iOS 3.1.3(iPod Touch 1G)的设备上运行它时,它会在启动时崩溃:
dyld: Symbol not found: __NSConcreteStackBlock
Referenced from: /var/mobile/Applications/192B30ED-16AC-431E-B0E9-67C1F41FD5DA/MyApp.app/MyApp
Expected in: /usr/lib/libSystem.B.dylib
Run Code Online (Sandbox Code Playgroud)
在我的main()函数被调用之前,它似乎是一个相当"低级"动态链接库的问题.我甚至尝试重新启动设备等,没有运气.这是崩溃日志的一部分:
Process: MyApp [60]
Path: /var/mobile/Applications/192B30ED-16AC-431E-B0E9-67C1F41FD5DA/MyApp.app/MyApp
Identifier: MyApp
Version: ??? (???)
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2010-07-22 17:16:17.942 -0400
OS Version: iPhone OS 3.1.3 (7E18)
Report Version: 104
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x00000001, 0xe7ffdefe
Crashed Thread: 0 …Run Code Online (Sandbox Code Playgroud) 我试图在一个名为addToPlaylist和removeFromPlayList的UITableViewCell中为2个UIButton设置动画(刷过后它们会向右移动)并使用如下块
[UIView animateWithDuration:0.25 animations:^{
self.addToPlaylist.center = CGPointMake(contentsSize.width + (buttonSize.width / 2), (buttonSize.height / 2));
self.removeFromPlaylist.center = CGPointMake(contentsSize.width + (buttonSize.width / 2), (buttonSize.height / 2));
myImage.alpha = 1.0;
}
completion:^ (BOOL finished)
{
if (finished) {
// Revert image view to original.
NSLog(@"Is completed");
self.addToPlaylist.hidden = YES;
self.removeFromPlaylist.hidden = YES;
self.hasSwipeOpen = NO;
}
}];
Run Code Online (Sandbox Code Playgroud)
完成后我想隐藏按钮以尝试减少重绘滚动等.
这段代码位于' - (void)swipeOff'中,在UITableViewControllers方法中调用scrollViewWillBeginDragging,如下所示:
- (void)scrollViewWillBeginDragging:(UIScrollView *) scrollView
{
for (MediaCellView* cell in [self.tableView visibleCells]) {
if (cell.hasSwipeOpen) {
[cell swipeOff];
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是完成代码,如果我删除它或将其设置为nil一切都很好,如果我包含它我得到一个EXC_BAD_ACCESS.即使我将其包含在if(已完成)注释掉的任何或所有行中
我是以错误的方式使用它,任何帮助都非常感激. …
据我所知,Block就像一个对象,因为你可以向它发送复制或释放消息,例如:
[myBlock copy];
Run Code Online (Sandbox Code Playgroud)
但是每当我这样做或释放一个块时,我都会得到EXC_BAD_ACCESS.
如果我使用块函数,一切都按预期工作,例如:
Block_copy(myBlock);
Run Code Online (Sandbox Code Playgroud)
我认为释放和复制块的两种方式都是相同的?
这不是一个问题,但如果我有一个Block的属性(副本)有点烦人,我必须自己编写setter方法.
例如:使用属性:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock;
Run Code Online (Sandbox Code Playgroud)
设置时会导致EXC_BAD_ACCESS cancelledBlock
但如果我这样做:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock; //saves me doing the getter as well
- (void)setCancelledBlock:(void (^)(void))aCancelledBlock {
if (cancelledBlock == aCancelledBlock) {
return;
}
void (^oldValue)(void) = cancelledBlock;
cancelledBlock = Block_copy(aCancelledBlock);
Block_release(oldValue);
}
Run Code Online (Sandbox Code Playgroud)
没有EXC_BAD_ACCESS,一切都按预期运行.
因为我经常在3.1.3设备上测试我的应用程序,所以我必须添加一个链接标志"-weak_library /usr/lib/libSystem.B.dylib"来支持那里的块.直到我开始从Apple样本中添加一些游戏中心编码之后,这才成问题.只有在模拟器中,当一个块(甚至是一个空块)作为GC编码中的认证回调被移交时,我才会在Apple的libs深处遇到一个瞬间崩溃(EXC_BAD_ACCESS).当我提供nil作为回调时,GC登录工作正常,应用程序继续.虽然在所有真实设备上都可以正常工作(iPad,带有iOS 4.3的iPhone,带有iOS 3.1.3的iPod - 当然还有GC).当我删除链接器的弱链接标志时,它也将在模拟器中运行w/o问题.有没有人知道那里发生了什么?这不是一个令人满意的解决方案,只有在我想要部署到我的古老iPod时才添加链接器标志.
谢谢,habitoti