objective-c - 為什麼這段Objectc會報錯?
阿神
阿神 2017-04-24 09:13:51
0
4
729


#import <Foundation/Foundation.h>


@interface Person :NSObject
{
    int age;
    NSString * name;
}
-(void)setAge:(int)age;
-(void)  sayHi;
@end

@implementation Person

-(void)setAge:(int)age{
    
    
    self.age=age;
}
-(void)sayHi{
    NSLog(@"im  jerry %d",age);
}


@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
    
        Person* p=[Person new];
       
        [p setAge:5];
        
        [p sayHi];
    }
    return 0;
}

self.age=age;這裡報錯了。
在java裡面,不是this.age=age嗎? oc裡面不行嗎?

阿神
阿神

闭关修行中......

全部回覆(4)
大家讲道理

在objective-c裡面,屬性雖然呼叫的時候像是簡單的賦值、取值操作,但其實它屬性的使用是方法的呼叫!

如:

@property(copy) NSMutableArray *array;
這個屬性加以後,用起來好像是變量,其實編譯器做的不只是加了一個變數:

  1. 新增了一個類別全域變數NSMutableArray * _array

  2. 加入了Get方法-(NSMutableArray *)array;

  3. 加入了Set方法-(void)setArray:(NSMutableArray *)array;

你的程式碼雖然沒有使用@property,指定属性,但是缺命名了一个符合属性的set方法的方法名,因此,使用时一样可以使用点语法

A

self.age=age;

B

[self setAge:age];

A、B兩者是等效的!編譯後,A會被轉換成B的形式,而B會進一步轉換成C函數呼叫的形式!

你在-setAge:方法里面调用-setAge:,导致无限递归。如果你有注意到崩溃时程序的栈,会发现栈里面都是-setAge:

想要避免這個問題,就直接使用類別變數賦值

_age = age;
Peter_Zhu

詳細解釋如樓上所述,簡而言之:
OC中的點語法,只是一種編譯器特性,本質仍然是方法呼叫。

小葫芦

這裡不要用點文法,然後就是你的成員變數前都統一加上底線來區分。 _age = age;

刘奇

寫在這裡@interface可以直接用不用加self.
直接age = age就行

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!