看板 MacDev 關於我們 聯絡資訊
※ 引述《uranusjr (←這人是超級笨蛋)》之銘言: : ※ 引述《Gsus (肉元,吉米,助教)》之銘言: : : 我想請問 : : @interface myObject:NSObject { : : NSString *name; : : } : : @property(readonly) NSString *name; : : ------------------------------------ : : @implementation : : -(NSString*)name { : : return ...... : : } : : @end : : 究竟@property(readonly)是針對interface中name這個變數 : : 還是implementation中name這個method? : @property 只是讓你少寫一些字的捷徑 : 請把它直接想成下面這行: : - (NSString *)name; : readonly 代表, 呃, read-only, 所以就是一個 getter 沒有 setter : 如果你的 @property 後面沒有加 readonly (或有加 readwrite) : 那就是兩行 : - (NSString *)name; : - (void)setName:(NSString *)aName; : 所以你在 .m 裡面照樣實作就對了 ㄟ都...我會問這個是因為我發現我可以declare一個property, ex: @property() NSString *name; 即使@interface中完全沒有 NSString *name這個變數 : : 另外如果我將上述例子改寫為 : : @interface myObject:NSObject { : : NSString *name; : : } : : @property(readonly) NSString *getName; : : ------------------------------------ : : @implementation : : @synthesize getName; : : @end : : 會發生什麼事情? : ============ IMPORTANT NOTE STARTS HERE ============ : We use name only in Cocoa, not getName : ================ END IMPORTANT NOTE ================ : 不過回到你的問題, 事實上是不會有什麼事情發生 : 因為 @synthesize 仍然是一個讓你少打幾個字的工具而已 : 它會合成一組「標準」的 setter-getter : 當然如果你有給 readonly 參數那 @synthesize 就只會生出 getter 不會生 setter 承上,我declare一個property @property() NSString *name; 而且@interface中沒有 NSString *name 這個變數 我發現我仍然可以在@implementation中synthesize這個name, 而且真的works without any warning or error 並且我在@implementation中甚至可以 [self setName:@"test"]; NSLog(@"%@", [self name]); : 說真的, 我很想知道你是不是自學的... : 如果不是, 那要馬你書沒看清楚就跑上來問, 要馬你看到一本爛書 -.- : 因為書裡面應該要把這些東西解釋清楚才對 : 還是要重申一下我覺得初學者不應該使用 @property @synthesize 的立場 : 尤其對於沒有用 garbage collector 的人XD Sorry 我是自學的XD 看了Object-c 2.0 的文件後不是很明白所以才上來發問T_T -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.32.93
uranusjr:我沒記錯的話如果找不到同名變數會自己幫你建一個 12/16 02:28
uranusjr:然後問最後那個只是以防萬一你真的看到爛書要趕快救人XD 12/16 02:29
Gsus:喔喔喔!!! 感謝~ 12/16 02:32
Gsus:那這種被自動建立的變數(if是個物件),將來會被autorelease嗎 12/16 03:30
Blueshiva:自動建立變數的這種行為,要問的應該是要在哪邊關掉吧XD 12/16 04:44