я пытаюсь понять инициализаторы в obj-c и не могу - PullRequest
0 голосов
/ 21 ноября 2011

Я пытаюсь понять, как работает простая функция инициализации, и я не знаю, где я допустил ошибку.Может ли кто-нибудь помочь?

Rectangle.h

@interface Rectangle : NSObject
{
    int width;
    int height;
}
-(id)initObject;
@end

Rectangle.m

@implementation Rectangle

-(id)initObject{
    if (self = [super init]) {
        height = 5;
        width = 7;
    }
    return self;
}    

@end

И в ViewController.hi импортируйте Rectangle.h, объявите объект * rect и.mi execute (? run?) initObject.

ViewController.h

#import <UIKit/UIKit.h>
#import "Rectangle.h"
@interface ViewController : UIViewController
{
    Rectangle *rect;
}
@end

ViewController.m

-(void)viewDidLoad
{
    rect = [[Rectangle alloc] initObject];
    NSLog(@"%@", rect);

    [super viewDidLoad];

}

initObject вернуть мне:

 2011-11-21 09:43:02.625 initializers[43693:f803] <Rectangle: 0x6ab1660>

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Единственная проблема с вашим кодом, которую я вижу, это то, что вы назвали ваш инициализатор -initObject без уважительной причины.Он вообще не принимает никаких параметров, поэтому вам действительно нужно просто назвать его -init, как и любой другой инициализатор без параметров в системе.

Что касается вывода журнала, я думаю, что ваша путаница заключается в том, что<Rectangle: 0x6ab1660>.Это совершенно нормально.Реализация по умолчанию -description (метод, который возвращает этот вывод) - это имя класса объекта, за которым следует адрес объекта.Другими словами, -[NSObject description], вероятно, будет реализовано что-то вроде следующего:

- (NSString *)description {
    return [NSString stringWithFormat:@"<%@: %p>",
                                      NSStringFromClass([self class]),
                                      self];
}

Это означает, что переменные экземпляра вашего объекта не будут напечатаны.Некоторые встроенные классы печатают свои переменные экземпляра при регистрации, но это было реализовано специально для этого класса и не является универсальным механизмом.Если вы хотите проверить правильность вашего объекта Rectangle, вы можете реализовать -description следующим образом:

- (NSString *)description {
    return [NSString stringWithFormat:@"<%@: %p width=%d, height=%d>",
                                      NSStringFromClass([self class]),
                                      self,
                                      width,
                                      height];
}
0 голосов
/ 21 ноября 2011

Нет ошибок! Поскольку в вашем классе Rectangle нет метода description, вызов NSLog(@"%@", rect); вернет класс объекта, за которым следует его адрес в памяти.

Если вы хотите напечатать width и height прямоугольника, вы можете использовать что-то вроде:

в Rectangle.h

@interface Rectangle : NSObject 
{
    int width;
    int height;
}
-(id)initObject;

@property int width, height;
@end

в Rectangle.m

@implementation Rectangle

@synthesize width, height;

-(id)initObject{
    if (self = [super init]) {
        height = 5;
        width = 7;
    }
    return self;
}    

@end

, а затем позвоните

NSLog(@"width=%d, height=%d", [rect width], [rect height]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...