2012-02-23 15 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がありません。 –

+0

これらのファイルは、エラーやその他の潜在的な問題の宝庫です。'super interface'の結果をチェックせず、' objB'を2回リリースし、 'objC'を解放しないで、' @ interface'で静的宣言と初期化を行います。多分もっと多くのものがあります。 – dasblinkenlight

+2

最大の潜在的な問題は、誰かにインタビューしたり、この問題を解決するためにstackoverflowを使用した人を雇うことさえあるということです。 –

答えて

6

@implementation 

何の実装?指定する必要があります。最後のファイルで

:これはクラッシュします

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

、ローカル変数foo OBJAが初期化されていない、nilにメッセージを客観CでOKですが、それはあるので、それは、nilに設定された罰金だろうない。ここで

:その方法は、インタフェースで宣言されていないので、この方法は、コンパイルの警告を与えるだろうが、それはまだメソッドを呼び出します

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

。ここで

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

文字列のため、@を欠落@ "番号:" ここ

objB = objC; 

今解放するために有効な参照がないのであなただけの、objBを漏洩しました以前の割り当て。

[objA release]; 

これは決して割り当てられませんでした。

[objB release]; 

[objC release]; 

両者が同じオブジェクトを参照するので、二つ目がクラッシュし、保持カウントが1だけ

最初のファイルはまた、のように見える方法を宣言するなど、いくつかの潜在的な問題を持っています設定ツールと同じ、ivarのプロパティを宣言していないゲッターは、単にプロパティを宣言する方が良いでしょう。

+0

あなたはFoo objAを宣言できません(スタック上にあります)少なくともFoo * objA – Boklucius

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

static int i = 0;をここで定義することはできません。タイプ名はストレージクラスを指定できませんFoo.h

+0

である必要があります。これは@OscarGomezの答えに追加されたものです – beryllium

0

また、設定者は前の文字列を解放して新しい文字列を保持する必要があります。

- (void) setStr:(NSString*)theStr 
{ 
    if(str) { 
    [str release]; 
    } 
    str = [theStr retain]; 
} 
関連する問題