что значит установить метод в качестве объекта или даже установить аргумент метода в качестве объекта? - PullRequest
0 голосов
/ 28 февраля 2010

если у меня есть класс с именем

@interface myClass : NSObject {

int firstnum;
int secondnum;

}

//an a method that looks like this

-(myClass *) myMethod (myClass *) f;

@end

что возвращает этот метод? Я привык видеть что-то вроде (int) myMethod, зная, что он возвращает целое число. но когда он возвращает объект, такой как имя класса, что он может вернуть? если вы хотите плохо написать весь проект, над которым я работаю / учусь. (некоторые методы были усечены для упрощения вопроса. Но если вы хотите опубликовать статью, дайте мне знать. thnx

#import <Foundation/Foundation.h>

@interface Fraction : NSObject {
    int numerator;
    int denominator;
}

@property int numerator, denominator;

-(Fraction *)    add: (Fraction *) f;

@end

#import "Fraction.h"

@implementation Fraction
@synthesize numerator, denominator;

-(Fraction *) add: (Fraction *) f
{
    Fraction *result = [[Fraction alloc] init];

    // To add two fractions:
    // a/b + c/d = ((a*d) + (b*c)) / (b * d)

    result.numerator = numerator * f.denominator +  denominator * f.numerator;
    result.denominator = denominator * f.denominator;

    [result reduce];
    return result;
}

@end

Ответы [ 4 ]

1 голос
/ 28 февраля 2010

похоже, что вы работаете с копией книги Programming in Objective-C . В моей копии есть раздел в конце главы 13 (Основные возможности языка C), который называется «Как все работает». Я думаю, что вы ищете "Факт № 2: переменная объекта действительно указатель" . В вашем случае метод add возвращает указатель на экземпляр класса Fraction. (Звездочка * означает указатель, имя класса перед тем, как оно говорит, на что именно он указывает). Более подробно об указателях в начале этой главы, если вы не возражаете пропустить.

1 голос
/ 28 февраля 2010

Может возникнуть вопрос: что такое объект? Объект - это некоторая память, отведенная для хранения набора значений, и она связана с некоторыми методами взаимодействия с этими значениями. Вы очень редко хотите скопировать весь этот кусок памяти. Вместо этого вы передаете указатели в область памяти. Поэтому, когда вы передаете или возвращаете объект, вы фактически просто передаете указатель на местоположение объекта в памяти. Указатели - это просто целочисленные значения, так что это то, что возвращается.

В большинстве языков вам даже не нужно об этом думать, и на самом деле вам редко приходится делать это и в Objective-C. Просто помните, что MyClass* - это тип объектов класса MyClass, и они отвечают на все сообщения, объявленные в этом классе.

1 голос
/ 28 февраля 2010

Этот метод возвращает только то, к чему он предъявляет: указатель на экземпляр myClass. В случае вашего метода add: он возвращает указатель result, который вы создали.

Кстати, если у вас не включена сборка мусора, вы должны добавить [result autorelease] к этому методу перед возвратом; в противном случае ваша фракция результата будет всегда, и вы потеряете память.

Обучающее руководство по Objective-C CocoaDevCentral поможет с этим управлением памятью, а также может помочь вам освоить методы, возвращающие указатели на объекты.

0 голосов
/ 28 февраля 2010

Я собираюсь быть разборчивым и попробую переписать это немного

#import <Foundation/Foundation.h>

@interface Fraction : NSObject {
    // You should really use the recommended type instead of int
    NSInteger numerator;
    NSInteger denominator;
}

// Don't try and keep these on one line.
// Also, don't depend on default values for assign, retain, or copy when declaring
@property (assign, nonatomic) numerator;
@property (assign, nonatomic) denominator;

// declare the add: function which takes a pointer to a Fraction as a parameter
// and returns a pointer to the restulting fraction
- (Fraction *)add:(Fraction *)aFraction;

@end

#import "Fraction.h"

@implementation Fraction

// Again, don't try and keep these on one line.
// It's easier to visually note the number of synthesised properties matches
// the number of declared properties.
@synthesize numerator;
@synthesize denominator;

// Assume that there is an init function.

- (Fraction *)add:(Fraction *)aFraction
{
    Fraction *result = [[Fraction alloc] init];

    // To add two fractions:
    // a/b + c/d = ((a*d) + (b*c)) / (b * d)

    result.numerator = self.numerator * aFraction.denominator 
        +  denominator * aFraction.numerator;
    result.denominator = self.denominator * aFraction.denominator;

    [result reduce];  // I assume this is implemented.
    return result;    // Assuming garbage collection, otherwise use
                      // return [result autorelease];
}

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...