views:

110

answers:

2

Could anybody shed some light as to why is my app crashing with the following error on iPhone OS 2.2.1

dyld: Symbol not found: _OBJC_CLASS_$_NSPredicate
  Referenced from: /var/mobile/Applications/456F243F-468A-4969-9BB7-A4DF993AE89C/AppName.app/AppName
  Expected in: /System/Library/Frameworks/Foundation.framework/Foundation

I have weak linked CoreData.framework, and have the Base SDK set to 3.0 and Deployment Target set to SDK 2.2

The app already uses other 3.0 features when available and I did not have any problems with those. But apparently the backward-compatibility methods used for other features do not work with Core Data.

The app crashes before app delegate's applicationDidFinishLaunching gets called.

Here's the debugger log:

[Session started at 2010-05-25 20:17:03 -0400.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1119) (Thu May 14 05:35:37 UTC 2009)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "--host=i386-apple-darwin --target=arm-apple-darwin".tty /dev/ttys001
Loading program into debugger…
sharedlibrary apply-load-rules all
warning: Unable to read symbols from "MessageUI" (not yet mapped into memory).
warning: Unable to read symbols from "CoreData" (not yet mapped into memory).
Program loaded.
target remote-mobile /tmp/.XcodeGDBRemote-12038-42
Switching to remote-macosx protocol
mem 0x1000 0x3fffffff cache
mem 0x40000000 0xffffffff none
mem 0x00000000 0x0fff none
run
Running…
[Switching to thread 10755]
[Switching to thread 10755]
Re-enabling shared library breakpoint 1
Re-enabling shared library breakpoint 2
Re-enabling shared library breakpoint 3
Re-enabling shared library breakpoint 4
Re-enabling shared library breakpoint 5
(gdb) continue
warning: Unable to read symbols for ""/Users/alex/iPhone Projects/AppName/build/Debug-iphoneos"/AppName.app/AppName" (file not found).
dyld: Symbol not found: _OBJC_CLASS_$_NSPredicate
  Referenced from: /var/mobile/Applications/456F243F-468A-4969-9BB7-A4DF993AE89C/AppName.app/AppName
  Expected in: /System/Library/Frameworks/Foundation.framework/Foundation

(gdb) 
A: 

Sorry, just re-read your question.. It looks like the framework itself can't be weakly linked. I guess it means you can't have a 2.x target with Core Data framework :(

i.e. the whole framework is not available on the target platform, and weak linking does not apply.

ohhorob
Thanks for the answer. Isn't the same true for other frameworks introduced with 3.0, for example MediaPlayer and MessageUI? They also don't exist on the target platform.
subjective-c
Perhaps. It could be that you have inadvertently used `NSPredicate` which is not specifically Core Data, but provided by it. Are you confirming that `applicationDidFinishLaunching` is not reached with a breakpoint? Are there any class categories that you link/use that require `NSPredicate`?
ohhorob
Not using NSPredicate anywhere else. I set the breakpoint at the beginning of applicationDidFinishLaunching and the app crashes before hitting it.
subjective-c
+1  A: 

Apparently you can't reference NSPredicate by a literal class symbol if you won't to have backwards compatibility with iPhone OS 2.2

So changed my reference to NSPredicate to:

[fetchRequest setPredicate:[NSClassFromString(@"NSPredicate") predicateWithFormat:@"EntryId == %@", [NSNumber numberWithInt: index]]];

and it works now.

See https://devforums.apple.com/message/225591#225591

subjective-c