将方法设置为对象甚至将方法参数设置为对象意味着什么?

时间:2010-02-27 23:21:00

标签: objective-c

如果我有一个名为

的班级
@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 个答案:

答案 0 :(得分:1)

该方法返回它声称的内容:指向myClass实例的指针。对于add:方法,它会返回您创建的指针result

顺便说一句,除非您启用了垃圾收集,否则您应该在返回之前将[result autorelease]添加到该方法;否则你的结果分数将永远存在,你会泄漏记忆。

CocoaDevCentral's Objective-C Tutorial将有助于内存管理,也可以让您更方便地返回返回指针对象的方法。

答案 1 :(得分:1)

问题可能是:什么是对象?一个对象是为了保存一堆值而留出的一些内存,它与一些与这些值交互的方法相关联。你很少想复制那整块内存。相反,您将指针传递到内存位置。因此,当您传入或返回一个对象时,您实际上只是传递指向该对象在内存中的位置的指针。指针基本上只是整数值,所以这就是返回的内容。

在大多数语言中,您甚至不必考虑这一点,事实上您很少需要在Objective-C中进行此操作。请记住,MyClass*是类'MyClass'的对象类型,它们响应在该类上声明的所有消息。

答案 2 :(得分:1)

看起来你正在编写一本 Programming in Objective-C 一书。在我的副本中,第13章末尾(基础C语言特性)中有一节称为“如何工作”。我认为你正在寻找“事实#2:一个对象变量真的是一个指针”。在您的情况下, add 方法返回一个指向Fraction类实例的指针。 (星号,*,表示指针,类名称之前它指的是它指向的东西)如果你不介意跳过,那么本章前面有更多关于指针的内容。

答案 3 :(得分:0)

我会挑剔并尝试重写一下

#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