clang編譯objective-c失敗
怪我咯
怪我咯 2017-05-02 09:32:47
0
3
774
#import <Foundation/Foundation.h>

extern void _objc_autoreleasePoolPrint();

int main(int argc, char * argv[]) {
    @autoreleasepool {
        Person *p = [Person new];
        Person __weak *p2 = p;
        _objc_autoreleasePoolPrint();
    }
}

結果是這樣的:

$ clang -rewrite-objc -fobjc-arc main.m
/var/folders/t0/nty3j9vx1rn8786q_tpclydc0000gn/T/main-2fe2fd.mi:46509:31: error: cannot create __weak reference
      because the current deployment target does not support weak references
        Person __attribute__((objc_ownership(weak))) *p2 = p;
                              ^
1 error generated.

求解答

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(3)
Peter_Zhu

__Weak不是應該在類別名稱前面嗎?

阿神

weak 需要運行時環境的支援。

xcrun --show-sdk-path > SDK_PATH;clang -x objective-c -isysroot $SDK_PATH -rewrite-objc -fobjc-arc -fblocks -mios-version-min=8.0.0 -fobjc-runtime=ios-8.0.0 -O0 main.m

當你選擇了一個合適的最低版本後,才能編譯有 weak 修飾變數的原始碼。

習慣沉默

參數rewrite-objc是把objc程式碼「導出」為c++程式碼,而__weak是在objc ARC編譯時修改的,你是要編譯還是轉換?
轉換的話把 __weak 改為 __unsafe_unretained 。
編譯的話去掉 rewrite-objc 參數。

$ clang -fobjc-arc main.m -o main.o
$ ./main.o
objc[91465]: ##############
objc[91465]: AUTORELEASE POOLS for thread 0x7fff7c93f000
objc[91465]: 1 releases pending.
objc[91465]: [0x7f8471000000]  ................  PAGE  (hot) (cold)
objc[91465]: [0x7f8471000038]  ################  POOL 0x7f8471000038
objc[91465]: ##############
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板