2012-04-22 47 views
1

我有我的MainView類的屬性,arr爲什麼在Objective-C和iOS中,[[NSMutableArray alloc] init]給出了警告,但NSMutableArray.new沒有?

@property NSMutableArray *arr; 

在我ViewController.m,裏面viewDidLoad,如果我用

MainView *mainView = (MainView *) self.view; 
mainView.arr = [[NSMutableArray alloc] init]; 

它編譯,但給的「警告正在分配保留對象不安全屬性;對象將在賦值後被釋放「。但如果我將上面的第二行更改爲

mainView.arr = NSMutableArray.new;  

那麼就不會有警告。我以爲alloc init是一樣的new?爲什麼第一個版本會發出警告,實際上是危險的呢,還是可以發出警告?

+0

這是什麼版本的Xcode? – 2012-04-22 05:08:40

+0

Xcode 4.3.2 ..當前的一個 – 2012-04-22 05:36:32

回答

1

我認爲你得到警告的原因是因爲arr不是一個強有力的參考。如果您嘗試「@property(strong,nonatomic)NSMutableArray * arr;」,警告將消失。

P.S. 「(強,非原子)」是採用自動參考計數(ARC)時的使用方法。我也很驚訝,NSMutableArray.new工作。我認爲最好使用「[[NSMutableArray alloc] init]」。這樣,Xcode會告訴你,你正在實例化的類是否有一個更合適的專用初始化器(例如「initWithFrame:」)。

+0

'(strong,nonatomic)'和'(retain)'使警告消失,程序運行正常......我只是不知道哪個版本更標準或者更常見的用法? – 2012-04-22 04:55:52

+0

+ new記錄的內容與+ alloc/-init相同,所以缺少編譯器警告就是錯誤。 – 2012-04-22 15:57:29

1

您必須告訴財產的類型。例如:

@property (retain) NSMutableArray *arr; 

查看文檔屬性類型

+0

'(strong,nonatomic)'和'(retain)'使警告消失,程序運行正常。我只是不知道哪個版本更標準或更常見的用法? – 2012-04-22 04:56:38

+1

強烈使用ARC,保留爲非ARC。 – Rob 2012-04-22 04:59:47

+0

nonatomic更快的方式。在iOS中使用(強,非原子),在mac上(保留)。 – 2012-04-22 05:48:28

2

如果您使用[NSMutableArray new]語法,您將看到警告,因此問題消失並不是問題,而是您的非標準語法NSMutableArray.new未生成警告。問題在於你的屬性默認爲unsafe_unretained,每當你將一個保留的對象賦值給unsafe_unretained對象時,ARC會立即爲你釋放它。只要嘗試添加一個對象到您的數組,然後NSLog'ing它,你會看到EXC_BAD_ACCESS這說明了問題。將您的物業更改爲:

@property (strong, nonatomic) NSMutableArray *arr; 

並且您的問題消失。

同樣,缺少NSMutableArray.new非標準使用的警告並不表示沒有問題,而是編譯器沒有爲您生成警告。 (坦率地說,我真的很驚訝調用一個方法的點語法是可用的,點符號通常用於訪問屬性,而不是用於調用方法。)如果您確實想使用new,請使用[NSMutableArray new]語法。但首選的語法確實是[[NSMutableArray alloc] init]

留意警告。

+0

有趣...即使有警告,我可以訪問數組和addObject到數組中,沒有任何問題......它可以在3分鐘後將一個對象添加到數組中,並且它仍然可以... – 2012-04-22 04:53:11

+0

你使用ARC?我描述的行爲與ARC代碼有關。如果沒有,你會想要使用@ Nikolai的保留語法,它消除了警告。但無論如何,如果沒有屬性的屬性,您不想離開代碼。 – Rob 2012-04-22 05:00:58

+0

在我的ARC項目中,我能夠向數組添加字符串,但是當我做了NSLog(@「%@」,mainView.arr)'時,我得到了EXC_BAD_ACCESS。 – Rob 2012-04-22 05:07:31

相關問題