未申报的NSAutorelease

时间:2014-05-26 15:20:09

标签: ios cygwin nsautoreleasepool theos

我尝试用cygwin和THEOS

构建一个ios应用程序

教程: https://sites.google.com/site/theostutorials/home

经过几次尝试,我成功地完成了本教程的结尾。 最后我只需要运行命令 “make package install”

然后我被卡住了......

CYGWIN TERMINAL:

ron_000@Laptop-Ron ~/projects/hello3
$ make package install
/home/ron_000/projects/hello3/theos/makefiles/targets/Cygwin/iphone.mk:38: Deplo
ying to iOS 3.0 while building for 6.0 will generate armv7-only binaries.

Making all for application hello3...
Copying resource directories into the application wrapper...
Compiling main.m...
main.m:2:2: error: use of undeclared identifier 'NSAutoreleasePool'
    NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];
    ^
main.m:2:21: error: use of undeclared identifier 'p'
    NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];
                       ^
main.m:2:27: error: use of undeclared identifier 'NSAutoreleasePool'
    NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];
                             ^
main.m:3:12: error: implicit declaration of function 'UIApplicationMain' is
  invalid in C99 [-Werror,-Wimplicit-function-decla`enter code here`ration]
    int ret = UIApplicationMain(argc, argv, @"hello3Application", @"...
              ^
main.m:4:3: error: use of undeclared identifier 'p'
    [p drain];
     ^
5 errors generated.
/home/ron_000/projects/hello3/theos/makefiles/instance/rules.mk:96: recipe for t
arget 'obj/main.m.ce2c1a2b.o' failed
make[2]: *** [obj/main.m.ce2c1a2b.o] Error 1
/home/ron_000/projects/hello3/theos/makefiles/instance/application.mk:39: recipe
 for target 'internal-application-all_' failed
make[1]: *** [internal-application-all_] Error 2
/home/ron_000/projects/hello3/theos/makefiles/master/rules.mk:54: recipe for tar
get 'hello3.all.application.variables' failed
make: *** [hello3.all.application.variables] Error 2

有人知道我做错了什么吗?

感谢您提供任何意见,

p.s我希望我能以正确的方式使用codeblock来解决这个问题...

2 个答案:

答案 0 :(得分:1)

您是否正在使用ARC进行编译(自动引用计数)?在这种情况下,docs说:
如果使用自动引用计数(ARC),则无法直接使用自动释放池。相反,您使用@autoreleasepool块。例如,代替:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Code benefitting from a local autorelease pool.
[pool release];
你会写:

@autoreleasepool {
    // Code benefitting from a local autorelease pool.
}  

可以为单个文件禁用ARC,请参阅here

答案 1 :(得分:0)

当您看到未声明的标识符时,是时候考虑环境设置

让我们关注UIApplicationMain

  

main.m:3:12:错误:隐含声明功能' UIApplicationMain'是     在C99中无效[-Werror,-Wimplicit-function-decla enter code here ration]       int ret = UIApplicationMain(argc,argv,@" hello3Application",@" ...

如文档中所述,这个类应该是应用程序的所有内容的开始,因此它必须位于theos设置中的某个位置...

如果你从项目中挖掘theos符号链接

$ cd /to/your/project/dir/theos
$ grep UIKit.h * -C 5

Prefix.pch-#ifdef __OBJC__
Prefix.pch- #import <Foundation/Foundation.h>
Prefix.pch- #if TARGET_IPHONE || TARGET_IPHONE_SIMULATOR
Prefix.pch:     #import <UIKit/UIKit.h>
Prefix.pch- #endif
Prefix.pch-
Prefix.pch- #define CLASS(cls) objc_getClass(#cls)
Prefix.pch-
Prefix.pch- #ifdef DEBUG

你会看到UIKit.h是自动导入的,所以不是问题。

查找该文件

$ find -name UIKit.h
./sdks/iPhoneOS7.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h

如果那个文件确实存在那么,可能是什么问题?让我们详细查看该文件

$ find -name UIKit.h -exec ls -la \{} \;
-rw-r--r-- 1 root wheel 4454 Jul 19 11:14 ./sdks/iPhoneOS7.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h

如果您的文件显示0字节而不是您的问题,那么根本就没有定义!

从xcode.dmg文件中提取sdk似乎是超级复杂的。 This answer几乎可以解决问题,但检查挂载的文件显示其中许多文件的0字节。

尝试从真正的Xcode安装中获取sdk,如果这是你的问题,我打赌它是!