2012-02-23 57 views
1

這是一小段代碼。作爲他們採訪的一部分,由俄羅斯公司Yandex發佈。這裏有什麼潛在的問題?它看起來很簡單,應該是隱藏的問題,我看不到。Objective-C代碼中的潛在問題

第一頭

//Foo.h 
#import <Cocoa/Cocoa.h> 
@interface Foo : NSObject 
{ 
    NSString* str; 
    static int i = 0; 
} 

- (NSString*) str; 
@end 

另一個文件

//Foo.m 
#import "Foo.h" 
@implementation 
- (id) init 
{ 
    return [self initWithStr:"number:" someInt:6]; 
} 

- (id) initWithStr:(NSString*)theStr someInt:(int)value 
{ 
    self = [super init]; 
    str = [NSString stringWithFormat:@"%@%d", theStr, value]; 
    return self; 
} 

- (NSString*) str 
{ 
    return str; 
} 

- (void) setStr:(NSString*)theStr 
{ 
    str = theStr; 
} 
@end 

而最後文件

//main.m 
#import <Cocoa/Cocoa.h> 
#import "Foo.h" 
int main(int argc, char *argv[]) 
{ 
    Foo objA; 
    NSLog([objA str]); 
    [objA setStr:@"hello world!"]; 
    NSLog([objA str]); 

    Foo* objB = [[Foo alloc] init]; 
    Foo* objC = [[Foo alloc] initWithStr:@"My magic number:" value:265]; 
    objB = objC; 

    NSLog([objB str]); 

    [objA release]; 
    [objB release]; 
    [objC release]; 

    return 0; 
} 
+0

字符串對象不被複制。另外@implementation缺少Foo。 – 2012-02-23 15:04:22

+0

這些文件是錯誤和其他潛在問題的寶庫。聲明和'@ interface'初始化靜態,不檢查的'超級init'結果,釋放'objB'兩次,不釋放'objC'。可能還有更多。 – dasblinkenlight 2012-02-23 15:09:57

+2

最大的潛在問題是,他們將採訪的人,甚至僱人,誰使用計算器來解決這個問題。 – 2012-02-23 19:45:21

回答

6

在另一個文件中:

@implementation 

執行什麼?必須指定。

在最後一個文件:

Foo objA; 
    NSLog([objA str]); 
    [objA setStr:@"hello world!"]; 
    NSLog([objA str]); 

這會崩潰,局部變量富objA沒有初始化,這將是罰款它被設爲零,因爲消息的零在客觀C OK,但它是不。

這裏:

[objA setStr:@"hello world!"]; 

這種方法會給出一個編譯警告,因爲該方法沒有在接口中聲明,但它仍然會調用該方法。

這裏:

- (id) init 
{ 
    return [self initWithStr:"number:" someInt:6]; 
} 

缺少@的字符串@ 「號:」

這裏:

objB = objC; 

您剛剛泄露objB,因爲現在還沒有有效的參考釋放先前的分配。

[objA release]; 

這是從來沒有分配!

[objB release]; 

[objC release]; 

第二個會崩潰,因爲它們都指代相同的對象,並且保留計數是隻1

第一個文件也具有諸如聲明似乎是一個方法的一些潛在問題一個沒有爲伊娃公佈財產的吸氣劑,與二傳手一樣,最好只宣佈一個財產。

+0

你不能聲明美孚objA(堆棧上)應至少美孚* objA – Boklucius 2012-04-28 09:26:00

1
@interface Foo : NSObject 
{ 
    NSString* str; 
    static int i = 0; 
} 

您不能在此處定義static int i = 0;。類型名稱不允許指定存儲類別Foo.h

+0

它只是除了@OscarGomez答案 – beryllium 2012-02-23 15:15:26

0

此外,setter需要釋放前一個字符串並保留新字符串。

- (void) setStr:(NSString*)theStr 
{ 
    if(str) { 
    [str release]; 
    } 
    str = [theStr retain]; 
}