Потенциальные проблемы в коде Objective-C - PullRequest
1 голос
/ 23 февраля 2012

Вот небольшой кусочек кода.Опубликовано российской компанией Яндекс как часть их интервью.Каковы потенциальные проблемы здесь?Выглядит очень просто, должны быть скрыты проблемы, которые я не вижу.

Первый заголовок

//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;
}

Ответы [ 3 ]

6 голосов
/ 23 февраля 2012

В другом файле:

@implementation

реализация чего?необходимо указать.

В последнем файле:

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

Это приведет к сбою, локальная переменная Foo objA не инициализирована, было бы хорошо, чтобы она была установлена ​​на ноль, так как сообщения на нольхорошо в цели c, но это не так.

Здесь:

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

Этот метод выдаст предупреждение компиляции, так как этот метод не объявлен в интерфейсе, но он все равно вызовет метод.

Здесь:

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

Отсутствует @ для строки @ "number:"

Здесь:

objB = objC;

Вы только что слили objB,поскольку теперь нет действительной ссылки для освобождения предыдущего выделения.

[objA release];

Это никогда не было выделено!

[objB release];

[objC release];

Второй сбой, поскольку оба они ссылаются на один и тот же объект,и количество сохранений составляет только 1.

В первом файле также есть некоторые потенциальные проблемы, такие как объявление метода, который выглядит как метод получения, без объявления свойства для ивара, так же как и для метода установки, было бы лучшепросто объявите собственность.

1 голос
/ 23 февраля 2012
@interface Foo : NSObject
{
   NSString* str;
   static int i = 0;
}

Вы не можете определить static int i = 0; здесь. Имя типа не позволяет указывать класс хранения Foo.h

0 голосов
/ 23 февраля 2012

Кроме того, сеттер должен освободить предыдущую строку и сохранить новую.

- (void) setStr:(NSString*)theStr
{
  if(str) {
    [str release];
  }
  str = [theStr retain];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...