2011-07-11 34 views
28

Tôi đang theo dõi "Lập trình trong Mục tiêu-C" 3 ấn bản và tôi đang gặp sự cố với ví dụ đầu tiên.NSAutoreleasePool không khả dụng

tôi tiếp tục nhận được lỗi này:

Semantic Issue: 'NSAutoreleasePool' is unavailable: not available in automatic reference counting mode

Đây là mã của tôi:

// 
// main.m 
// prog1 // 
// Created by Steve Kochan on 1/30/11. 
// Copyright 2011 ClassroomM, Inc.. All rights reserved. // 

#import <Foundation/Foundation.h> 
int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    NSLog (@"Programming is fun!"); 
    [pool drain]; 
    return 0; 
} 

Bất kỳ cái nhìn sâu sắc sẽ được đánh giá rất nhiều.

+2

Hãy xem bạn có thể đọc câu hỏi của riêng bạn - mã cần được đánh dấu là mã số – Mark

+2

Không phải bản xem trước Lion trong NDA phải không? – Caleb

+0

Bạn không thể đặt câu hỏi này tại đây vì SDK Lion nằm dưới NDA. –

Trả lời

39

Trình biên dịch đang được yêu cầu biên dịch tệp với tính năng ARC (tính tham chiếu tự động) được bật. Tắt tính năng đó hoặc, tốt hơn, hiện đại hóa ví dụ của bạn:

int main (int argc, const char * argv[]) { 
    @autoreleasepool { 
     NSLog (@"Programming is fun!"); 
    } 
    return 0; 
} 

(Không, tôi không thể cho bạn biết cách, cụ thể là tắt ARC, nếu đó là tuyến đường bạn phải đi xuống do NDA đã đề cập ở trên.)

+0

Cảm ơn rất nhiều! Nhiều đánh giá cao. – Greg

+1

Nhận xét của bạn "hiện đại hóa ví dụ của bạn" khiến tôi lo lắng-- Tôi cũng đang bắt đầu một cuốn sách được đề cập trong câu hỏi gốc, nếu ví dụ đầu tiên trong cuốn sách đang làm gì đó "hết hẹn" cho một cuốn sách mới? – chrixian

+1

Kiến thức vẫn có thể áp dụng. Ngay cả với ARC, vẫn hữu ích khi hiểu chi tiết về việc giữ lại/giải phóng thủ công. Heck, ngay cả khi bạn chỉ có ý định viết một ứng dụng iOS, bạn vẫn sẽ được hưởng lợi từ việc biết các ngôn ngữ khác. Nhưng, vâng, cuốn sách ghi lại các mẫu không còn hiện đại nhất. – bbum

3

Dưới đây là link hướng dẫn chuyển đổi của Apple sang ARC.

OK ... kiểm tra this. Thay đổi cụ thể cho NSAutoreleasePool - đây là cách Xcode khởi tạo chính nó khi bạn tạo ứng dụng đầu tiên của mình. Tôi không biết về bạn, nhưng tôi thích ý tưởng này!

Đừng lo lắng nếu bạn đang theo dõi cùng với cuốn sách của Kochan. Khi bắt đầu dự án của bạn, chỉ cần bỏ chọn hộp "Sử dụng ARC". Mọi thứ sẽ hoạt động.

16

Bài đăng nhanh chỉ trong trường hợp bạn vẫn đang tìm kiếm

Bạn có thể tắt ARC trong cài đặt bản dựng.

  • Nhấp vào dự án của bạn, trong trình tổ chức bên trái.
  • Chọn mục tiêu của bạn, trong cột tiếp theo.
  • Chọn tab Cài đặt bản dựng ở trên cùng.
  • Cuộn xuống "Objective-C tự động tham chiếu đếm" (nó có thể liệt kê là "CLANG_ENABLE_OBJC_ARC" dưới User-Defined thiết lập nhóm), (nếu bạn không tìm thấy tùy chọn ARC dưới build cài đặt, có lẽ bạn cần để chuyển đổi trình biên dịch của bạn. Bạn có thể tìm thấy nó trong cài đặt xây dựng)
  • và đặt thành NO.
+0

Điều này đã sửa nó cho tôi trên OS X Lion - Cảm ơn Jason! – Anthony

+0

Câu trả lời của bạn hoạt động tuyệt vời. –

-1

ARC được bật khi bạn tạo dự án mới lần đầu tiên. Phải biết cách duy nhất tôi biết làm thế nào để kích hoạt hoặc không kích hoạt nó là khi bạn lần đầu tiên tạo ra chương trình của bạn. Đây là một trong các hộp kiểm mà bạn phải bỏ chọn.

+0

Câu trả lời của @JasonRogers có sai không khi anh ấy nói cách tắt ARC? – Mark

5

Trong trường hợp của tôi, tôi muốn ARC bật và muốn cập nhật dự án mẫu để hoạt động bình thường. Tài liệu của NSAutoReleasePool của Apple về mặt kỹ thuật chính xác, nhưng không đi thẳng ra ngoài và giải thích điều này.Đây là cách:

Đi chính ứng dụng của bạn, mà có lẽ trông giống như sau:

int main(int argc, char *argv[]) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    int retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([DemoAppDelegate class])); 

    [pool release]; 

    return retVal; 
} 

Và thay đổi nó trông như thế này:

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([DemoAppDelegate class])); 
    } 
} 
Các vấn đề liên quan