【问题标题】:Invalid Summary in NSString assignmentNSString 分配中的摘要无效
【发布时间】:2011-08-22 22:39:38
【问题描述】:

我正在尝试实现一个简单的计算器,我必须在其中更新 NSString 类型的变量中的当前操作(+、-、* 等)。当前操作作为参数接收到模型。

 -(double)doOperation:(NSString *)operation withOperand:(double)operand
 {
     if (!currentOperation)
     {
         anOperand = operand;
     }   

     currentOperation = operation; //Invalid Summary in currentOperation; but + in operation
 }

这可能有什么问题?如果 NSString 不允许直接分配指针,那么替代方法是什么?

编辑

  1. 更准确地说,在 iO 中使用 = 号分配 NSString 是否合法?
  2. 如果没有,该怎么做。

注意:currentOperation 是Controller 类中的私有变量,而 operation 是方法的参数。

这是完整的代码

@interface CalculatorBrain : NSObject {
    double anOperand;
    NSString * currentOperaion;
}

- (double) doOperation: (NSString *) operation 
           withOperand: (double) operand;

@end



@implementation CalculatorBrain


- (double) doOperation: (NSString *) operation 
           withOperand: (double) operand
{
    if (!currentOperaion)
    {
        anOperand = operand;
    }
    else if([currentOperaion isEqual: @"+"])
    {
        anOperand += operand;
    }
    else if([currentOperaion isEqual: @"-"])
    {
        anOperand -= operand;
    }
    else if([currentOperaion isEqual: @"*"])
    {
        anOperand *= operand;
    }
    else if([currentOperaion isEqual: @"/"])
    {
        anOperand /= operand;
    }

    currentOperaion = operation; //This is where the statement doesn't work as expected

    if ([currentOperaion isEqual: @"="])
    {
        currentOperaion = nil;
    }

    return anOperand;
}

@end

【问题讨论】:

  • 您必须更具体地了解“问题”是什么。除了明显的拼写错误之外,是否意味着存在编译时错误或运行时错误?该方法还应该返回一个double,你没有这样做......
  • 您的问题不明白。请详细说明您的问题。
  • 请查看编辑后的问题描述。
  • = 分配NSString 是完全合法的。 currentOperation 是如何声明的?
  • 要获得有用的答案,您应该发布实际显示问题的小样本。否则,这主要是猜测。

标签: objective-c ios


【解决方案1】:

更准确地说,在 iO 中使用 = 号分配 NSString 是否合法?

是的。

这可能有什么问题?

您没有获得该字符串的所有权,如果您想稍后使用该实例会导致问题,请参阅memory management guide

您可以使用 retain 获取对象的所有权。
请记住,一个对象可能有多个所有者。获得一个对象的所有权是你说你需要它保持活力的方式。

您可以-retain 字符串,或-copy 它以避免外部代码的突变,例如:

// in -doOperation::
[currentOperation release];
currentOperation = [operation copy]; // copy if operation might be mutable

// relinquish ownership:
- (void)dealloc {
    [currentOperation release];
    [super dealloc];
}

还可以查看declared properties

【讨论】:

    【解决方案2】:

    如果 currentOperation 被声明为 NSString,试试

    currentOperation = [NSString stringWithString:operand];
    

    【讨论】:

    • 将自动释放的字符串分配给成员变量 - 一旦自动释放池耗尽,该变量就是无效引用。
    • 他是否试图在方法范围之外使用它?我还没有看到那个代码。
    • 该变量是一个私有变量,类型为 (NSString *),没有写 alloc 或 init。它只是声明的。另一个信息是 currentOperation 在单个实例方法中使用。
    • @Saravanan:发布一个更完整的样本然后重现问题怎么样? @Terry:好点。尽管如此,将自动释放的字符串实例分配给成员变量肯定看起来不对。
    猜你喜欢
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多