2013-07-14 28 views
1

我們應該在Objective-C的基本屬性上使用屬性(assign)這是常識,但我從來沒有清楚地解釋爲什麼我們要這樣做。爲什麼我們總是分配Objective-C原語?

考慮

[myObject setIntProperty:22]; 

爲具有myObject類​​

我想象說我們會被分配intProperty指針堆棧存儲器保存價值22如此以來,這個指針已經住上對於我們的財產有任何價值,這是否意味着每個原語在堆棧內存中都有無限的生命期?

一些更多的代碼來說明什麼,我不明白:

MyObject.h ----

@interface MyObject : NSObject 
@property (nonatomic, assign) int myInt; 
@property (nonatomic, assign) NSString* myString; 
@end 

OtherFile.m ----

-(void) doSomething 
{ 
    int x = 22; 
    NSString* str = @"something"; 

    MyObject* obj = [[MyObject alloc] init]; 

    obj.myInt = x; 
    obj.myString = str; 

    [self doSomethingInOtherFunctionWith:obj]; 
} 

現在,一旦doSomething函數已經完成並且繼續前進,分配的字符串myString現在指向無,因爲它與函數的本地共享指針str,,該指針在該函數運行。但myInt仍然是22.

我明白,這是它的工作方式,通過價值傳遞,我不質疑它是如何工作的,只是爲什麼。 int不必是某個級別的指針嗎?

+0

對象在堆上,所以他們的ivars也在堆上。使用assign的原因是它們不是對象,所以保留或複製它們是沒有意義的。 –

回答

1

爲什麼我們總是分配Objective-C原語?

因爲我們不能retaincopy它們 - 這隻適用於Objective-C對象。

我想象說我們會被分配intProperty指針堆棧存儲器

沒有,真的沒有。我們正在爲它分配一個int。當然,在內部,實例變量作爲指向int的指針實現到myObject對象中,添加了一些偏移量(由類的實例變量佈局描述)。

但是,如果通過「堆棧變量」,你的意思是「對象[這是C語言的變量]與自動存儲持續時間」,然後沒有。 Objective-C對象通常是動態分配的(也許「在堆上」,但這實際上是不相關的),並且只要它們沒有被釋放,我就活着。即直到他們的參考計數達到零。然後它們被釋放,銷燬,並且它們的所有實例變量(返回相應的@property es)也被取消。

+0

你還在這裏! :)拋開我的是,如果在一個函數內部,我將一個對象分配給一個不同類的屬性,那麼如果我不保留它,那麼該屬性將指向任何內容(因爲該對象本地作用於該函數) 。然而,原語似乎迴避了這個範圍問題,因爲如果我在一個函數內部創建一個int並將其分配給一個屬性,那麼即使它是一個局部變量,它仍然存在,並且永遠不會被保留。 – user

+0

@user請用一些代碼演示您的問題。你寫的東西不會讓我感覺不到。 – 2013-07-14 21:41:26

+0

現在解釋downvote,我絕對看不到任何理由** – 2013-07-14 21:53:13

相關問題